1、创建bean的方式有3种:

1》使用构造器创建bean,即设值注入、构造注入本质都是使用bean的构造器创建bean的。

2》使用静态工厂方法创建bean。

3》调用实例工厂方法创建bean。

2、使用静态工厂方法创建bean

使用静态工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:

class:值为静态工厂类

factory-method:该属性指定静态工厂方法生产bean实例。如果静态工厂方法需要参数,则使用<constructor-arg.../>元素传入。

举个例子:

Being.java

package com.lfy.bean;public interface Being {public void testBeing();
}

Cat.java

package com.lfy.impl;import com.lfy.bean.Being;public class Cat implements Being {private String msg;public void setMsg(String msg) {this.msg=msg;}@Overridepublic void testBeing() {System.out.println(msg+",猫喜欢吃老鼠");}}

Dog.java

package com.lfy.impl;import com.lfy.bean.Being;public class Dog implements Being {private String msg;public void setMsg(String msg) {this.msg=msg;}@Overridepublic void testBeing() {System.out.println(msg+",狗爱啃骨头");}}

BeingFactory.java

package com.lfy.factory;import com.lfy.bean.Being;
import com.lfy.impl.Cat;
import com.lfy.impl.Dog;/*** 静态工厂类* @author lfy**/
public class BeingFactory {//返回Being实例的静态工厂方法//arg参数决定返回哪个Being类的实例public static Being getBeing(String arg) {if(arg.equalsIgnoreCase("dog")) {return new Dog();}else {return new Cat();}}
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 一旦为<bean.../>元素指定了factory-method属性,spring就不再调用构造器来创建bean实例 --><bean id="dog" class="com.lfy.factory.BeingFactory" factory-method="getBeing"><!-- 配置静态工厂方法的参数  --><constructor-arg value="dog"/><property name="msg" value="我是狗"/></bean><bean id="cat" class="com.lfy.factory.BeingFactory" factory-method="getBeing"><!-- 配置静态工厂方法的参数  --><constructor-arg value="cat"/><property name="msg" value="我是猫"/></bean>
</beans>

SpringTest.java

package com.lfy.main;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lfy.bean.Being;
import com.lfy.impl.Cat;
import com.lfy.impl.Dog;/*** 2、使用静态工厂方法创建bean* @author lfy**/
public class SpringTest {public static void main(String[] args) {ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");Being b1=ctx.getBean("dog", Dog.class);b1.testBeing();Being b2=ctx.getBean("cat", Cat.class);b2.testBeing();}}

运行结果:

3、调用实例工厂方法创建bean

实例工厂方法与静态工厂方法只有一点不同:调用静态工厂方法只需要工厂类即可,而实例工厂方法则需要工厂实例。

配置实例工厂方法与静态工厂方法也只有一点不同:配置静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。

使用实例工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:

factory-bean:该属性值为工厂bean的id。

factory-method:该属性指定实例工厂的工厂方法。如果实例工厂方法需要参数,则使用<constructor-arg.../>元素传入。

     以前面的静态工厂方法例子进行些许的修改:

     BeingFactory.java的getBeing(...)的static属性去掉,则得到的是实例工厂方法

package com.lfy.factory;import com.lfy.bean.Being;
import com.lfy.impl.Cat;
import com.lfy.impl.Dog;/*** 静态工厂类* @author lfy**/
public class BeingFactory {//返回Being实例的静态工厂方法//arg参数决定返回哪个Being类的实例public Being getBeing(String arg) {if(arg.equalsIgnoreCase("dog")) {return new Dog();}else {return new Cat();}}
}

修改beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><bean id="beingFactory" class="com.lfy.factory.BeingFactory"/><bean id="dog" factory-bean="beingFactory" factory-method="getBeing"><constructor-arg value="dog"/><property name="msg" value="我是狗"/></bean><bean id="cat" factory-bean="beingFactory" factory-method="getBeing"><constructor-arg value="cat"/><property name="msg" value="我是猫"/></bean>
</beans>

运行结果与静态工厂方法的一致。

转载于:https://www.cnblogs.com/ZeroMZ/p/11328186.html

spring-第六篇之创建bean的3种方式相关推荐

