1、知识点
(1)bean的创建默认就是框架利用反射new出来的bean实例;
(2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这个类就是工厂。
如:AirPlane ap = AirPlaneFactory.getAirPlane(String jzName);
(3)静态工厂:工厂本身不用创建对象;通过静态方法调用,对象 = 工厂类.工厂方法名();
(4)实例工厂:工厂本身需要创建对象;如下:
工厂类 工厂对象 = new 工厂类();
工厂对象.getAirPlane(“张三”);
2、创建工厂类
(1)创建静态工厂
public class AirPlaneStaticFactory {
// 静态工厂调用:AirPlaneStaticFactory.getAirPlane()
public static AirPlane getAirPlane(String jzName){
System.out.println("静态工厂正在运行。。。");
AirPlane airPlane = new AirPlane();
airPlane.setFdj("锤子");
airPlane.setFjsName("天航");
airPlane.setJzName(jzName);
airPlane.setPersonNum(200);
airPlane.setYc("200m");
return airPlane;
}
}
(2)创建实例工厂
public class AirPlaneInstanceFactory {
// 实例工厂调用:先new AirPlaneInstanceFactory(),再调用getAirPlane()
public AirPlane getAirPlane(String jzName){
System.out.println("实例工厂正在运行。。。");
AirPlane airPlane = new AirPlane();
airPlane.setFdj("锤子");
airPlane.setFjsName("天航");
airPlane.setJzName(jzName);
airPlane.setPersonNum(200);
airPlane.setYc("200m");
return airPlane;
}
}
3、静态工厂使用(不需要创建工厂本身),factory-method指定哪个方法是工厂方法。
(1)class:指定工厂全类名
(2)factory-method:指定工厂方法
(3)constructor-arg:可以为方法传参
<bean id="airPlane" class="atguigu.factory.AirPlaneStaticFactory" factory-method="getAirPlane">
<!-- 可以为方法指定参数-->
<constructor-arg name="jzName" value="机长"></constructor-arg>
</bean>
4、实例工厂使用
(1)先创建一个实例工厂bean
<bean id="airPlaneInstanceFactory" class="atguigu.factory.AirPlaneInstanceFactory">
</bean>
(2)使用实例工厂
1)factory-bean:指定当前对象创建使用哪个工厂实例
2)factory-method:使用哪个工厂方法
<bean id="airPlane2" class="atguigu.bean.AirPlane" factory-bean="airPlaneInstanceFactory" factory-method="getAirPlane">
<constructor-arg name="jzName" value="实例机长"></constructor-arg>
</bean>
(3)实例工厂使用步骤
1)先配置出实例工厂对象,如上述的(1)
2)配置我们要创建的AirPlane使用哪个工厂创建,如上述(2)
5、FactoryBean的使用
(1)知识点
1)FactoryBean是Spring规定的一个接口;只要是这个接口的实现类,Spring都认为是一个工厂。
2)实现了FactoryBean接口的类都是Spring可以认识的工厂类,Spring会自动的调用工厂方法创建实例
3)ioc容器启动时不会创建实例
4)FactoryBean:获取的时候才创建对象,即:ioc.getbean();
(2)FactoryBean的使用步骤
1)编写一个Factory的实现类
2)在Spring配置文件中进行注册
(3)编写一个Factory的实现类
//Book是一个实体类
public class MyFactoryBeanImpl implements FactoryBean<Book> {
/**
* getObject:工厂方法
* 返回创建的对象
* @return
* @throws Exception
*/
@Override
public Book getObject() throws Exception {
Book book = new Book();
book.setBookName(UUID.randomUUID().toString());
return book;
}
/**
* 返回创建的对象的类型
* Spring会自动调用该方法来确认创建的对象是什么类型
* @return
*/
@Override
public Class<?> getObjectType() {
return Book.class;
}
/**
* isSingleton:是单例?
* false:不是单实例
* true:是单实例
*
* @return
*/
@Override
public boolean isSingleton() {
return false;
}
}
(4)在Spring配置文件中注册
<bean id="myFactoryBean" class="atguigu.factory.MyFactoryBeanImpl">
</bean>