使用工厂方法创建管理bean

第一部分: 静态工厂

  1. 工厂类写法:

    ```java

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

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

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

第二部分: 实例工厂

  1. 工厂类写法

    ```java

    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的注册名
```xml
<!-- 使用工厂管理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>
  1. 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;
    }

}
  1. ioc容器取出

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

总结

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