随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、自动装配

Spring 利用依赖注入(DI),完成对 IOC 容器中各个组件的依赖关系赋值。

二、@Autowired 自动注入

1、按照类型

默认优先按照类型去容器中找对应的组件:`applicationContext.getBean(BookDao.class);``

@Service
public class BookService {

    //到容器中按类型进行查找对应的组件
    @Autowired
    private BookDao bookDao;

}

2、多个组件,再按 id 找

如果在容器中找到多个相同类型的组件,再将属性的名称作为组件的 id 去容器中查找:applicationContext.getBean("bookDao");

@Service
public class BookService {

    //到容器中按类型进行查找对应的组件,如果有多个组件,按属性的id去查找
    @Autowired
    private BookDao bookDao;

}

3、指定要装配的组件

可以使用 @Qualifier(name) 注解指定要装配的组件 id,而不再使用属性名作为 id;

@Service
public class BookService {
     
     @Qualifier("bookDao2")    //指定要装配的组件id,不再使用属性名
     @Autowired
     private BookDao bookDao;
     
     public void print() {
         System.out.println(bookDao);
     }
}

4、是否必须装配

Spring 自动装配默认一定要将属性赋值好,没有就会报错。

可以使用 @Autowired(required=false) 来指定是否必须装配到组件。

required = false,表示不用必须装配,如果找到组件就装配,没有找到就不进行装配,不会报错。

@Service
public class BookService {
     
     @Qualifier("bookDao")
     @Autowired(required=false)   //找到则装配,没找到不装配
     private BookDao bookDao;
     
     public void print() {
         System.out.println(bookDao);
     }
}

5、使用首选 Bean

@Primary 让 Spring 进行自动装配的时候,默认使用首选的 bean 来装配。

默认装配首选的 bean,也可以继续使用 @Qualifier 指定需要装配的 bean 的名字。

组件一:

组件二:

自动装配:

测试:

@Autowired 是通过 AutoWiredAnnotationBeanPostProcessor:解析完成自动装配功能

三、其他装配

Spring 还支持使用 @Resource(JSR250) 和 @Inject(JSR330) 【Java 规范的注解】

@Resource:

  • Java 规范,可以和 @Autowired 一样实现自动装配。默认是按照组件名称进行装配的。

  • @Resource(name=" ") 也可以使用 name 属性来指定组件。

  • 不能支持 @Primary、不支持 @Autowired(required=false)

@Service
public class BookService {
     
     @Resource(name="bookDao")
     private BookDao bookDao;
     
     public void print() {
         System.out.println(bookDao);
     }
}

@Inject:

  • 需要导入 javax.inject 的包,和 @Autowired 功能一样;

  • 没有 required=false 的功能

@Service
public class BookService {
     
     @Inject
     private BookDao bookDao;
     
     public void print() {
         System.out.println(bookDao);
     }
}

三者区别:

@Autowired 是 Sprig 定义的,@Resource 、@Inject 都是 java 规范;

四、@Autowired 其他用法

@Autowired 可以使用的位置:

@Autowired 可以作用在构造器、方法、参数、属性等位置,获取都是从容器中获取参数组件的值。

1、标注在方法位置

常用情况:@Bean 与 方法参数标注时:参数都是从容器中获取;默认不写 @Autowired,都能自动装配;

示例:

    //标注在方法,Spring 容器创建当前对象,就会调用方法,完成赋值 setter 方法
    //方法使用的参数,自定义类型的值就从 IOC 容器中获取
    @Autowired
    public void setCar(Car car) {
        this.car = car;
    }

2、标注在构造器位置

默认加在 ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作;

    //构造器要用的组件,都是从容器中获取
    @Autowired
    public Boss(Car car) {
        super();
        this.car = car;
    }

    //构造器要用的组件,都是从容器中获取
    public Boss(@Autowired Car car) {
        super();
        this.car = car;
    }

    //构造器要用的组件,都是从容器中获取,只有一个有参构造器,@Autowired还可以省略
    public Boss(Car car) {
        super();
        this.car = car;
    }

如果组件只有一个构造器,这个有参构造器的 @Autowired 可以省略,参数位置的组件还是自动可以从容器中获取。

3、标注在参数位置

示例:

  public void setCar(@Autowired Car car) {
      this.car = car;
  }

示例 2:

    //@Bean 标注的方法创建对象的时候,方法参数的值从容器中获取
     @Bean
     public Color color(@Autowired Car car) {
         Color color = new Color();
         color.setCar(car);
         return color;
     }
posted on   格物致知_Tony  阅读(108)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
历史上的今天:
2020-11-14 Java 关键字:final
2020-11-14 Java 面向对象(十二)类的成员 之 代码块
2020-11-14 Java 关键字:static
点击右上角即可分享
微信分享提示

目录导航