Spring框架通过工厂创建Bean的三种方式实现
作者:郭乾亮1998. 发布时间:2022-11-23 11:29:54
标签: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中注册静态工厂:
<!-- 静态工厂: 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);
}
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);
}
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);
}
来源:https://guoqianliang.blog.csdn.net/article/details/105010733


猜你喜欢
- 前端调用后端接口,获得数据并渲染一、介绍一个完善的系统,前后端交互是必不可少的,这个过程可以分成下面几步:前端向后端发起请求后端接口接收前端
- 文件上传在Web应用中非常普遍,要在Java Web环境中实现文件上传功能非常容易,因为网上已经有许多用Java开发的组件用于文件上传,本文
- 本文实例讲述了C#4.0新特性的协变与逆变,有助于大家进一步掌握C#4.0程序设计。具体分析如下:一、C#3.0以前的协变与逆变如果你是第一
- 一、简单的命令-n 在非 GUI 模式下运行JMeter-t 要运行的 JMeter 测试脚本文件-r 远程执行启动全部代理机-H 代理机器
- 改进思考正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方
- 迭代器Iterator接口1.迭代器接口Iterable内置方法iterator(), 返回一个新建的 Iterator。如:public
- 首先,定义TabHost的布局文件:<?xml version="1.0" encoding="utf-
- SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,只要在 spring-
- 前些日子,组里为了在目前的Android程序里实现基于ListView子项的动画效果,希望将最新的RecyclerView引入到程序中,于是
- 本文实例为大家分享了Android自动播放Banner图片轮播的具体代码,供大家参考,具体内容如下先看一下效果图支持本地图片以及网络图片or
- C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声明)——构造函数、析
- 对一个对象进行属性分析,并得到相应的属性值,并判断属性的默认值以及空值 public class People
- 效果图如下所示:先给大家说下实现android 跳转到通讯录的实现思路:1.点击跳转到通讯录界面2.获取通讯录姓名和手机号码3.回调显示姓名
- 1.下载JRebel and XRebel for Intellij插件2. 激活请查看这个文章http://www.cicoding.cn
- 感觉很久不写模拟器代码了,昨天调试的时候碰了点壁,记录下来,避免大家再跟我犯同样的错误。加入Javascript脚本的地方:HtmlElem
- TextView加载字体包在 Android 中,若需要使得某个TextView加载字体包,使用以下方式即可: Typeface typeF
- 最近有个老项目想逐步将新业务的数据放到新的数据库,以前的业务还得连接以前的数据库,于是需要整合多数据源 。多数据源实际上是继承了Abstra
- using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using
- Android 控制WIFI相关操作WIFI的全称是Wireless Fidelity,又称802.11b标准,是一种高速的无线通信协议,传
- 本文实例讲述了java使用Jdom实现xml文件写入操作的方法。分享给大家供大家参考,具体如下:package com.yanek.demo