spring学习(二十五)--@Primary、@Lazy、@DependsOn

 @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应该先被初始化。

个人理解,如有错误,欢迎指正!
原文地址:https://www.cnblogs.com/gllegolas/p/11812978.html