给spring容器中注册bean有四种通过注解的方式:
- 包扫描+组件标注注解
- @Bean
- @Import
- 使用FactoryBean(工厂Bean)
下面逐个介绍他们的用法:
包扫描+组件标注注解
这种方式使我们最为常见的一种,通过两类注解配合使用。
@ComponentScan注解用来标在配置类的上方,表示了需要对哪些包进行扫描。也可以通过excludeFilters属性来指明那些类型是不被扫描的组件。
第二类注解是指@Controller/@Service/@Repository/@Component四个中的一个,这些注解一般标在自己写的类的上方,表示他们是需要注册到spring容器中的。
@Bean注解
有时候我们需要将一些类,不属于我们编写的类注册进spring容器当中,这时候我们不能再通过上面那种方式,而是需要在注解类中的方法上面加上@Bean注解,这样就会将该方法所返回的对象注册进spring容器当中。
spring中注册时实例默认是单实例的,即singleton。在ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是直接从容器(map.get())中拿。
当我们在@Bean注解相同位置再添加一个@Scope(“prototype”)注解时,它表示Bean是多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象。
当然,我们也可以通过@Lazy注解加在@Bean注解相同位置来表示懒加载,这样即使是默认情况下的单例,容器启动的时候创建对象,也会变成容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化。
@Import注解
@Import注解使用时直接标注在配置类的上方,表示向Spring容器中注册哪些Bean。其中的value属性可以传入三种类型的值,分别是:直接类对象、ImportSelector和ImportBeanDefinitionRegistrar。
直接传入类对象就表示注册这些Bean;
传入ImportSelector的实现类,需要实现其中的selectImports()方法,返回的字符串数组表示要注册进容器中的Bean。例如: