目录
2.构造方法注入 (Constructor Injection)
[3.Setter 注入 (Setter Injection)](#3.Setter 注入 (Setter Injection))
[6.常⻅注解有哪些? 分别是什么作⽤?](#6.常⻅注解有哪些? 分别是什么作⽤?)
[7.@Autowired 和 @Resource 区别](#7.@Autowired 和 @Resource 区别)
1.DI是什么
DI是依赖注入。依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象关于依赖注入。
2.依赖注入的三种方式
Spring也给我们提供了三种方式:
1.属性注入 (Field Injection)
java
@Controller
public class UserController {
// 前提:把UserService类交给spring管理了
// 注入方法1: 属性注入
@Autowired
private UserService userService;
public void sayHi() {
System.out.println("hi, UserController...");
userService.sayHi();
}
}
2.构造方法注入 (Constructor Injection)
java
@Controller
public class UserController {
// 注入方法2:构造方法注入
private UserService userService;
@Autowired
public UserController2(UserService userService) {
this.userService = userService;
}
public void sayHi() {
System.out.println("hi, UserController...");
userService.sayHi();
}
}
3.Setter 注入 (Setter Injection)
java
@Controller
public class UserController {
// 注入方法3: Setter方法注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public void sayHi() {
System.out.println("hi, UserController...");
userService.sayHi();
}
}
3.依赖注入使用的注解
依赖注入主要使用的注解是 @Autowired。但当同⼀类型存在多个bean,使⽤@Autowired会存在问题。
其他解决(非唯一的 Bean对象)的注解包括:
1)@Primary
(当存在多个同类型Bean时,设置默认注入的Bean)
java
@Primary //指定该bean为默认bean的实现
@Bean("u1")
public User user1(){
User user = new User();
user.setName("zhangsan");
return user;
}
2)@Qualifier
(指定Bean名称,需与@Autowired配合使用)
用法:@Qualifier("user2") // 指定bean名称
java
@Qualifier("user2") //指定bean名称
@Autowired
private User user;
3)@Resource
(按照bean的名称进行注入)
通过name属性指定要注入的bean的名称。
java
@Resource(name = "user2")
private User user;
4.Autowired装配顺序

5.三种注入的优缺点
1)属性注入
优点:简单,方便
缺点:只用于IoC容器;不能注入一个final修饰的属性
2)构造函数注入
优点:能注入一个final修饰的属性;注入的对象一旦设定就不会被改变。;能保证依赖在对象构建时就完全初始化,更加安全;通用性好
缺点:注⼊多个对象时, 代码会⽐较繁琐
3)setting注入
优点:灵活,允许在对象实例化后重新配置或注入依赖
缺点:不能注入一个final修饰的属性;因为 Setter 方法可以被多次调用,所以注入的对象有被修改的风险,可能导致状态不稳定。
6.常⻅注解有哪些? 分别是什么作⽤?
web url映射: @RequestMapping
参数接收和接⼝响应: @RequestParam, @RequestBody, @ResponseBody
bean的存储: @Controller, @Service, @Repository, @Component, @Configuration,@Bean
bean的获取: @Autowired, @Qualifier, @Resource
7.@Autowired 和 @Resource 区别
1)@Autowired 是Spring的"亲儿子",默认根据类型匹配。
2)@Resource 是Java标准注解,默认根据名字匹配。在非Spring环境中也能使用,通用性更好。
| 特性 | @Autowired | @Resource |
|---|---|---|
| 默认注入方式 | 按类型 (byType) | 按名称 (byName) |
| 名称指定 | 需结合 @Qualifier 注解 |
直接使用 name 属性 (如 @Resource(name="beanName")) |