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使用它自己得静态工厂创建得。
静态工厂方法存在一些限制:
- 静态工厂方法上不能有参数,也不能在Spring种定义静态工厂方法的参数。
- 静态工厂方法只能是public的,不能是private或protected的。
- 静态工厂方法不能和构造函数注入一起使用。下面的定义时不能正常工作的:
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定义了工厂方法
实例工厂和静态工厂一样都存在相同的限制:
- 静态工厂方法上不能有参数,也不能在Spring种定义静态工厂方法的参数。
- 静态工厂方法只能是public的,不能是private或protected的。
- 静态工厂方法不能和构造函数注入一起使用。
和静态工厂不同的是:
- 实例工厂方法不能是静态的,而静态工厂方法必须是静态的。
通过上面的例子我们看到Spring对工厂模式对了完整的支持。但是这里还是需要说明,如果使用IoC模式设计的系统一般情况下不需要为任何Bean做工厂类。在我的观点里,工厂模式仅仅是遗留系统,使用依赖注入模式可以取代工厂模式。Spring对工厂的支持仅仅是为了可以很好的集成遗留系统。
Spring内核研究-通过工厂注入相关推荐
- Spring源码剖析 循环注入
版权声明:本文为CSDN博主「shadow?s」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/java_ly ...
- Spring 的控制反转/依赖注入
第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...
- 如何使用 Spring 实现策略模式+工厂模式
欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...
- 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- Spring的核心机制依赖注入简介
Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调.运行.Spring将各层的 ...
- 关于mysql注入说法正确的是_1. 在 Spring中,下列关于 依赖注入 的 说法 , 正确的是( ) 。_学小易找答案...
[简答题]1基本流程练习 2时间轴嵌套 3简单应用 [简答题]请解释什么是MVC? [多选题]在 Hibernate 中,下 列 说法正确的有 [多选题]1. 关于 Spring,下列说法不正确的是( ...
- Spring Data MongoDB SpEL表达式注入漏洞安全风险通告第二次更新
奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 安全通告 近日,奇安信CERT监测到Spring Data MongoDB SpEL表达式注入漏洞(CVE-2022-229 ...
- Spring的IOC(依赖注入和控制反转)
Spring框架面试笔试必问之一!非常重要也非常强大,说实话一开始仿照着Spring MVC配置搭建起来,再写几句增删改查,真的配不上叫做学会了那个框架.框架是N种优秀的设计模式和一些很高深的技术组合 ...
最新文章
- 24.Interpreter-解释器模式
- JavaScript调用其他函数中的变量
- AIX 7.1 使用installp安装python的方法
- java分布式对象——远程方法中的参数和返回值+远程对象激活
- Java DataOutputStream writeChars()方法及示例
- [css] 为什么要使用css sprites?
- 设计模式工作笔记-UML和设计模式导论
- centos7手把手教你搭建zabbix监控
- css3 hover显示隐藏过渡,CSS3中 “hover” 样式 和 动画过渡 的问题。
- python中遇到的问题及解决方法_自己编程中遇到的Python错误和解决方法汇总整理...
- layui 下拉框多选数据_智慧职教mooc2020大数据基础课后答案
- Android2.0以后读取通讯录中电话号码的改变
- 重庆市计算机一级考试2015,2015年计算机一级考试试题及答案
- lenovo L480 进入bios_小白福利教程:如何刷显卡BIOS以及强刷显卡BIOS(一)
- 除了深度学习,机器翻译还需要啥?
- mysql创建视图注意事项_mysql视图创建注意事项(转)
- 二分+秦九韶算法 求凸点
- Typora markdown教程
- finereport 激活码
- Unity笔记之Unity读取/写入Excel
热门文章
- 零基础编程入门python视频-编程零基础应当如何开始学习 Python?
- python第三方库numpy-谁能介绍下Python生态中的第三方库NumPy
- python电脑下载网址-python下载文件文件到本地电脑(基于requests)
- python输入输出-Python3
- python笔记基础-Python笔记-基础
- python主要就业方向-四种Python高薪就业方向
- python有道翻译-利用python写一个有道翻译的脚本
- python工程师薪资坑吗-python能到什么程度
- 苹果电脑安装python-在Mac上安装Python环境
- python自动化办公脚本下载-基于python实现自动化办公学习笔记二