盘点Spring中组件注入的几种方式:
1、@Configuration注解
该注解虽然不能直接将Bean对象注入到容器中,但是加了该注解的类,代表该类的功能等同于Spring的XML配置文件。作用于Spring的上下文,个人认为可以理解为Spring容器创建Bean的入口(不知道描述是否准确)。
2、方式1:@Bean[导入第三方包里的组件],如下:
@Bean("person")
// 可通过下述两个标签自定义自己的需求。
@Scope("prototype")
@Lazy
@Conditional(WindowsCondition.class)
public Person person() {
System.out.println("给容器创建Person对象。。。。。。");
return new Person("张三",25);
}
3、方式2:@ComponentScan/@ComponentScans(包扫描+组件标注注解)
通过上述两个标签,来告诉Sring容器扫描指定包下带有@Controller、@Service、@Repository、@Conponent注解的类。但是,包扫描方式仅限于自己创建的类。对于第三方包里面的类,由于无法控制注解添加,所以有时候无法注册。
@ComponentScans(value= {
@ComponentScan(value="com.atguigu",includeFilters= {
// @Filter(type=FilterType.ANNOTATION,classes= {Controller.class,Service.class})
@Filter(type=FilterType.CUSTOM,classes= {MyTypeFilter.class})
},useDefaultFilters=false)
})
并且可以通过设置过滤器,选择性加载需要的类。
4、方式3:@Import[快速给容器中导入一个组件]
@Import({Red.class,MyImportSelectors.class,MyImportBeanDefinitionRegistrar.class})
1)、@Import[要导入到容器中的组件.class],容器中就会自动注册这个组件,ID默认为类的全名
2)、@ImportSelector[自定义ImportSelector.class],自定义的Slector要实现ImportSelector,默认返回要注册组件的全类名的数组。特别注意,这里数组不可为null,可以为空的数组。
3)、@ImportBeanDefinitionRegistrar[自定义ImportBeanDefinitionRegistrar],需要实现ImportBeanDefinitionRegistrar的接口,并实现其registerBeanDefinitions,然后通过registry.registerBeanDefinition("rainBow", rootBeanDefinition);的方式,手工注册需要的组件信息。
5、方式4:使用Spring提供的@FactoryBean(工厂bean)接口来实现组件的注册
首先自定义实现类ColorFactoryBean实现FactoryBean<Color>接口,该接口里面有三个方法,分别是:getObject,getObjectType,isSingleton。
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
其中:
1)、默认Spring容器注册的组件是工厂bean调用getObject创建的对象。
2)、如果要获取工厂bean本身,我们需要给id前面加一个&标识,例如:&colorFactoryBean