提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
因为现在spring在属性注入的时候会提示黄色警告,这个时候如果替换成构造注入就解决问题了,这是为什么呢,这就要考虑他们之间的优势了。
提示:以下是本篇文章正文内容,下面案例可供参考
一、属性注入
class A1 {
@Autowired
private ServiceX service;
...
}
优势:
1:灵活
2:启动快(避免因复杂的依赖实例化所造成的性能问题)
3:写法直观,便于理解
缺点:
1:在构造方法中 容易出现null的情况,因为:先是UserServiceImpl类利用构造方法得到实例化对象,再进行属性填充(属性注入)。如果这两个相反了就会造成null的异常错误
2:通过@Autowired 注入, 又因为是 ByType 注入, 因此有可能会出现两个相同的类型bean,所以如果不用构造注入就使用 @Resource 跟 @Qualifier注解注入
//2. 基于属性注入的方式, 容易导致Spring 初始化失败
@Autowired
private Person person;
private String company;
public UserServiceImpl(){
this.company = person.getCompany();
}
//3. 通过@Autowired 注入, 又因为是 ByType 注入, 因此有可能会出现两个相同的类型bean
public interface IUser {
void say();
}
@Service
public class User1 implements IUser{
@Override
public void say() {
}
}
@Service
public class User2 implements IUser{
@Override
public void say() {
}
}
@Service
public class UserService {
@Autowired
private IUser user;
}
二、构造注入
public Class Student{
private final Person person;
public void (Person person){
this.person = person;
}
}
优势:
1:可以决定依赖的关系的注入顺序
2:遵循单一性,不可变原则,
3:构造方法注入中只有组建的创建者才能改变组建的依赖关系,更符合高内聚原则。
缺点:
1:比较难测试,测试的时候项目启动比较慢(使用Mock 脱离数据库 和 可以在测试的时候不启动项目)
2:会导致循环依赖(需要弄Lazy注解解决)