`

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所写)

 

 

本文转自:http://elim.iteye.com/blog/2382031

 

分享到:
评论

相关推荐

    实例化Spring bean的两种工厂方法

    在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态...在实际项目中,应根据实际情况权衡利弊,选择最适合的Bean实例化策略。

    Spring————面试题库

    BeanFactory可以理解为一个工厂类,它包含了bean的定义,并且能够在接收到客户端请求时将对应的bean实例化。BeanFactory还负责bean的生命周期控制,包括初始化和销毁方法的调用。ApplicationContext在BeanFactory的...

    Spring特性——Aware感知特性

    BeanFactoryAware接口提供了一个方法`setBeanFactory(BeanFactory beanFactory)`,允许bean获取到当前的BeanFactory实例。这样,bean就能在运行时动态地查找和依赖其他bean,或者利用BeanFactory提供的功能,如工厂...

    二、Spring源码分析——BeanFactory

    1. **对象的创建**:BeanFactory能够根据配置信息创建bean实例,支持延迟加载(lazy-init),只有在真正需要时才会实例化bean。 2. **依赖注入**:BeanFactory可以根据bean之间的依赖关系,自动装配bean的属性,无需...

    Spring特性——事件驱动模型

    本篇文章将深入探讨Spring框架的一个重要特性——事件驱动模型。通过理解这一特性,开发者可以更好地利用Spring来实现应用间的通信和协调,提高系统的灵活性和可扩展性。 事件驱动模型是一种设计模式,它基于发布/...

    Spring boot——@DeclareParents例子

    需要注意的是,`@DeclareParents`注解的注入是在Spring容器初始化时完成的,因此,对于那些在运行时动态创建的bean,该注解可能不会生效。此外,由于注入的是静态内部类,这意味着默认实现与切面类是同一个类加载器...

    【框架源码篇 04】Spring源码手写篇-Bean定义配置化

    在本篇【框架源码篇 04】中,我们将深入探讨Spring框架的核心概念——Bean定义配置化。Spring是Java领域最广泛使用的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称...

    普通类调用Spring bean对象

    这样,我们就能在普通类中获取到Spring管理的bean实例。 2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`来自动装配bean。这样,Spring会自动找到类型匹配的...

    Spring开发指南——中文版

    《Spring开发指南——中文版》是由夏昕编著的一本针对Spring框架的中文教程,旨在帮助开发者更好地理解和应用Spring框架。Spring是Java平台上的一个核心框架,广泛应用于企业级应用开发,提供了一种全面的编程和配置...

    三、Spring源码分析——ApplicationContext

    ApplicationContext负责Bean的生命周期,包括初始化、实例化、依赖注入、初始化回调、销毁等阶段。它可以使用 BeanPostProcessor 接口对Bean进行预处理和后处理,实现自定义逻辑。同时,它还支持定义初始化方法和...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    Spring-beans模块负责Bean的定义,类的实例化,以及依赖关系的处理;Spring-context模块提供了访问应用程序对象的上下文,它是一个配置文件,用于配置应用程序中的对象,它还集成了Spring AOP的功能;Spring-context...

    spring国际化实例

    Spring框架是Java开发中的一个核心库,它提供了一个广泛的功能集,包括依赖注入、面向切面编程、数据访问、Web应用程序开发以及我们今天关注的主题——国际化(i18n)。国际化是一个过程,使得软件能够适应不同语言...

    spring3.0_doc_api

    4. **Bean工厂(Bean Factory)**:Spring IoC容器的基础实现,负责实例化、配置、装配和管理bean。 5. **ApplicationContext**:高级的bean工厂,除了基本的bean管理功能外,还提供了消息源、国际化、事件传播等...

    尚学堂_Spring_0600_IOC_Bean_Scope

    在Spring中,Bean是那些由容器管理的对象,它们通过XML、注解或Java配置的方式定义,并由Spring容器实例化、装配和管理。 接下来,我们要了解Bean的Scope。在Spring中,Bean可以有多种Scope,包括: 1. **...

    Spring——jar包详解

    它解析XML或Java注解配置,创建并管理bean实例。同时,它也支持AOP(面向切面编程)的配置。 3. **Spring Context**: 建立在Core和Beans之上,`spring-context.jar`提供了一个配置应用上下文的框架,可以处理国际化...

    4Spring自动装配——annotation resource方式

    首先,Spring会扫描并创建所有定义的Bean实例。然后,对于标注了`@Autowired`或`@Resource`的字段、方法或构造函数,Spring会执行自动装配的过程。 在`DefaultListableBeanFactory`中,`doResolveDependency`方法...

    Spring源码解析.pdf

    - 使用`getInstantiationStrategy`方法确定Bean实例化策略,选择合适的实例化方式(如默认构造器、静态工厂方法或实例工厂方法等)。 #### 五、Bean的生命周期管理 - **创建阶段**: - 构造器实例化。 - 设置...

    Spring整合JMS——实现收发消息

    &lt;bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt; &lt;/bean&gt; &lt;bean id="messageListener" class="com.example.MyMessageListener" /&gt; ``` `...

    撸一撸Spring Framework-IoC-BeanDefinition(csdn)————程序.pdf

    一旦BeanDefinition被创建并注册,Spring容器就可以根据这些信息在需要时创建bean实例,并管理它们的生命周期。 总结来说,BeanDefinition是Spring IoC容器的核心组成部分,它封装了bean的所有配置信息,使容器能够...

    Spring入门操作代码,bean

    然后,Spring容器可以通过XML配置或注解方式创建并初始化这个bean,当需要新增客户时,从容器中获取Customer bean实例,填充数据并调用相应的服务方法来保存到数据库。 客户信息查询:查询操作通常涉及到Spring的...

Global site tag (gtag.js) - Google Analytics