使用工厂方法创建管理bean

第一部分: 静态工厂

  1. 工厂类写法:

    
    public class AirPlaneStaticFactory {
    	
    	
    	/**
    	 * 静态工厂
    	 * @param name
    	 * @return
    	 */
    	public static Airplane getAirPlane(String name) {
    		Airplane airplane = new Airplane();
    		airplane.setFjs("副驾驶");
    		airplane.setName(name);
    		airplane.setNum(1001001);
    		return airplane;
    	}
    
    }
    
    
  2. xml配置注册bean

    <!-- 使用工厂管理bean-satic静态管理 -->
    <bean name="airFactory01" class="factory.AirPlaneStaticFactory" 
    	factory-method="getAirPlane">
    	<constructor-arg name="name" value="和风号"></constructor-arg>
    </bean>
    
  3. ioc容器取出bean

    Object object = context.getBean("airFactory01"); 		//注意此处的参数,使用的是xml中工厂类注册的名
    

返回值是工厂类所管理的bean,即Airplane对象

第二部分: 实例工厂

  1. 工厂类写法

    public class AirPlaneInstanceFactory {
    	/**
    	 * 实例工厂
    	 * @param name
    	 * @return
    	 */
    	public Airplane getAirPlane(String name) {
    		Airplane airplane = new Airplane();
    		airplane.setFjs("我是副驾驶");
    		airplane.setName(name);
    		airplane.setNum(2089289);
    		return airplane;
    	}
    
    }
    
  2. xml中注册

此处注意点:1)要注册一个工厂类,2)要注册一个airplane类,3)要在airplane bean中指定所用到的工厂类和工厂方法,以及需要的参数,并且在之后的ioc容器创建的时候使用的名称是airplen bean的注册名

<!-- 使用工厂管理bean-实例管理 -->
<bean id="airFactory02" class="factory.AirPlaneInstanceFactory" >
	
</bean>
<bean id="airPlane02" class="entity.Airplane" 
	factory-bean="airFactory02" factory-method="getAirPlane">
	<constructor-arg name="name" value="复兴号"></constructor-arg>
</bean>
  1. ioc容器取出bean

    Object object = context.getBean("airPlane02");	//此处的参数不能写工厂类的注册名,要使用bean类的注册名
    

第三部分: FactoryBean接口

FactoryBean是Spring官方提供的接口,实现该接口,则无需进行复杂的配置,只需要在xml中注册该工厂类即可

  1. xml注册

    <bean id="facrorybean" class="factory.MyFactoryBean"></bean>
    
  2. MyFactoryBean.java

    public class MyFactoryBean implements FactoryBean<Book> {
    
    	@Override
    	public Book getObject() throws Exception {
    		Book book = new Book();
    		book.setAuthor("曹雪晴");
    		book.setName("红楼梦");
    		book.setPrice(100);
    		System.out.println("MyFactoryBean创建了对象");
    		return book;
    	}
    
    	@Override
    	public Class<?> getObjectType() {
    		return Book.class;
    	}
    
    }
    
  3. ioc容器取出

    Object object = context.getBean("facrorybean");
    

总结

spring的bean注册,由每一个都需要单独在xml中注册,升级成可以使用工厂类批量,统一管理注册,再到FactoryBean,工厂bean注册,简化了效率,但是本质都是bean的配置,再底层则是反射的原理