工程供应商App开发如何提升项目管理效率与透明度
611
2023-06-17
Spring框架通过工厂创建Bean的三种方式实现
工厂模式
Spring中bean的创建,默认是框架利用反射new出来的bean实例。有时候也会有一些复杂的情况。
假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有DriverName(机长姓名),此时可以使用工厂模式帮我们创建对象,有一个专门帮我们创建对象的类帮我们创建对象,这个类就叫工厂。
public class AirPlane {
private String DriverName;// 机长姓名
private String AirPlaneName;// 飞机名字
private String longth;// 飞机长度
private Integer num;// 载客量
//省略getter与setter方法
}
静态工厂:工厂本身不用创建对象,通过静态方法调用。
实例工厂:工厂本身需要创建对象,需要先new一个工厂实例。
1.使用静态工厂创建bean
静态工厂:
package com.gql.factory;
import com.gql.bean.AirPlane;
/**
* 静态工厂
*
* @author guoqianliang
*/
public class AirPlaneStaticFactory {
public static AirPlane getAirPlane(String drivername) {
System.out.println("静态工厂造飞机...");
AirPlane airplan = new AirPlane();
airplan.setDriverName(drivername);
airplan.setAirPlaneName("歼20");
airplan.setLongth(20);
airplan.setNum(1);
return airplan;
}
}
在xml中注册静态工厂:
QdaBoKnN
测试:
@Test
public void test07() {
System.out.println("容器启动完成");
AirPlane bean = (AirPlane) ioc.getBean("airPlan1");
System.out.println("打印飞机属性:" + bean);
}
2.使用实例工厂创建bean
实例工厂:
package com.gql.factory;
import com.gql.bean.AirPlane;
/**
* 实例工厂
* @author guoqianliang
*/
public class AirPlaneInstanceFactory {http://
public AirPlane getAirPlane(String drivername) {
System.out.println("实例工厂造飞机...");
AirPlane airplan = new AirPlane();
airplan.setDriverName(drivername);
airplan.setAirPlaneName("歼20");
airplan.setLongth(20);
airplan.setNum(1);
return airplan;
}
}
在xml中注册实例http://工厂:
factory-bean=“InstanceFactory” :指定使用哪个工厂实例。
factory-method=“getAirPlane”:使用哪个工厂方法。
class="com.gql.factory.AirPlaneInstanceFactory">
class="com.gql.factory.AirPlaneInstanceFactory">
factory-bean="InstanceFactory" factory-method="getAirPlane">
factory-bean="InstanceFactory" factory-method="getAirPlane">
测试:
@Test
public void test08() {
System.out.println("容器启动完成");
AirPlane bean = (AirPlane) ioc.getBean("airPlan2");
System.out.println("打印飞机属性:" + bean);
}
3.实现FactoryBean工厂创建Bean
ioc容器启动的时候不会创建实例(无论是单实例还是多实例),获取的时候才创建实例对象。
实现FactoryBean接口:
package com.gql.factory;
import org.springframework.beans.factory.FactoryBean;
import com.gql.bean.Book;
public class MyFactoryBean implements FactoryBean
/**
* 返回创建的对象
*/
@Override
public Book getObject() throws Exception {
System.out.println("MyFactoryBean创建对象...");
Book book = new Book();
book.setBookName("红楼梦");
book.setAuthor("曹雪芹");
return book;
}
/**
* 返回创建的对象的类型
*/
@Override
public Class> getObjectType() {
// TODO Auto-generated method stub
return Book.class;
}
/**
* 是单例? true:是 false:不是
*/
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
在xml中注册:
测试:
@Test
public void test09() {
System.out.println("容器启动完成");
Object bean = ioc.getBean("myFactoryBean");
System.out.println("打印属性:" + bean);
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~