  1. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  2. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

  3. Spring创建Bean的3种方式

    1. Spring创建Bean的三种方式 1. 调用构造器(因为常用就不讲) 2. 调用静态工厂方法 3. 调用实例工厂方法 2. 使用静态工厂方法 1.此时<bean.../>元素要指定 ...

  4. Spring 创建Bean的三种方式

    创建Bean的三种方式 第一种方式:使用默认构造函数创建. 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时.采用的就是默认构造函数创建bean对象,此 ...

  5. Spring创建Bean的三种方式的使用和区别

    在学习Spring的时候,发现Spring的IOC(控制反转)为我们提供的三种创建Bean的方式. 1.Spring创建Bean的三种方式 这里采用XML配置,分别演示三种创建Bean的方式和代码. ...

  6. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  7. 五、创建Bean的三种方式

    五.创建Bean的三种方式 转载于:https://www.cnblogs.com/ljiwej/p/7280614.html

  8. Java-JUC(六):创建线程的4种方式

    Java创建线程的4种方式: Java使用Thread类代表线程,所有线程对象都必须是Thread类或者其子类的实例.Java可以用以下4种方式来创建线程: 1)继承Thread类创建线程: 2)实现 ...

  9. Spring 创建Bean的几种方式

    一.使用构造器实例化Bean 这是最简单的方式,Spring IoC容器即能使用默认空构造器也能使用有参数构造器两种方式创建Bean. 1.使用空构造器进行定义 2.使用有参数构造器进行定义 二.使用 ...

  10. 第5篇K8S创建资源的两种方式

      一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=r ...

最新文章

  1. 还在用Jenkins?看看这些替代方案,是否更适合你!
  2. 最大信息系数——检测变量之间非线性相关性
  3. DayDayUp:朋友圈有趣的职场跳槽微小说《华为跳阿里→阿里跳腾讯→腾讯跳百度→百度跳华为》
  4. 关于电商你应该知道的!!!(深度好文)
  5. 服务器上安装ffmpeg后报错及解决方案libavdevice.so.58: cannot open shared object file: No such file or directory
  6. python nose测试框架全面介绍十---用例的跳过
  7. mysql的seq2_DESeq2处理TCGA数据库Seq-count数据
  8. xss漏洞php注射实战,利用XSS渗透DISCUZ 6.1.0实战
  9. Android 自己定义View (二) 进阶
  10. C# Winform播放多媒体文件 [AudioVideoPlayback ]
  11. 关于HTTP请求报文和响应报文学习笔记
  12. Sentence2Vec理解
  13. android移动商城源码,o2o移动社区Android端app开源源码
  14. Java Swing实现简易计算器
  15. 北京地区的图像处理公司
  16. 时装连连看,基于MindSpore实现FashionMNIST图像分类
  17. linux parallel指令参数,GNU Parallel的具体使用
  18. ibm3400服务器改win7系统,dell3578win10改win7系统bios如何设置_戴尔win10改win7系统bios设置步骤...
  19. 影之刃服务器维护,影之刃无法联机到服务器怎么办 解决办法
  20. java request reponse 乱码的问题解决

热门文章

  1. Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found
  2. 修改配置文件,编译freeswitch支持H264
  3. Telepresence修改完善心得
  4. Linux直接复制eclipse也可以使用
  5. SHELL中获取函数返回值
  6. 编译OpenJDK12:可以用VS2010到VS2017
  7. NWT失败反省:一下子买1万个用户许可,全浪费了
  8. 8月18日梦记录及分析
  9. Memento(备忘录)
  10. win10 桌面的的文件都不见了 提示不注销保存都文件都为临时_Windows10隐藏的8个小技巧,每一个都非常实用又高效...