@ConditionalOnMissingBean jym 是这样理解吗?

344 阅读2分钟

问题1:AB两个 Bean 均继承于 Z , 若声明Bean A、Bean B时,均使用 @ConditionalOnMissingBean 条件注解, 且注解如下,问最终在Spring容器中,是否存在 Bean A,Bean B ?

解释: @ConditionalOnMissingBean:作用是它是修饰bean的一个注解,主要实现的是, 当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个, 当你注册多个相同的bean时,会出现异常,以此来告诉开发人员

结论: 对于自定义的配置类,我们应该加@ConditionalOnMissingBean注解,以避免多个配置同时注入的风险,IOC中有且只有一个Bean(A/B),取决于两者谁先被加载

扩展: @ConditionalOnBean:当给定的在Bean存在时,则实例化当前Bean,这个Bean可能由于某种原因而没有注册到ioc里,这时@ConditionalOnBean可以让当前Bean也不进行注册

@ConditionalOnMissingBean: 当给定的在bean不存在时,则实例化当前Bean,感觉这个是在多态环境下使用,当一个接口有多个实现类时,如果只希望它有一个实现类,那就在各个实现类上加上这个注解

@ConditionalOnClass: 当给定的类名在类路径上存在,则实例化当前Bean

@ConditionalOnMissingClass:当给定的类名在类路径上不存在,则实例化当前Bean

问题2:A/B 怎么决定谁先被加载? 解释: Spring加载Bean的顺序我们并不能透明的知道,是可以通过下列几种方式,来决定A/B的加载顺序 1.使用构造方式 2.使用注解@DependOn 扩展: Bean的加载顺序不受@Order或Ordered接口的影响 3.执行顺序:constructor > @Autowired > @PostConstruct