java bean 工厂模式_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中注册静态工厂:

测试:

@Test

public void test07() {

System.out.println("容器启动完成");

AirPlane bean = (AirPlane) ioc.getBean("airPlan1");

System.out.println("打印飞机属性:" + bean);

}

b278816cd6e2d6bb082b9d772efe6f4e.png

2.使用实例工厂创建bean

实例工厂:

package com.gql.factory;

import com.gql.bean.AirPlane;

/**

* 实例工厂

* @author guoqianliang

*/

public class AirPlaneInstanceFactory {

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中注册实例工厂:

factory-bean=“InstanceFactory” :指定使用哪个工厂实例。

factory-method=“getAirPlane”:使用哪个工厂方法。

class="com.gql.factory.AirPlaneInstanceFactory">

factory-bean="InstanceFactory" factory-method="getAirPlane">

测试:

@Test

public void test08() {

System.out.println("容器启动完成");

AirPlane bean = (AirPlane) ioc.getBean("airPlan2");

System.out.println("打印飞机属性:" + bean);

}

2443b2d0c3b5b18985a7a9a9cc0b759c.png

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);

}

4501dfa74745b491df50fe765038cb43.png

到此这篇关于Spring框架通过工厂创建Bean的三种方式实现的文章就介绍到这了,更多相关Spring 工厂创建Bean内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-03-22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值