bean的创建默认就是框架利用反射new出来的bean实例
工厂模式:工厂帮我们创建bean;有一个专门帮我们创建对象的类,这个类就是工厂
假设有一个飞机类Airplane,那么工厂模式中飞机的创建方法就是
Airplane ap = AirplaneFactory.getAirplane(String jzName);
静态工厂:工厂本身不用创建对象;通过静态方法调用 对象 = 工厂类.工厂方法名();
实例工厂:工厂本身需要创建对象:工厂类 工厂对象 = new 工厂类();
工厂对象.getAirplane(String jzName);
1.创建静态工厂
首先实现静态工厂类AirplaneStaticFactory,在这里面实现getAirplane方法(方法中代码乱写的hhh)
public class AirplaneStaticFactory {
public static Airplane getAirplane(String jzName){
System.out.println("AirplaneStaticFactory");
Airplane airplane = new Airplane();
airplane.setFdj("www");
airplane.setFjsName("wwww");
airplane.setPersonNum(300);
airplane.setJzName(jzName);
airplane.setYc("333");
return airplane;
}
}
那么在bean中配置工厂就是:
<!-- 静态工厂 factory-method:指定哪个方法为工厂方法
class:指定工厂名
constructor-arg:给工厂方法传参
-->
<bean id="airplane01" class="com.lzt.factory.AirplaneStaticFactory"
factory-method="getAirplane">
<!-- 可以为方法指定参数 -->
<constructor-arg value="lisi"/>
</bean>
在代码中获取airplane对象就是,直接获取工厂id即可
Airplane airplane = (Airplane) ioc3.getBean("airplane01");
2.创建实例工厂
首先实现实例工厂类AirplaneInstanceFactory(其实就是去掉了static)
public class AirplaneInstanceFactory {
public Airplane getAirplane(String jzName){
System.out.println("AirplaneInstanceFactory");
Airplane airplane = new Airplane();
airplane.setFdj("www");
airplane.setFjsName("wwww");
airplane.setPersonNum(300);
airplane.setJzName(jzName);
airplane.setYc("333");
return airplane;
}
}
那么在bean中配置工厂就是:
<!-- 2.实例工厂 factory-method:指定哪个方法为工厂方法-->
<bean id="airplaneInstanceFactory" class="com.lzt.factory.AirplaneInstanceFactory">
</bean>
在使用实例工厂创建对象的时候,依然要在容器中注册对象组件,然后再注册的使用配置我们的对象要使用哪个工厂创建
1)factory-bean:指定使用哪个工厂实例
2)factory-method:指定使用哪个工厂方法
<!-- 实例工厂 factory-bean:指定对象使用哪个工厂
1.先配置出实例工厂对象
2.配置我们的airplane对象要使用哪个工厂创建
1)factory-bean:指定使用哪个工厂实例
2)factory-method:指定使用哪个工厂方法
-->
<bean class="com.lzt.bean.Airplane" id="airplane02"
factory-bean="airplaneInstanceFactory" factory-method="getAirplane">
<constructor-arg value="wangwu"></constructor-arg>
</bean>
3.使用FactoryBean类
首先实现实例工厂类BookFactoryImple,继承了FactoryBean<>,要实现其中对应的方法。
实现了FactoryBean的类是spring认为的工厂类
FactoryBean 泛型是指定你要创建什么样的对象
在Spring中使用工厂
1.先编写FactoryBean的实现类
2.在spring配置文件中进行注册
public class BookFactoryImple implements FactoryBean<Book> {
/*
getObject:工厂方法;
返回创建的对象
*/
@Override
public Book getObject() throws Exception {
Book book = new Book();
book.setBookName(UUID.randomUUID().toString());
return book;
}
/*
getObjectType 返回创建对象的类型
spring自动调用来确认这个对象的类型
*/
@Override
public Class<?> getObjectType() {
return Book.class;
}
/*
isSingleton:是单例吗?
*/
@Override
public boolean isSingleton() {
return true;
}
}
然后在容器中注册
<!-- FactoryBean(是spring指定的一个接口)
只要是这个接口的实现类,spring都认为是一个工厂
ioc容器启动的时候,不会创建实例,在获取的时候才创建实例
-->
<bean class="com.lzt.factory.BookFactoryImple" name="bookFactoryImple"></bean>
在代码中获取airplane对象就是,直接获取工厂name即可
Book book = (Book) ioc3.getBean("bookFactoryImple");