- 博客主页:音符犹如代码
- 系列专栏:JavaWeb
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
目录
IOC
DI
Bean
在上一期我们给大家讲解了三层架构和分层解耦,这次给大家注重的讲解一下控制反转和依赖注入,Bean对象等知识点
控制反转:Inversion of Control,简称 IoC,在控制反转中。对象之间的创建和管理都应由自身转到外部的框架或容器来负责
依赖注入:Dependency Injection,简称 DI,它是实现控制反转的一种常见方式,它指容器为应用程序运行时,讲一个对象所依赖的其他对象动态的注入到该对象中。
Bean:IOC容器中创建管理的对象
如果我们要是实现一个案例比如:Service层及 Dao层的实现类,交给I0C容器管理,
为Controller及Service注入运行时,依赖的对象。首先把Service层以及Dao层的实现类,交给IOC容器管理
然后为Controller及Service注入运行时要依赖的对象
Service:
java">@Component //加入这个注解
public class UserServiceImpl implements UserService {private UserDao userDao;@Autowiredpublic UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Overridepublic void registerUser(User user) {// 业务逻辑处理userDao.saveUser(user);}
}
Dao:
java">@Component
public class UserDaoImpl implements UserDao {@Overridepublic void saveUser(User user) {// 模拟保存用户的数据库操作System.out.println("Saving user: " + user.getName());}
}
Controller:
java">@RestController
public class UserController {private UserService userService;@Autowiredpublic 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
java">@Primary
@Service
public calss EmpService{
}
@Autowired+@Qualifier(“bean的名称”)
java">@RestController
public class EmpController{
@Autowired
@Qualifier("empService")
private EmpService empService;
}
@Resource(name=“bean的名称”)
java">@RestController
public class EmpController{
@Resource(name = "empServiceA")
private EmpService empService;
}
@Resource和@Autowired他俩是有区别的
@Autowired它是由spring框架提供的注解,而@Resource他是java中jdk中提供的注解
@Resource是按照名称注入的,@Autowired它是按照类型注入