• Spring的注解总结


    1.@Component  @Configuration

        @Component是一个元注解,可以注解其他类注解。@Configuration注解里面也是被@Component注解修饰的。

       bean设置的类属性不同。

    • 如果是 @Configuration 并且属性 proxyBeanMethods 为 true(默认的),则为 full
    • 如果是 @Component @ComponentScan @Import @ImportSource 则为 lite,被@Configuration修饰,但是属性proxyBeanMethods = false

    full模式使用特性:

    full模式下的配置类会被CGLIB代理生成代理类取代原始类型(在容器中)
    full模式下的@Bean方法不能是private和final
    单例scope下不同@Bean方法可以互相引用,达到单实例的语义
     

    lite模式使用特性:

    lite模式下的配置类不生成代理,原始类型进入容器
    lite模式下的@Bean方法可以是private和final
    单例scope下不同@Bean方法引用时无法做到单例

    返回bean实例不同。

    • @Configuration 注解修饰的类,并且该注解中的 proxyBeanMethods 属性的值为 true(默认的),则会使用cglib动态代理,为这个 bean 创建一个代理类,该代理类会拦截所有被 @Bean 修饰的方法,在拦截的方法逻辑中,会从容器中返回所需要的单例对象。
    • @Component 注解修饰的类,则不会为这个 bean 创建一个代理类。 那么我们就会直接执行用户的方法,所以每次都会返回一个新的对象

    @Bean注解在@Configuration类中声明,称之为“full”模式;当@Bean注解和@Component注解组合使用时,称之为“lite”模式;

    如果只是把@Bean注解用在方法上,并且各个@Bean注解的方法之间没有调用,上述两种模式达到的效果基本相同,都可以把@Bean注解方法返回的对象作为bean注册到容器中。

    如果各个@Bean注解的方法之间有相互调用,那么两种模式就会有很大的区别-与full模式下的@Configuration不同,lite模式下 @Bean方法互相调用无法声明Bean之间的依赖关系。

    2.@Autowire @Resource

    1、@Autowire是Spring提供的,@Resource是J2EE提供的;

    2、@Autowire 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。

    想使用名称装配可以结合@Qualifier注解进行使用,如下:
    @Autowired() @Qualifier(“baseDao”)
    private BaseDao baseDao;

    3、@Resource 默认按名称装配,当找不到与名称匹配的 bean 时才按照类型进行装配。名称可以通过 name 属性指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名,当注解写在 setter 方法上时,默认取属性名进行装配。

    推荐使用:@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。

    3.@Qualifier @Primary

    @Primary优先注入该注解的标注的bean
    @Qualifier确定注入该注解标定的bean

     @Qualifier 该注解的意思是直接注入该注解标定的bean,而非选择。

    1. public interface IA {
    2. String getName();
    3. }
    4. @Component
    5. public class A1 implements IA {
    6. public String getName() {
    7. return "A1";
    8. }
    9. }
    10. @Component
    11. public class A2 implements IA {
    12. public String getName() {
    13. return "A2";
    14. }
    15. }
    16. @Component
    17. public class A3 implements IA {
    18. public String getName() {
    19. return "A3";
    20. }
    21. }
    22. public class ClassRoom {
    23. @Autowired
    24. @Qualifier("a1")//不加这个就会报错:NoUniqueBeanDefinitionException
    25. public IA iA;
    26. }

    @Qualifier是在使用注入的时候,使用方明确指出使用哪个;@Primary更像是提供方告诉你优先使用哪个;

    1. public interface IA {
    2. String getName();
    3. }
    4. @Component
    5. @Primary //不知道加载哪个的时候,默认加载A1的
    6. public class A1 implements IA {
    7. public String getName() {
    8. return "A1";
    9. }
    10. }
    11. @Component
    12. public class A2 implements IA {
    13. public String getName() {
    14. return "A2";
    15. }
    16. }
    17. @Component
    18. public class A3 implements IA {
    19. public String getName() {
    20. return "A3";
    21. }
    22. }
    23. public class MySort {
    24. @Autowired
    25. public IA iA;
    26. }

    值得注意的是,@Qualifier注解配合@Autowired注解一起使用,@Primary注解配合@Bean或者@Component注解一起使用,如果 @Qualifier 和 @Primary 注释都存在,那么 @Qualifier 注释将具有优先权,基本上,@Primary 是定义了默认值,而 @Qualifier 则非常具体。

  • 相关阅读:
    汽车零部件制造迎来智能化升级,3D视觉定位系统助力无人化生产线建设
    工业智能网关BL110应用之七十三: 实现西门子S7-300 PLC 接入亚马逊云平台
    分组函数之rollup、cube函数、grouping sets函数
    第三章:人工智能深度学习教程-基础神经网络(第一节-ANN 和 BNN 的区别)
    植物单细胞转录组 | 杨树初生生长和次生生长中形成层细胞分化的分子轨迹
    C++ primer 5th笔记
    乘性散斑噪声理论及其仿真实例分析
    学习MySQL-第四章
    根据int颜色值获取带透明度的颜色
    面试系列 - 序列化和反序列化详解
  • 原文地址:https://blog.csdn.net/tianruozhaomi/article/details/125887482