一、 何意味?
@Autowired的作用是:从Spring容器中获取一个对象,也可以理解为Spring分配给当前一个对象- 这里不懂的话,初学者可以理解为spring帮我们new了一个对象
二、层层递进 - 在controller层中使用
java
@RestController
public class UserController{
@AutoWired
private UserService uservice;
}
意思是:
Controller需要一个Service
所以让Spring分配一个Service对象
- 在ServiceImpl里使用
java
@Servcice
public class UserServiceImpl implements UserService{
@Autowired
privateUserMapper userMapper;
}
意思是:
Service需要Mapper
所以让Spring分配一个Mapper对象
→ 这时候大家就在想了,这好像没区别啊,这个反而我还看不懂直接手动new一个多好
→ 区别在这里:
- 低耦合(扩展会提到)
- 重点:生命周期管理
- 传统的new 每次调用,例调用100次
User user = new User()就是创建100个对象 - 而对于@Autowired只是创建一个对象反复使用
tips可以理解为多例和单例的区别
- 就是测试、缓存、日志之类的更加便利
三、扩展
- IOC(控制反转)
最好理解的就是使用了@Autowired将控制权从程序员自己给了spring 这个就叫控制反转 - DI(依赖注入)
说白了就是没有DI前吃饭要考虑的是饭、菜、餐具等等一系列,有了DI之后就直接开吃
这里的关键是依赖注入 注入的是接口即不用管具体是什么实现的只与起接口类的抽象方法相依赖。 - 耦合
说白了高耦合就是A改了B也需要改,低耦合就是A改了B不需要改或者只需要改很小一部分
低耦合也是@Autowired的特点
@Autowired依赖于接口类而不是实现类
例如:需要将mysql更换到oracle那么只需要直接将oracle对应的实现类直接继承原来mysql的对应接口就行(可以用@Primary注解强调优先使用,也可以直接去掉原来mysql对应的实现类的接口继承)
(下述例子只是展示了部分,@Autowired的注解在其对应的controller层添加)
java
public class UserService {
private UserRepository repo = new MysqlUserRepository(); // 这里要改
}
public class OrderService {
private UserRepository repo = new MysqlUserRepository(); // 这里要改
}
public class ProductService {
private UserRepository repo = new MysqlUserRepository(); // 这里要改
}
public class CartService {
private UserRepository repo = new MysqlUserRepository(); // 这里要改
}
修改方式:
java
// 1. 加一个新的 Oracle 实现,需要将MysqlUserRepository中的继承接口给去掉
@Repository
public class OracleUserRepository implements UserRepository {
// Oracle 的实现
}
// 2. 告诉 Spring 用哪个
@Repository
@Primary // 优先用我
public class OracleUserRepository implements UserRepository { }