spring在启动时会本身把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,全部对象都应该从容器里得到,它们的生命周期
在放入容器时已经肯定!java
下面说一下三种注册bean的方法web
Spring容器会扫描@ComponentScan配置的包路径,找到标记@Component注解的类加入到Spring容器。spring
咱们常常用到的相似的(注册到IOC容器)注解还有以下几个:框架
下面代码完成了EmailLogServiceImpl这个bean的注册,固然也能够放在@Bean里统一注册,须要看@Bean那一节里的介绍。ide
@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被声明在方法上,方法都须要有一个返回类型,而这个类型就是注册到IOC容器的类型,接口和类都是能够的,介于面向接口原则,提倡返回类型为接口。.net
下面代码在一个@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(); } }
这种方法最为直接,直接把指定的类型注册到IOC容器里,成为一个java bean,能够把@Import放在程序的八口,它在程序启动时自动完成注册bean的过程。code
@Import({ LogService.class,PrintService.class }) public class RegistryBean { }
Spring之因此如何受欢迎,我想很大缘由是它自动化注册和自动化配置这一块的设计,确实让开发人员感到很是的自如,.net里也有相似的产品,像近几年比较流行的abp框架,大叔本身也写过相似的lind框架,都是基于自动化注册和自动化配置的理念。component