Spring内核研究-通过工厂注入

Spring内核研究-通过工厂注入

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"> bean>

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"> bean>

factory-bean="userDaoFactory" factory-method="getUserDao" > bean> 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专门设计了对工厂模式支持,你可以使用静态工厂方法来创建一个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"> bean>

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"> bean>

factory-bean="userDaoFactory" factory-method="getUserDao" > bean> 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四种依赖注入方式 博客分类: spring 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想 ...查看


  • 一个简单的例子说明java中spring框架的依赖注入
  • javaEE开发中,现在最成熟的框架之一应该就是spring了,spring框架最强大的地方就是实现了依赖注入(也叫控制反转),最近的一个项目中用的就是spring框架,spring框架是工厂模式的应用结合了MVC的设计思想,,大家可以看到 ...查看


  • 三大框架的作用
  • Struts2的作用 作为web层框架应该大体实现以下功能: 1.获取表单内容,并组织生成参数对象 2.根据请求的参数转发请求给适当的控制器 3.在控制器中调用业务接口 4.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果 ...查看


  • spring依赖注入的三种方式
  • spring 依赖注入的三种方式 2009-11-03 09:18:29.0 来源:e800技术客 关键词: spring 依赖注入 方式 张三疯 张三疯的文章 JA V A 中去掉空格 trim 函数 其他代码 java 全角半角转换函数 ...查看


  • Spring依赖注入的几种方式
  • spring 依赖注入的几种方式 使用构造器注入 使用属性setter 方法注入 使用Field 注入(用于注解方式) 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况, 开发人员无法预见最终 ...查看


  • 2.13 单元测试
  • 单元测试 Author:江南白衣 注重实效的TDD的确能加快,而不是拖慢开发的进度(片面的追求覆盖率的全面UnitTest不在此列) 一,可以实现真正分层开发. 二,不需要依赖和频繁重启Web Container. 三,手工测试总不免改动数 ...查看


  • 毕业论文--商业银行绩效考核系统(打印)(模板)
  • NANCHANG UNIVERSITY 学 士 学 位 论 文 THESIS OF BACHELOR (2009 - 2013 年) 题 目: 基于Spring MVC框架的商业银行绩效考核系统设计与实现 学 院: 软件学院 系 软件工程 ...查看


  • 计算机专业简历大全
  • 简历模板二 求职简历 基本信息 姓 名: 出生日期: 工作年限: 1985年9月12日 一年以上 性 别: 居 住 地: 电子邮件: 专 业: QQ 号码: 男 北京-海淀区 软件开发 学 历: 本科 (四年) 手机号码: 详细信息 ◆ 自 ...查看


  • 人力资源管理系统软件工程毕业设计论文
  • 摘要 人力资源管理系统是现代企业的核心业务系统之一,人力资源管理的状况和水平对企业的运作和效率至关重要.现代企业人力资源管理的内容非常丰富,可能包含档案管理.合同管理.薪酬管理.招聘管理.绩效管理.系统管理等很多部分.在本次毕业设计中,我们 ...查看


热门内容