Spring框架通过工厂创建Bean的三种方式实现

作者:郭乾亮1998. 时间:2022-11-23 11:29:54 

工厂模式

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中注册静态工厂:


<!-- 静态工厂: factory-method="getAirPlane"指定哪个方法是工厂方法-->
<bean id="airPlan1" class="com.gql.factory.AirPlaneStaticFactory" factory-method="getAirPlane">
<constructor-arg value="舒克"></constructor-arg>
</bean>

测试:


@Test
public void test07() {
System.out.println("容器启动完成");
AirPlane bean = (AirPlane) ioc.getBean("airPlan1");
System.out.println("打印飞机属性:" + bean);
}

Spring框架通过工厂创建Bean的三种方式实现

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”:使用哪个工厂方法。


<bean id="InstanceFactory"
class="com.gql.factory.AirPlaneInstanceFactory"></bean>
<bean id="airPlan2" class="com.gql.bean.AirPlane"
factory-bean="InstanceFactory" factory-method="getAirPlane">
<constructor-arg value="舒克二号"></constructor-arg>
</bean>

测试:


@Test
public void test08() {
System.out.println("容器启动完成");
AirPlane bean = (AirPlane) ioc.getBean("airPlan2");
System.out.println("打印飞机属性:" + bean);
}

Spring框架通过工厂创建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<Book> {
/**
* 返回创建的对象
*/
@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中注册:


<!-- 使用FactoryBean -->
<bean id="myFactoryBean" class="com.gql.factory.MyFactoryBean"></bean>

测试:


@Test
public void test09() {
System.out.println("容器启动完成");
Object bean = ioc.getBean("myFactoryBean");
System.out.println("打印属性:" + bean);
}

Spring框架通过工厂创建Bean的三种方式实现

来源:https://guoqianliang.blog.csdn.net/article/details/105010733

标签:Spring,工厂,Bean
0
投稿

猜你喜欢

  • Android6.0获取动态权限代码示例

    2022-07-22 10:35:15
  • Android IPC机制Messenger实例详解

    2023-04-27 13:25:06
  • utf8编码检测方法分享

    2023-05-18 12:34:27
  • Java SE求解汉诺塔问题的示例代码

    2022-05-10 23:44:30
  • 详谈C++引用&和指针在作为形参时的区别

    2023-12-13 16:50:49
  • 分析Java中的类加载问题

    2023-09-03 19:37:04
  • C#用NPOI导出导入Excel帮助类

    2022-09-27 00:23:43
  • MyBatis插入Insert、InsertSelective的区别及使用心得

    2023-08-25 04:34:28
  • Android系统view与SurfaceView的基本使用及区别分析

    2023-04-08 00:33:26
  • Unity Shader实现线框效果的制作步骤

    2023-10-10 06:14:54
  • C#实现简单俄罗斯方块

    2023-06-18 07:18:36
  • Android编程实现获取当前连接wifi名字的方法

    2023-11-24 15:41:50
  • Android编程实现定时发短信功能示例

    2021-12-29 08:24:17
  • Android使用OkHttp进行重定向拦截处理的方法

    2022-09-12 15:47:32
  • Android文件下载功能实现代码

    2023-08-14 00:58:55
  • C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

    2021-05-26 00:07:08
  • java面试题之try中含return语句时代码的执行顺序详解

    2023-11-24 07:34:16
  • Android实现屏幕旋转方法总结

    2023-04-01 19:37:31
  • Java8 CompletableFuture 异步多线程的实现

    2023-07-21 08:07:15
  • java文件重命名(文件批量重命名)实例程序代码分享

    2023-07-20 06:45:06
  • asp之家 软件编程 m.aspxhome.com