目录
在上一期我们给大家讲解了三层架构和分层解耦,这次给大家注重的讲解一下控制反转和依赖注入,Bean对象等知识点
控制反转:Inversion of Control,简称 IoC,在控制反转中。对象之间的创建和管理都应由自身转到外部的框架或容器来负责
依赖注入:Dependency Injection,简称 DI,它是实现控制反转的一种常见方式,它指容器为应用程序运行时,讲一个对象所依赖的其他对象动态的注入到该对象中。
Bean:IOC容器中创建管理的对象
如果我们要是实现一个案例比如:Service层及 Dao层的实现类,交给I0C容器管理,
为Controller及Service注入运行时,依赖的对象。首先把Service层以及Dao层的实现类,交给IOC容器管理
然后为Controller及Service注入运行时要依赖的对象
Service:
@Component //加入这个注解
public class UserServiceImpl implements UserService {
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void registerUser(User user) {
// 业务逻辑处理
userDao.saveUser(user);
}
}
Dao:
@Component
public class UserDaoImpl implements UserDao {
@Override
public void saveUser(User user) {
// 模拟保存用户的数据库操作
System.out.println("Saving user: " + user.getName());
}
}
Controller:
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@PostMapping("/register")
public void register(@RequestBody User user) {
userService.registerUser(user);
}
}
Bean的声明
要把某个对象交给ioc容器管理的时候,需要在对应的类上加上注解
注解 | 介绍 | 使用 |
@Component | 声明bean的基础注解 | 通用注解,任何类 |
@Controller | @Component的衍生注解 | 标识控制器类 |
@Service | @Component的衍生注解 | 标识服务层的类 |
@Repository | @Component的衍生注解 | 标识数据访问层的类 |
注意:
声明bean的时候我们可以通过value指定bean的名字,如果没有指定名字,那默认的类名首字母是小写的
使用上边四个注解都可以声明bean,但是在springboot中声明控制器类的bean只能用@Controller这个注解
Bean的注入
在 Spring 框架中,Bean 的注入(Dependency Injection)是指将一个 Bean 所依赖的其他 Bean 自动地注入到当前 Bean 中,以满足其运行时的需求
在Bean的注入中我们最常用的就是@Autowired这个注解,但是如果我们存在多个相同的bean而都用的@Autowired就会报错,所以我们就会用其他的注解方式来解决这些问题
@Primary
@Primary
@Service
public calss EmpService{
}
@Autowired+@Qualifier(“bean的名称”)
@RestController
public class EmpController{
@Autowired
@Qualifier("empService")
private EmpService empService;
}
@Resource(name=“bean的名称”)
@RestController
public class EmpController{
@Resource(name = "empServiceA")
private EmpService empService;
}
@Resource和@Autowired他俩是有区别的
@Autowired它是由spring框架提供的注解,而@Resource他是java中jdk中提供的注解
@Resource是按照名称注入的,@Autowired它是按照类型注入