Spring专门设计了对工厂模式支持,你可以使用静态工厂方法来创建一个Bean,也可以使用实例工厂的方法来创建Bean。下面分别介绍这2种方法。

静态工厂注入
    定义一个Bean使用自己类上的静态工厂方法来创建自己。
我们继续使用上一篇文章《Spring内核研究-Lookup方法注入》的例子来说明如何使用静态工厂创建Bean。
context.xml
    factory-menthod定义了userDao Bean使用UserDao类的getInstance方法来创建自己的实例。userManager仍然通过lookup方法获得userDao。Lookup方法并不关心一个Bean的实例时怎样创建的,所以可以混合使用lookup方法和factory-menthod方法。
xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao"  factory-method="getInstance" / > beans>

UserDao.java
    增加一个getInstance方法来创建自己的实例。
package research.spring.beanfactory.ch2; public class UserDao { public static UserDao getInstance() { return new UserDao("static factory method"); } private String name = ""; public UserDao(String name) { this.name = name; } public void create() { System.out.println("create user from - " + name); } }

Test.java
package research.spring.beanfactory.ch2;import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Test { public static void main(String[] args) { XmlBeanFactory factory=new XmlBeanFactory(new ClassPathResource( "research/spring/beanfactory/ch2/context.xml")); UserManager manager=(UserManager) factory.getBean("userManager"); manager.createUser(); } }

运行Test.java,你会看到:

create user from - static factory method

这说明userDao使用它自己得静态工厂创建得。
 
静态工厂方法存在一些限制:

  1. 静态工厂方法上不能有参数,也不能在Spring种定义静态工厂方法的参数。
  2. 静态工厂方法只能是public的,不能是private或protected的。
  3. 静态工厂方法不能和构造函数注入一起使用。下面的定义时不能正常工作的:
package research.spring.beanfactory.ch2; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class Test { public static void main(String[] args) { XmlBeanFactory factory=new XmlBeanFactory(new ClassPathResource( "research/spring/beanfactory/ch2/context.xml")); UserManager manager=(UserManager) factory.getBean("userManager"); manager.createUser(); } }

实例工厂注入
    定义一个Bean使用这个Bean的工厂对象上的工厂方法来创建自己。
我们定义一个UserDao的Factory来创建UserDao。
UserDaoFactory.java
package research.spring.beanfactory.ch2; public class UserDaoFactory{ public UserDao getUserDao(){ return new UserDao("UserDaoFactory"); } }

修改context.xml:

xml version="1.0" encoding="UTF-8"?> DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="userManager" class="research.spring.beanfactory.ch2.UserManager"> <lookup-method name="getUserDao" bean="userDao" /> bean> <bean name="userDao" class="research.spring.beanfactory.ch2.UserDao"  factory-bean="userDaoFactory" factory-method="getUserDao" > bean> <bean name="userDaoFactory" class="research.spring.beanfactory.ch2.UserDaoFactory"> bean> beans>

再次运行Test.java你会看到:
create user from – UserDaoFactory
 
    通过上面的配置Spring已经使用userDaoFactory实例的工厂方法来创建userDao了。
  • factory-bean定义了工厂Bean
  • factory-method定义了工厂方法
 
    实例工厂和静态工厂一样都存在相同的限制:

  1. 静态工厂方法上不能有参数,也不能在Spring种定义静态工厂方法的参数。
  2. 静态工厂方法只能是public的,不能是private或protected的。
  3. 静态工厂方法不能和构造函数注入一起使用。
   
    和静态工厂不同的是:
  • 实例工厂方法不能是静态的,而静态工厂方法必须是静态的。
    通过上面的例子我们看到Spring对工厂模式对了完整的支持。但是这里还是需要说明,如果使用IoC模式设计的系统一般情况下不需要为任何Bean做工厂类。在我的观点里,工厂模式仅仅是遗留系统,使用依赖注入模式可以取代工厂模式。Spring对工厂的支持仅仅是为了可以很好的集成遗留系统。

Spring内核研究-通过工厂注入相关推荐

  1. Spring源码剖析 循环注入

    版权声明:本文为CSDN博主「shadow?s」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/java_ly ...

  2. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  3. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  4. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  6. Spring的核心机制依赖注入简介

    Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调.运行.Spring将各层的 ...

  7. 关于mysql注入说法正确的是_1. 在 Spring中,下列关于 依赖注入 的 说法 , 正确的是( ) 。_学小易找答案...

    [简答题]1基本流程练习 2时间轴嵌套 3简单应用 [简答题]请解释什么是MVC? [多选题]在 Hibernate 中,下 列 说法正确的有 [多选题]1. 关于 Spring,下列说法不正确的是( ...

  8. Spring Data MongoDB SpEL表达式注入漏洞安全风险通告第二次更新

    奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 安全通告 近日,奇安信CERT监测到Spring Data MongoDB SpEL表达式注入漏洞(CVE-2022-229 ...

  9. Spring的IOC(依赖注入和控制反转)

    Spring框架面试笔试必问之一!非常重要也非常强大,说实话一开始仿照着Spring MVC配置搭建起来,再写几句增删改查,真的配不上叫做学会了那个框架.框架是N种优秀的设计模式和一些很高深的技术组合 ...

最新文章

  1. 24.Interpreter-解释器模式
  2. JavaScript调用其他函数中的变量
  3. AIX 7.1 使用installp安装python的方法
  4. java分布式对象——远程方法中的参数和返回值+远程对象激活
  5. Java DataOutputStream writeChars()方法及示例
  6. [css] 为什么要使用css sprites?
  7. 设计模式工作笔记-UML和设计模式导论
  8. centos7手把手教你搭建zabbix监控
  9. css3 hover显示隐藏过渡,CSS3中 “hover” 样式 和 动画过渡 的问题。
  10. python中遇到的问题及解决方法_自己编程中遇到的Python错误和解决方法汇总整理...
  11. layui 下拉框多选数据_智慧职教mooc2020大数据基础课后答案
  12. Android2.0以后读取通讯录中电话号码的改变
  13. 重庆市计算机一级考试2015,2015年计算机一级考试试题及答案
  14. lenovo L480 进入bios_小白福利教程:如何刷显卡BIOS以及强刷显卡BIOS(一)
  15. 除了深度学习,机器翻译还需要啥?
  16. mysql创建视图注意事项_mysql视图创建注意事项(转)
  17. 二分+秦九韶算法 求凸点
  18. Typora markdown教程
  19. finereport 激活码
  20. Unity笔记之Unity读取/写入Excel

热门文章

  1. 零基础编程入门python视频-编程零基础应当如何开始学习 Python?
  2. python第三方库numpy-谁能介绍下Python生态中的第三方库NumPy
  3. python电脑下载网址-python下载文件文件到本地电脑(基于requests)
  4. python输入输出-Python3
  5. python笔记基础-Python笔记-基础
  6. python主要就业方向-四种Python高薪就业方向
  7. python有道翻译-利用python写一个有道翻译的脚本
  8. python工程师薪资坑吗-python能到什么程度
  9. 苹果电脑安装python-在Mac上安装Python环境
  10. python自动化办公脚本下载-基于python实现自动化办公学习笔记二