• 六、spring之通过FactoryBean为ioc容器中添加组件


    前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过 FactoryBean添加组件的方法。

    首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类

    类Color:

    // 不必关心该类的具体代码实现,我们只是要把它注册进容器中即可
    public class Color {
    	private Car car;
    	public Car getCar() {
    		return car;
    	}
    	public void setCar(Car car) {
    		this.car = car;
    	}
    	@Override
    	public String toString() {
    		return "Color [car=" + car + "]";
    	}
    }
    

    如果呢,我们想要通过FactoryBean来为容器中添加组件,我们需要实现这个类。

    首先来看下这个工厂bean的结构:

    我们再来写个ColorFactoryBean类实现这个工厂Bean的接口

    import org.springframework.beans.factory.FactoryBean;
    //创建一个Spring定义的FactoryBean
    public class ColorFactoryBean implements FactoryBean<Color> {
    
    	//返回一个Color对象,这个对象会添加到容器中
    	@Override
    	public Color getObject() throws Exception {
    		System.out.println("ColorFactoryBean...getObject...");
    		return new Color();
    	}
    
    	@Override
    	public Class<?> getObjectType() {
    		return Color.class;
    	}
    
    	//是单例?
    	//true:这个bean是单实例,在容器中保存一份
    	//false:多实例,每次获取都会创建一个新的bean;
    	@Override
    	public boolean isSingleton() {
    		return false;
    	}
    }
    

    这个类非常简单,我们最终的目的是要将Color这个类注册到容器中,但前提是ColorFactoryBean也在容器中。所以呢我们在配置中注册这个ColorFactoryBean

    @Configuration
    public class MainConfig2 {	
    	/**
    	 * 4)、使用Spring提供的 FactoryBean(工厂Bean);
    	 * 		1)、默认获取到的是工厂bean调用getObject创建的对象
    	 * 		2)、要获取工厂Bean本身,我们需要给id前面加一个&
    	 * 			&colorFactoryBean
    	 */
    	@Bean
    	public ColorFactoryBean colorFactoryBean(){
    		return new ColorFactoryBean();
    	}
    }
    

    我们编写一个测试方法进行测试

    	@Test
    	public void testImport(){
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
    	
    		//工厂Bean获取的是调用getObject创建的对象
    		Object bean2 = applicationContext.getBean("colorFactoryBean"); // 获取colorFactoryBean
    		Object bean3 = applicationContext.getBean("colorFactoryBean");
    		System.out.println("bean的类型:"+bean2.getClass()); // 打印出具体的类型,观察控制台,实际是
            //Color这个类
    		System.out.println(bean2 == bean3); // isSingleton返回的false所以不是单例的
    		// 如何获取到工厂bean本身呢,加上&符号
    		Object bean4 = applicationContext.getBean("&colorFactoryBean"); 
    		System.out.println(bean4.getClass());
    	}
    

    打印结果:

    ColorFactoryBean...getObject...
    ColorFactoryBean...getObject...
    bean的类型:class com.atguigu.bean.Color
    false
    class com.atguigu.bean.ColorFactoryBean
    
    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    go 注释/说明/文档 标注
    go stack object escape
    ubuntu virtualBox windows10 CPU占用100%
    git 团队合作
    git 修改远程pull和push地址
    go 项目编译失败
    fork函数 linux创建子进程
    51nod1183 编辑距离
    各种平衡树
    redis 配置多个ip 解决方案
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11379599.html
Copyright © 2020-2023  润新知