zoukankan      html  css  js  c++  java
  • 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应该先被初始化。

    个人理解,如有错误,欢迎指正!
  • 相关阅读:
    OCP-1Z0-053-V12.02-40题
    OCP-1Z0-053-V12.02-255题
    OCP-1Z0-053-V12.02-407题
    OCP-1Z0-053-V12.02-298题
    OCP-1Z0-053-V12.02-38题
    OCP-1Z0-053-V12.02-274题
    OCP-1Z0-053-V12.02-159题
    OCP-1Z0-053-V12.02-406题
    OCP-1Z0-053-V12.02-369题
    OCP-1Z0-053-V12.02-610题
  • 原文地址:https://www.cnblogs.com/gllegolas/p/11812978.html
Copyright © 2011-2022 走看看