spring-第六篇之创建bean的3种方式
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;
} @Override
public 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;
} @Override
public 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>
运行结果与静态工厂方法的一致。
spring-第六篇之创建bean的3种方式的更多相关文章
- 7 -- Spring的基本用法 -- 7... 创建Bean的3种方式
7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Java-JUC(六):创建线程的4种方式
Java创建线程的4种方式: Java使用Thread类代表线程,所有线程对象都必须是Thread类或者其子类的实例.Java可以用以下4种方式来创建线程: 1)继承Thread类创建线程: 2)实现 ...
- Spring 创建Bean的6种方式
前言 本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案. 方式1: 使用Spring XML方式配置,该方式用于在纯 ...
- 第5篇K8S创建资源的两种方式
一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=r ...
- Spring学习之实例化bean的三种方式
实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...
- Spring创建JobDetail的两种方式
一.Spring创建JobDetail的两种方式 二.整合方式一示例步骤 1.将spring核心jar包.quartz.jar和Spring-context-support.jar导入类路径. 2.编 ...
- Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire
创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...
- spring装配bean的三种方式及其混合装配
在spring容器中装配bean有三种基本方式和混合装配方式: 隐式的bean自动发现机制和自动装配 在java中进行显式配置 在xml中配置 混合装配(在多个java文件中配置.在JavaConfi ...
随机推荐
- Win10系统下插入耳机前面板无声后面板有声的处理
问题描述: 当耳机插入后面板绿色口(注意:耳机扬声器为绿色口,红色为话筒麦克风:前后面板一样):可以听到声音,但是转到前面板插入后,无声音:调出声音面板发现声音可随音度波动 处理步骤: 1.保证插牢接 ...
- centos7操作防火墙
1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- Centos安装ifstat统计网络流量
原文地址: http://www.winvps.org/post/504.html 下载 ifstat , http://gael.roualland.free.fr/ifstat/ifstat-1 ...
- .net core api迁移 3.0后Post 405 Method Not Allowed
问题由来:.net core api之前是用 .net core 2.0开发的,测试过都是正常的,近期升级到了3.0,发现api get正常,post提示400,405 Method Not Allo ...
- Oracle11gR2 64bit+Oracle11gR2Client32bit+pl/sql 9
安装Oracle数据库,费了老一番折腾准备软件:1. Oracle 11g R2 64bit2. Oracle 11g R2 Client 32bit3. PLSQL Developer V9 逐个安 ...
- Altium Designer设计PCB中如何开槽
在不同层画槽孔形状实际得到的PCB效果(注意槽孔边缘) 在不同层画槽孔形状进行(注意槽孔边缘) 很多坛友问在使用Altium Designer设计PCB时,想在板子上开一个槽或者挖一个孔该如何操作,是 ...
- 脚本_使用awk提取linux主机参数
#!bin/bash#功能:使用awk提取Linux主机的参数信息,如内容剩余容量,根分区剩余容量,本机IP,本机能登录的用户个数,CPU负载.#作者:liusingbon#使用awk提取内存剩余容量 ...
- find 查找目录下的文件
1. 命令功能 find命令用于查到目录下的文件,同时也可以调用其它命令执行相应操作. 2. 语法格式 find [-H] [-L] [-P] [-Olevel] [-D help|tree|sear ...
- Python---基础---水仙花数和三色球
一.编写一个程序,求100~999之间的所有水仙花数 如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数.例如:153 = 1^3 + 5^3 + 3^3,因此153就是一个水仙花数 for ...
- 如何将DynamoDB的数据增量迁移到表格存储
Amazon DynamoDB是一个完全托管的NoSQL数据库服务,可以提供快速的.可预期的性能,并且可以实现无缝扩展.由于DynamoDB并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对 ...