配置工厂Bean
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象.
一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean.
调用getBean()方法,Spring返回的不是直接创建的Bean的实例,而是由工厂Bean创建的Bean实例.
一般在Spring中配置工厂Bean,有3中不同类型的工厂Bean的配置.
1.静态工厂
创建具体Bean实例的是静态方法
import java.util.Random;
public class StaticFactoryBean {
public static Integer createRandom() {
return new Integer(new Random().nextInt());
}
}
将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称
<bean id="random"
class="example.chapter3.StaticFactoryBean"
factory-method="createRandom" //createRandom方法必须是static的,才能找到
scope="prototype"
/>
测试:
public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("random").toString());

//StaticFactoryBean sfb = (StaticFactoryBean)factory.getBean("random");
//System.out.println(sfb.createRandom().toString());
//调用getBean()时,返回随机数.如果没有指定 factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例
}
2.实例工厂
创建具体Bean实例的是实例,不是静态方法
import java.text.SimpleDateFormat;
import java.util.Date;
public class InstanceFactoryBean {
private String format = "yy-MM-dd HH:mm:ss";
public void setFormat(String format) {
this.format = format;
}
public String createTime() {
return new SimpleDateFormat(format).format(new Date());
}
}
配置文件需要配置两个bean:第一个Bean和普通的Bean没有区别,第二个bean定义如何通过工厂Bean获取Bean,需要指定 工厂Bean的名称和方法名称
<bean id="instanceFactoryBean" class="example.chapter3.InstanceFactoryBean">
<property name="format" value="yyyy-MM-dd HH:mm:ss" />
</bean>
<bean id="currentTime"
factory-bean="instanceFactoryBean"
factory-method="createTime"
/>
测试:
public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("currentTime"));

}

3.实现FactoryBean接口
public class PiFactoryBean implements FactoryBean {
public Object getObject() throws Exception {
return new Double(3.14159265358979);
}
public Class getObjectType() {
return Double.class;
}
public boolean isSingleton() {
return true;
}
}
实现了FactoryBean接口的Bean,不再被视为普通的Bean.Spring会自动检测.
<bean id="pi" class="example.chapter3.PiFactoryBean" />
测试
public static void main(String[] args) throws Exception {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("pi"));//返回PiFactoryBean 的工厂方法getObject返回的Double对象实例
//PiFactoryBean p = (PiFactoryBean)factory.getBean("&pi"); //加"&"返回工厂Bean的实例.
//System.out.println(p.getObject());
}

spring factory-method和factory-bean 使用相关推荐

  1. Spring 通过工厂方法(Factory Method)来配置bean

    在spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. 在第一种利用bean config file(spring xml)方式中 ...

  2. 【死磕 Spring】—– IOC 之 Factory 实例化 bean

    这篇我们关注创建 bean 过程中的第一个步骤:实例化 bean,对应的方法为: createBeanInstance(),如下: protected BeanWrapper createBeanIn ...

  3. 【死磕 Spring】----- IOC 之 Factory 实例化 bean

    原文:https://www.cmsblogs.com/category/1391374860344758272 『chenssy』 这篇我们关注创建 bean 过程中的第一个步骤:实例化 bean, ...

  4. Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean

    前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...

  5. 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 推荐阅读: Spring官网阅读 | 总结篇 Spring杂 ...

  6. Spring源码解析(五)-Bean的实例化流程(上)

    在前面已经完成了对需要实例化bean的收集并封装成BeanDefinition,并且将BeanPostProcess等组件进行了提前实例化.接下来就到了容器启动的最后一步,也是最复杂的一步-实例化be ...

  7. 解决spring coud打包报Singleton bean creation not allowed while singletons of this factory are in destruct

    解决spring coud打包报Singleton bean creation not allowed while singletons of this factory are in destruct ...

  8. 启动报错 Bean instantiation via factory method failed

    启动报错 Bean instantiation via factory method failed 在引入 mybatis-plus 之后,启动项目总是报错 Bean instantiation vi ...

  9. Springboot mybatis逆向工程org.springframework.beans.factory.BeanCreationException: Error creating bean错误

    前言 声明:这个错误只是作者在学习时候的一种情况,并不一定能够解决所有情况.还望各位审视出错具体环境!谢谢. 今天使用mybatis逆向工程 springboot本想着少写点代码,但被个bug纠缠到死 ...

  10. Factory method ‘sqlSessionFactory‘ threw exception; nested exception is java.lang.NoSuchMethodError:

    springboot 引入mybatis-plus后报错: Factory method 'sqlSessionFactory' threw exception; nested exception i ...

最新文章

  1. 微软全球 AKS 女掌门人,这样击破云原生“怪圈”!
  2. Tomcat9+eclipse如何发布网站
  3. SAP Spartacus的CMSPageGuard
  4. qmenu只在鼠标单击时消失_两种方法解决win10电脑无法使用无线鼠标问题
  5. 学妹问我Java枚举类与注解,我直接用这个搞定她!
  6. Linux的sort命令用法
  7. 南京信息工程大学计算机等级考试代码,南京信息工程大学2016下半年计算机等级考试报名...
  8. 用堆栈和用递归分别实现倒序打印
  9. [Material Design] 教你做一个Material风格、动画的按钮(MaterialButton)
  10. java物流管理系统代码_Java物流配送管理系统 Spring 源码下载
  11. 华为qq邮箱服务器密码忘了,华为手机qq邮箱无法登录电子邮件鉴权失败的解决办法...
  12. linux下unison安装配置
  13. GDS文件如何打开?
  14. 域权限维持—黄金票据和白金票据
  15. 不用PyScript,网页端运行的Python编辑器
  16. 用计算机弹歌曲fade,抖音短视频踢脚舞是什么歌 Faded歌曲分享
  17. linux:framebuffer驱动之ssd1363驱动和fbtft驱动修改
  18. NAMD靶向分子动力学模拟Target molecular dynamic stimulation(附conf文件)
  19. excel2010设置列宽为像素_Excel2010中调整行高和列宽的方法
  20. 解决页面刷新数据丢失,数据持久化问题

热门文章

  1. 机器学习cae_智铸超云——适创科技为压铸企业量身定制的专业CAE云平台
  2. 关于一个简易的Html5音乐播放器的制作
  3. [转载] K3漏油器全紫铜替换原硅胶垫教程。标准姿势
  4. iOS 切换到后台任务执行
  5. HPUX系统启动后主机名为unknown的解决办法
  6. 苹果7处理器_苹果发布重磅创世纪新品!苹果将再次改变世界了吗?
  7. python和matlab读取SST数据(海洋的温度)(.nc文件)并绘图
  8. 因果推断1--基本方法介绍(个人笔记)
  9. 2019最新《JavaEE系统架构师学习路线之基础篇》
  10. python结巴分词 能分英文吗_NLTK(一):英文分词分句