使用工厂方法创建管理bean
第一部分: 静态工厂
-
工厂类写法:
```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>
-
ioc容器取出bean
Object object = context.getBean("airFactory01"); //注意此处的参数,使用的是xml中工厂类注册的名
返回值是工厂类所管理的bean,即Airplane
对象
第二部分: 实例工厂
-
工厂类写法
```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>
-
ioc容器取出bean
Object object = context.getBean("airPlane02"); //此处的参数不能写工厂类的注册名,要使用bean类的注册名
第三部分: FactoryBean接口
FactoryBean是Spring官方提供的接口,实现该接口,则无需进行复杂的配置,只需要在xml中注册该工厂类即可
- xml注册
<bean id="facrorybean" class="factory.MyFactoryBean"></bean>
- 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;
}
}
-
ioc容器取出
Object object = context.getBean("facrorybean");
总结
spring的bean注册,由每一个都需要单独在xml中注册,升级成可以使用工厂类批量,统一管理注册,再到FactoryBean,工厂bean注册,简化了效率,但是本质都是bean的配置,再底层则是反射的原理