Framework 7 新增的 BeanRegistrar 怎么用代码批量注册 Bean?Spec 能设哪些选项,同名冲突时报什么,@ConditionalOnMissingBean 能不能看到它注册的 Bean?这篇在 Spring Boot 4.0.8 上逐项运行。
构造 Shard(0)
构造 Shard(1)
构造 Shard(2)
容器里 Shard 类型的 Bean 名:[shard0, shard1, shard2]
getBean("shard0") 两次取到 Shard(0),同一个对象
getBean("shard1") 两次取到 Shard(1),同一个对象
getBean("shard2") 两次取到 Shard(2),同一个对象
按类型取 getBean(Shard.class) 异常 NoUniqueBeanDefinitionException:No qualifying bean of type 'demo.Shard' available: expected single matching bean but found 3: shard0,shard1,shard2读 Environment 里的 shards=3,循环注册三个 Bean。
构造 Shard(30)
容器里 Shard 类型的 Bean 名:[sEager, sLazy, sProto]
getBean("sEager") 两次取到 Shard(30),同一个对象
构造 Shard(20)
getBean("sLazy") 两次取到 Shard(20),同一个对象
构造 Shard(10)
构造 Shard(10)
getBean("sProto") 两次取到 Shard(10),不同对象
按类型取 getBean(Shard.class) 异常 NoUniqueBeanDefinitionException:No qualifying bean of type 'demo.Shard' available: expected single matching bean but found 3: sProto,sLazy,sEager默认单例启动时构造,lazyInit 第一次取才构造,prototype 每次新建。
构造 Shard(1)
构造 Shard(2)
容器里 Shard 类型的 Bean 名:[a, b]
getBean("a") 两次取到 Shard(1),同一个对象
getBean("b") 两次取到 Shard(2),同一个对象
按类型取 getBean(Shard.class) = Shard(2)
-- 换成 fallback 的注册方式
构造 Shard(1)
构造 Shard(2)
容器里 Shard 类型的 Bean 名:[x, y]
getBean("x") 两次取到 Shard(1),同一个对象
getBean("y") 两次取到 Shard(2),同一个对象
按类型取 getBean(Shard.class) = Shard(2)两种标记都能在多个候选里选出确定的一个。
registerBean(Auto.class) 返回的 Bean 名:demo.Auto#0
构造 Auto,注入的 Dep=Dep
容器里 Shard 类型的 Bean 名:[]
按类型取 getBean(Shard.class) 异常 NoSuchBeanDefinitionException:No qualifying bean of type 'demo.Shard' available不给名字时名字自动生成,构造器参数自动注入。
容器里 Shard 类型的 Bean 名:[]
Store 类型的 Bean:LocalStore
按类型取 getBean(Shard.class) 异常 NoSuchBeanDefinitionException:No qualifying bean of type 'demo.Shard' available按 profile 注册 LocalStore。
容器里 Shard 类型的 Bean 名:[]
Store 类型的 Bean:CloudStore
按类型取 getBean(Shard.class) 异常 NoSuchBeanDefinitionException:No qualifying bean of type 'demo.Shard' available同样代码注册 CloudStore。
启动失败 BeanDefinitionOverrideException:Invalid bean definition with name 'dup' defined in null: Cannot register bean definition […class=demo.Shard…] for bean 'dup' since there is already […] bound.
BeanDefinitionOverrideException,信息里是 defined in null。
启动失败 BeanDefinitionOverrideException:Invalid bean definition with name 'same' defined in null: Cannot register bean definition […class=demo.Shard…] for bean 'same' since there is already […] bound.
同样启动失败。
构造 Shard(-1)
构造 Shard(99)
容器里 Shard 类型的 Bean 名:[fallbackShard, shardR]
getBean("fallbackShard") 两次取到 Shard(-1),同一个对象
getBean("shardR") 两次取到 Shard(99),同一个对象
按类型取 getBean(Shard.class) 异常 NoUniqueBeanDefinitionException:No qualifying bean of type 'demo.Shard' available: expected single matching bean but found 2: fallbackShard,shardR没有把 BeanRegistrar 注册的 Bean 当成已存在。
构造 Shard(1)
容器里 Shard 类型的 Bean 名:[same]
getBean("same") 两次取到 Shard(1),同一个对象
按类型取 getBean(Shard.class) = Shard(1)打开 allow-bean-definition-overriding 后不再报错,留下的是 BeanRegistrar 注册的那个。