@Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。
有两个Ball和BallBall都实现了GrilsInterface接口,在PrimaryAnnotion类中通过@Autowired注入GrilsInterface接口的时候,必须在Ball和BallBall其中的一个通过@Primary注解,这样在@Autowired注入GrilsInterface接口的时候,能找到对应的实现类。
例子:
package springAnnotions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import interfaces.GirlsInterface; @Component public class PrimaryAnnotion { @Autowired private GirlsInterface girlsInterface; } @Component @Primary class Ball implements GirlsInterface { @Override public String getGirlsName() { return "hello, I am ball"; } } @Component class BallBall implements GirlsInterface { @Override public String getGirlsName() { return "hello, I am ballball"; } }
@Lazy(true)
@Lazy用于指定该Bean是否取消预初始化,用于注解类,延迟初始化。被@Lazy注释的类在spring容器初始化的时候不会初始化成bean,当有其他类注入该bean的时候,才会去初始化被@Lazy注释的类。
@Lazy有true和false两个入参。true表示生效,false表示不生效。
@DependsOn
@DependsOn注解用来控制bean初始化顺序。
可能有些场景中,bean A 间接依赖 bean B。如Bean B应该需要更新一些全局缓存,可能通过单例模式实现且没有在spring容器注册,bean A需要使用该缓存;因此,如果bean B没有准备好,bean A无法访问。
另一个场景中,bean A是事件发布者(或JMS发布者),bean B (或一些) 负责监听这些事件,典型的如观察者模式。我们不想B 错过任何事件,那么B需要首先被初始化。
简言之,有很多场景需要bean B应该被先于bean A被初始化,从而避免各种负面影响。我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。