`
234390216
  • 浏览: 10193671 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460810
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771834
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395454
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393903
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678229
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529303
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178748
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461938
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150152
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66868
社区版块
存档分类
最新评论

Spring(02)——bean实例化

阅读更多

2 bean的实例化

2.1 构造方法实例化

bean的实例化默认是通过构造方法进行的,在未指定构造方法参数的情况下,默认会通过无参构造方法来进行bean的实例化。如下这种就是通过无参构造方法进行实例化的。

	<bean id="hello" class="com.app.Hello"/>

所以在像如上这种没有配置构造参数使用无参构造方法进行实例化时一定要保证对应的Class拥有一个public的无参构造方法。如果我们的构造方法是有参数的,则需要通过constructor-arg来指定对应的参数,如下这种就是通过配置构造参数使用构造方法进行实例化的。

	<bean name="hello" class="java.lang.String">
		<constructor-arg value="hello"/>
	</bean>

当参数类型为基本数据类型时可以直接通过constructor-arg元素的value属性指定对应的值,如上面示例中的value=”hello”就是这样的。
当有多个构造参数时就需要使用多个constructor-arg进行定义,默认会将定义的顺序作为参数的顺序。

public class Hello {

	public Hello(String str1, boolean b2, int i3) {
		
	}
	
}

如上Class,我们在定义对应的bean时可以如下定义,这个时候默认会按照定义的顺序将第一个参数赋值给构造方法的第一个参数,第二个给第二个,第n个给第n个。

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg value="str1"/><!-- str1 -->
 		<constructor-arg value="true"/><!-- b2 -->
 		<constructor-arg value="3"/><!-- i3 -->
 	</bean>

当然,我们也可以明确的利用index来指定constructor-arg对应参数的位置,index是从0开始的,即第一个参数对应的index为0。使用index时,Hello对应的bean可以如下定义。

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg index="1" value="true"/><!-- b2 -->
 		<constructor-arg index="0" value="str1"/><!-- str1 -->
 		<constructor-arg index="2" value="3"/><!-- i3 -->
 	</bean>

当构造参数对应于ApplicationContext中的一个bean时,我们也可以通过ref属性关联对应的bean

public class Hello {

	public Hello(World world1) {
		
	}
	
}
	<bean id="world" class="com.app.World"/>
 
 	<bean id="hello" class="com.app.Hello">
 		<constructor-arg ref="world"/>
 	</bean>

我们还可以通过constructor-arg元素的name属性来指定对应constructor-arg对应的参数,如:

public class Hello {

	public Hello(String s1, int i2) {
		
	}
	
}
	<bean id="hello" class="com.app.Hello">
 		<constructor-arg name="i2" value="2"/><!-- 对应参数i2 -->
 		<constructor-arg name="s1" value="1"/><!-- 对应参数s1 -->
 	</bean>

但是这需要我们的Class是通过debug方式进行编译的,这样Spring才能识别出对应的参数名称。当然我们也可以通过JDK提供的@ConstructorProperties注解来指定构造参数对应的名称。如:

public class Hello {

	@ConstructorProperties({"s1", "i2"})
	public Hello(String s1, int i2) {
		
	}
	
}

当我们的构造参数比较复杂,比如是一个array、list、set、map等或者需要定义一个内部的bean时,我们可以直接在constructor-arg元素中间进行定义,如:

	<bean id="hello" class="com.app.Hello">
 		<constructor-arg>
 			<bean class="com.app.World"/>
 		</constructor-arg>
 	</bean>

2.2 静态方法实例化

如果我们的bean是通过指定Class的静态方法进行实例化的,则我们可以通过指定Class为拥有对应静态方法的Class,指定factory-method为对应的实例化静态方法。假设我们拥有如下这样一个Class

public class Hello {

	public static World createWorld() {
		return new World();
	}
	
	public static class World {
		
	}
	
}

现需要通过Hello的createWorld静态方法来构造一个类型为World的bean,那么我们可以如下定义:

	<bean id="world" class="com.app.Hello" factory-method="createWorld"/>

从以上定义我们可以看到在通过静态方法实例化对应的bean时是不需要指定对应的bean的类型的,指定的class是对应静态方法所在的Class。实例化的bean的类型Spring将根据factory-method指定方法的返回值决定。
如果我们用于实例化的静态方法factory-method是需要接收参数的,那么对应的参数将通过constructor-arg来定义,定义的规则和定义构造方法参数是一样的。来看一个示例,现将我们的Hello和World的定义改为如下这样,Hello中用来实例化World对象的createWorld方法需要接收两个参数。

public class Hello {

	public static World createWorld(String s1, int i2) {
		return new World(s1, i2);
	}
	
}
public class World {

	public World(String s1, int i2) {
		
	}

}

那么我们对应的bean定义应该是这样的:

	<bean id="world" class="com.app.Hello" factory-method="createWorld">
		<constructor-arg value="s1"/>
		<constructor-arg value="2"/>
	</bean>

2.3 通过实例方法进行实例化

有时候我们的bean可能是需要通过某个对象进行实例化的,这个时候我们可以通过factory-bean指定用来实例化该bean的对应对象,通过factory-method指定factory-bean中用来实例化该bean的方法。factory-bean必须也是属于ApplicationContext中的一个bean。如我们有如下这样一个类Hello,其中拥有一个实例方法createWorld将实例化一个World对象。

public class Hello {

	public World createWorld() {
		return new World();
	}
	
}

如果我们需要定义一个bean使用Hello的实例对象的createWorld方法来实例化对应的World对象,则可以这样定义:

	<bean id="hello" class="com.app.Hello"/>
	<bean id="world" factory-bean="hello" factory-method="createWorld"/>

此时也是不需要指定class的,如果用户指定了classSpring也会将其忽略,对应bean的类型将由factory-method指定方法的返回值决定。当factory-method需要接收参数时,则对应的参数可以通过constructor-arg来定义。如我们的Hello是这样定义的,其createWorld方法需要接收参数。

public class Hello {

	public World createWorld(String s1, int i2) {
		return new World(s1, i2);
	}
	
}

那么,对应的bean应该如下定义:

	<bean id="hello" class="com.app.Hello"/>
 	
	<bean id="world" factory-bean="hello" factory-method="createWorld">
		<constructor-arg value="s1"/>
		<constructor-arg value="2"/>
	</bean>

(注:本文是基于Spring4.1.0所写)

1
0
分享到:
评论

相关推荐

    跟我学spring3(1-7)

    【第六章】 AOP 之 6.8 切面实例化模型 ——跟我学spring3 【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.1 概述 ——跟我学spring3 【第七章】 对JDBC的支持 之 7.2 ...

    spring3.0jar包

    ◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一...

    跟开涛学Spring

    1.27 【第六章】 AOP 之 6.8 切面实例化模型 ——跟我学spring3 . . . . . . . . . . . . . . . . . . . . . . . . . . . .282 1.28 【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3 . . . . . . . . . . . . . ...

    spring-framework-3.1.0.RELEASE.zip

    容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个...

    Spring 中文API&开发文档.rar

    ◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一...

    跟我学spring3(1-7).pdf

    —— 5.1 概述 5.2 SpEL基础5.3 SpEL语法5.4在Bean定义中使用EL6.1 AOP基础6.2 AOP的HelloWorld6.3 基于Schema的AOP6.4 基于@AspectJ的AOP 6.5 AspectJ切入点语法详解6.6 通知参数6.7 通知顺序6.8 切面实例化模型

    Spring.3.x企业应用开发实战(完整版).part2

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    Spring3.x企业应用开发实战(完整版) part1

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    2.3 Bean 的初始化和销毁 37 2.3.1 点睛 37 2.3.2 演示 38 2.4 Profile 40 2.4.1 点睛 40 2.4.2 演示 41 2.5 事件(Application Event) 44 2.5.1 点睛 44 2.5.2 示例 44 第3 章 Spring 高级话题 48 3.1 Spring ...

    低清版 大型门户网站是这样炼成的.pdf

    5.3.6 动态实例化查询结果 313 5.4 qbc查询方式 314 5.4.1 基本查询 315 5.4.2 qbe查询 317 5.4.3 分页查询 318 5.4.4 复合查询 318 5.4.5 离线查询 319 5.5 本地sql查询 320 5.6 hibernate的批量处理 322 ...

    swing界面设计之JTree

    (一) Spring 开发 Swing GUI 简介——依赖注入和富客户机 5 关于本教程 5 前提条件 6 Spring 和依赖注入概述 7 什么是 Spring 框架? 7 什么是依赖注入? 7 环境设置 7 选择编译环境 7 设置 Ant 8 通过 Ant 自动下载...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA程序开发大全---上半部分

    以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    对于一个 Java EE 应用来说,通常这些服务对象都是被容器管理的(例如,Spring 容器或 EJB 容器),更合适的方法是查找该服务对象而非直接实例化。因此,需要告诉 BlazeDS 通过 Factory 来查找指定的 FlexService ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    对于一个 Java EE 应用来说,通常这些服务对象都是被容器管理的(例如,Spring 容器或 EJB 容器),更合适的方法是查找该服务对象而非直接实例化。因此,需要告诉 BlazeDS 通过 Factory 来查找指定的 FlexService ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

Global site tag (gtag.js) - Google Analytics