spring 在启动时会自己把 bean(java 组件)注册到 IoC 容器里, 实现控制反转, 在开发人员使用 spring 开发应用程序时, 你是看不到 new 关键字的, 所有对象都应该从容器里获得, 它们的生命周期在放入容器时已经确定!
下面说一下三种注册 bean 的方法
- @ComponentScan
- @Bean
- @Import
@ComponentScan 注册指定包里的 bean
Spring 容器会扫描 @ComponentScan 配置的包路径, 找到标记 @Component 注解的类加入到 Spring 容器.
我们经常用到的类似的 (注册到 IoC 容器) 注解还有如下几个:
@Configuration: 配置类
@Controller :web 控制器
@Repository : 数据仓库
@Service: 业务逻辑
下面代码完成了 EmailLogServiceImpl 这个 bean 的注册, 当然也可以放在 @Bean 里统一注册, 需要看 @Bean 那一节里的介绍.
- @Component
- public class EmailLogServiceImpl implements EmailLogService {
- private static final Logger logger = LoggerFactory.getLogger(EmailLogServiceImpl.class);
- @Override
- public void send(String email, String message) {
- Assert.notNull(email, "email must not be null!");
- logger.info("send email:{},message:{}", email, message);
- }
- }
@Bean 注解直接注册
注解 @Bean 被声明在方法上, 方法都需要有一个返回类型, 而这个类型就是注册到 IoC 容器的类型, 接口和类都是可以的, 介于面向接口原则, 提倡返回类型为接口.
下面代码在一个 @Configuration 注解的类中, 同时注册了多个 bean.
- @Configuration
- public class LogServiceConfig {
- /**
- * 扩展 printLogService 行为, 直接影响到 LogService 对象, 因为 LogService 依赖于 PrintLogService.
- *
- * @return
- */
- @Bean
- public PrintLogService printLogService() {
- return new PrintLogServiceImpl();
- }
- @Bean
- public EmailLogService emailLogService() {
- return new EmailLogServiceImpl();
- }
- @Bean
- public PrintLogService consolePrintLogService() {
- return new ConsolePrintLogService();
- }
- }
@Import 注册 Bean
这种方法最为直接, 直接把指定的类型注册到 IoC 容器里, 成为一个 java bean, 可以把 @Import 放在程序的八口, 它在程序启动时自动完成注册 bean 的过程.
- @Import({
- LogService.class,PrintService.class
- })
- public class RegistryBean {
- }
Spring 之所以如何受欢迎, 我想很大原因是它自动化注册和自动化配置这一块的设计, 确实让开发人员感到非常的自如,.net 里也有类似的产品, 像近几年比较流行的 abp 框架, 大叔自己也写过类似的 lind 框架, 都是基于自动化注册和自动化配置的理念.
来源: https://www.cnblogs.com/lori/p/10418271.html