目录
1、配置类
package com.atguigu.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.atguigu.bean.ColorFactoryBean; @Configuration public class MainConfig2 { /** * 给容器中注册组件; * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类] * 2)、@Bean[导入的第三方包里面的组件] * 3)、@Import[快速给容器中导入一个组件] * 1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名=》【Color.class】 * 2)、ImportSelector:返回需要导入的组件的全类名数组;=》【MyImportSelector.class】 * 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中=》【MyImportBeanDefinitionRegistrar.class】 * 4)、使用Spring提供的 FactoryBean(工厂Bean); * 1)、默认获取到的是工厂bean调用getObject创建的对象 * 2)、要获取工厂Bean本身,我们需要给id前面加一个& * &colorFactoryBean */ @Bean public ColorFactoryBean colorFactoryBean(){ return new ColorFactoryBean(); } }
2、自定义的FactoryBean
package com.atguigu.bean; import org.springframework.beans.factory.FactoryBean; //创建一个Spring定义的FactoryBean public class ColorFactoryBean implements FactoryBean<Color> { //返回一个Color对象,这个对象会添加到容器中 @Override public Color getObject() throws Exception { // TODO Auto-generated method stub System.out.println("ColorFactoryBean...getObject..."); return new Color(); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Color.class; } //是单例? //true:这个bean是单实例,在容器中保存一份 //false:多实例,每次获取都会创建一个新的bean; @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; } }
3、测试类
package com.atguigu.test; import java.util.Map; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import com.atguigu.bean.Blue; import com.atguigu.bean.Person; import com.atguigu.config.MainConfig; import com.atguigu.config.MainConfig2; public class IOCTest { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class); @Test public void testImport(){ printBeans(applicationContext); //工厂Bean获取的是调用getObject创建的对象 Object bean1 = applicationContext.getBean("colorFactoryBean"); Object bean2 = applicationContext.getBean("colorFactoryBean"); System.out.println("bean的类型:"+bean1.getClass()); System.out.println(bean1 == bean2); Object bean3 = applicationContext.getBean("&colorFactoryBean"); System.out.println(bean3.getClass()); } private void printBeans(AnnotationConfigApplicationContext applicationContext){ String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } } }