(二)构造方法注入(1)违背单一职责原则
类和依赖容器强耦合,不能在容器外使用
(2)出现两个相同的类型bean
方法二:Lombok 注解@RequiredArgsConstructor
@RestController
@RequiredArgsConstructor //Lombok提供
public class AppointmentNumberConfigurationController {
final AppointmentNumberConfigurationService numberConfigurationService; //必须声明的变量为final
}
(三)set 方法注入
二、按名注入
如果一定要使用属性注入, 可以使用 @Resource 代替 @Autowired 注解
//方式一
@Autowired
@Qualifier("user1") //指定一个bean的名称
private IUser user;
//方式二
@Resource("user2")
private IUser user;
@Resource装配顺序:
① 指定name+type,则从Spring上下文找到唯一匹配的bean进行装配,找不到则抛异常。
② 指定name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常。
③ 指定type,则从上下文中找到类似匹配的唯一bean进行装配,【找不到/找到多个】抛出异常。
④ 不指定name和type,先byName;没有匹配,则回退为一个byType
装载流程
(1)类上未加注解
public class UserService {
@Autowired
private IUser user;
public void test() {
user.say();
}
}
(1)装载失败
类初始化:静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> @Autowired
下面类的初始化失败
@Autowired
private Person person;
private String company;
public UserServiceImpl(){
this.company = person.getCompany(); //注入的person为null
}
(2)注入Filter或Listener
springmvc的启动是在DisptachServlet里面做的,而它是在listener和filter之后执行。如果我们想在listener和filter里面@Autowired某个bean,肯定是不行的,因为filter初始化的时候,此时bean还没有初始化,无法自动装配。
| @Autowired | @Resource |
|---|---|
| byType,可能重名 | byName |
| Spring 内置 | javax.annotation.Resource(JSR-250) |
| 只包含一个参数:required | |
| 构造器、方法、参数、成员变量和注解 | 类、成员变量和方法 |
知乎-@Autowired和@Resource的区别是什么?
为什么Spring和IDEA都不推荐使用 @Autowired



