测试方法:
@Test public void testImport() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig2.class); String[] beanNamesForType = ac.getBeanDefinitionNames(); for (String p:beanNamesForType) { System.out.println(p); } }运行结果:逻辑判断Blue存在所以rainbow被注册了进来
mainConfig2 com.eric.bean.Blue bill person2 rainbow 使用FactoryBean注册组件使用spring提供的FactoryBean(工厂Bean)
创建一个ColorFactoryBean实现FactoryBean接口:
//创建一个Spring定义的FactoryBean public class ColorFactoryBean implements FactoryBean<Color> { /** * 返回一个Color对象,这个对象会添加到容器中 * @return * @throws Exception */ @Override public Color getObject() throws Exception { System.out.println("ColorFactoryBean=========getObject====="); return new Color(); } /** * 返回的bean类型 * @return */ @Override public Class<Color> getObjectType() { return Color.class; } /** * 是否单例 * 返回true代表是单实例,在容器中保存一份 * false是多实例,每次获取都会创建一个新的bean * @return */ @Override public boolean isSingleton() { return true; } }配置类里注册该工厂bean
@Configuration public class MainConfig2 { @Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); } }测试方法:
@Test public void testFactoryBean() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig2.class); //工厂bean获取的是调用getObject()方法创建的对象 Object bean1 = ac.getBean("colorFactoryBean"); Object bean2 = ac.getBean("colorFactoryBean"); System.out.println("bean的类型:"+bean1.getClass()); //单实例返回true 多实例返回false System.out.println(bean1 == bean2); //默认获取到的是工厂bean调用getObejct创建的对象 //要获取工厂bean本身,我们需要给id前面加一个&标识 Object bean3 = ac.getBean("&colorFactoryBean"); System.out.println("bean3的类型:"+bean3.getClass()); }运行结果: 单实例获取到的是相同的bean,加&之后获取到的bean为ColorFactoryBean
ColorFactoryBean=========getObject===== bean的类型:class com.eric.bean.Color true bean3的类型:class com.eric.condition.ColorFactoryBean 总结给容器中注册组件:
包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
@Bean 导入的第三方包里面的组件
@Import 快速给容器中导入一个组件
@Import(要导入到容器中的组件):容器中就会自动注册这个组件,id默认是全类名
@ImportSelector 返回需要导入的组件的全类名数组
@ImportBeanDefinitionRegistrar 手动注册bean到容器中
使用Spring提供的FactoryBean(工厂Bean)
默认获取到的是工厂bean调用getObject方法创建的对象
要获取工厂Bean本身,我们需要给id前面加一个&
ok,组件注册完结,撒花。