前言:Spring容器就是一个超级大工厂,而Spring容器中的Bean就是该工厂的产品,Spring容器能产生哪些产品,则完全取决于开发者在配置文件中的配置。本文就配置Bean时可添加的属性、功能做介绍,基本覆盖开发中的常规功能。
本篇文章重点关注以下问题:
1. Bean的基本定义和属性
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="pencil" class="com.wj.chapter1.ioc.constructor.xml.Service.Pencil"></bean>
<bean id="ballpointPen" class="com.wj.chapter1.ioc.constructor.xml.Service.BallpointPen"></bean>
</beans>
1.1 配置文件根元素<beans>
<beans../>元素是Spring配置文件的根元素,该元素可以指定如下属性:
- default-lazy-init:指定该 <beans../>元素下配置的所有Bean默认的延迟初始化行为;(默认false)
- default-merge:指定该 <beans../>元素下配置的所有Bean默认的merge行为(继承父Bean属性);(默认true)
- default-autowire:指定该 <beans../>元素下配置的所有Bean默认的自动装配行为;(默认no)
- default-autowire-candidates:指定该 <beans../>元素下配置的所有Bean默认是否作为自动装配的候选Bean;
- default-init-method:指定该 <beans../>元素下配置的所有Bean默认的初始化方法;
- default-destroy-method:指定该 <beans../>元素下配置的所有Bean默认的回收方法。
1.2 配置<beans../>的子元素<bean../>
<beans../>元素可以包含多个<bean../>子元素,每个<bean../>子元素定义一个Bean,每个Bean对应Spring容器里的一个java实例。
定义Bean时,通常需要指定两个属性:id、class
id: 确定该Bean的唯一标识,容器对该Bean的管理、访问,以及该Bean的依赖关系,都通
过该属性完成。Bean的id属性在Spring容器中应该是唯一的;(字母开头,字母数字组成)
class:指定该Bean的实现类,而不是接口,通常情况下Spring会直接使用new关键字创建该
Bean的实例,因此,这里必须提供Bean的实现类的类名。
<bean../>元素的其他属性:
属性名 |
属性值类型 |
默认值 |
作用 |
abstract |
Boolean |
false |
指明该Bean作为父类,spring容器不会为该类创建对象 |
autowire-candidate |
Boolean |
true |
指明该Bean是否作为自动装配的候选Bean |
autowire |
String |
no |
指明该Bean是否采用自动装配及采用自动装配的规则 |
depends-on |
String |
—— |
显示指明该Bean依赖的其他Bean(确保依赖Bean先实例化) |
destroy-method |
String |
—— |
指明该Bean默认的回收方法 |
factory-bean |
String |
—— |
工厂方法创建对象时,指定工厂Bean |
factory-method |
String |
—— |
工厂方法创建对象时,指定工厂Bean中创建对象的方法 |
init-method |
String |
—— |
指明该Bean默认的初始化方法 |
lazy-init |
Boolean |
false |
指明该Bean的延迟初始化行为(只对单例模式起作用) |
name |
String |
—— |
指明该Bean的别名alias,可以有多个,可以其他Bean重名 |
parent |
String |
—— |
指明该bean需要继承的父类Bean |
primary |
Boolean |
false |
自动装配若候选Bean不止一个,则此属性为true的Bean当选 |
scope |
String |
singleton |
指明该Bean的作用域 |
补充说明:
- autowire属性有五种模式:no(不采用自动装配)、byName(通过属性的名称自动装配)、byType(通过类型自动装配)、constructor(通过构造函数的参数类型来匹配)、default(采用父级标签,即beans的default-autowire属性的配置);
- scope属性有五种模式:singleton(单例模式)、prototype(多例模式)、request(该bean仅在当前HTTP request内有效)、session(该bean仅在当前HTTP session内有效)、global session(作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义)。
2. 配置Bean的依赖关系
Spring有两种依赖注入方式(设值注入和构造注入),但不管哪种注入,都需要为参数传入参数值,而java类的成员变量可以是各种数据类型,除了基本类型、字符串类型、还可以是其他java实例,也可以是java集合、数组等,所有Spring允许通过如下元素为setter方法、构造器参数指定参数值:
- value:指定参数值是基本类型及其包装、字符串类型;
- ref:指定参数值是容器中的另一个Bean实例;
- bean:指定参数值是一个嵌套Bean实例;
- list、set、map及props:指定参数值是集合。
2.1 各数据类型的成员变量在配置Bean时的注入方式
2.1.1 设置普通属性值
<!-- 设置普通属性值. -->
<bean id="valueDiBean" class="com.wj.chapter3.di.Di_Bean_Value">
<!-- 指定int型参数. -->
<property name="integerField" value="100"/>
<!-- 指定double型参数. -->
<property name="doubleField" value="99.99"/>
<!-- 指定String型参数. -->
<property name="stringField" value="一百分"/>
</bean>
2.1.2 配置合作者Bean
<!-- 配置合作者Bean. -->
<bean id="refDiBean" class="com.wj.chapter3.di.Di_Bean_Ref">
<property name="valueBean" ref="valueDiBean"></property>
</bean>
2.1.3 指定使用byName策略自动注入
<!-- 指定使用byName策略,Spring会根据setter方法的方法名与Bean的id(dependOnBeanTTT)进行匹配. -->
<bean id="byNameBean" class="com.wj.chapter3.di.byNameBean.ByNameBean" autowire="byName"/>
<!-- setDependOnBeanTTT(..)方法与id(dependOnBeanTTT)相对应. -->
<bean id="dependOnBeanTTT" class="com.wj.chapter3.di.byNameBean.ByNameDependOn">
<property name="name" value="熊燕子"/>
</bean>
2.1.4 指定使用byType策略自动注入
<!-- 指定使用byType策略,Spring会根据setter方法的参数类型与Bean的类型进行匹配. -->
<bean id="byTypeBean" class="com.wj.chapter3.di.byTypeBean.ByTypeBean" autowire="byType"/>
<bean id="dependOnBean1" class="com.wj.chapter3.di.byTypeBean.ByTypeDependOn1">
<property name="name" value="熊燕子1"/>
</bean>
<!-- autowire-candidate指明Bean不作为自动装配的候选Bean. -->
<bean id="dependOnBean2" class="com.wj.chapter3.di.byTypeBean.ByTypeDependOn2" autowire-candidate="false">
<property name="name" value="熊燕子2"/>
</bean>
2.1.5 注入嵌套Bean
<!-- 注入嵌套Bean(嵌套Bean不能被容器访问). -->
<bean id="outerBean" class="com.wj.chapter3.di.nestedBean.OuterBean">
<!-- 驱动调用outerBean的getInnerBean()方法,使用嵌套Bean作为参数 -->
<property name="innerBean">
<!-- 嵌套Bean配置的对象仅作为setter方法的参数嵌套Bean不能被容器访问,因此无需指定id属性-->
<bean class="com.wj.chapter3.di.nestedBean.InnerBean"/>
</property>
</bean>
2.1.6 注入集合值
<bean id="collectionBean" class="com.wj.chapter3.di.DI_Bean_Collection">
<property name="list">
<!-- 为调用setList()方法配置List集合作为参数值 -->
<list>
<value>List元素1</value>
<value>List元素2</value>
<value>List元素3</value>
</list>
</property>
<property name="set">
<!-- 为调用setSet()方法配置Map集合作为参数值 -->
<set>
<value>100</value>
<value>200</value>
<value>300</value>
</set>
</property>
<property name="map">
<!-- 为调用setMap()方法配置Map集合作为参数值 -->
<map>
<!-- 每个entry配置一个key-value对 -->
<entry key="熊燕子 " value-ref="dependOnBean1"/>
<entry key="wj" value-ref="dependOnBean2"/>
</map>
</property>
<property name="prop">
<!-- 为调用setProp()方法配置Properties集合作为参数值 -->
<props>
<!-- 每个prop元素配置一个属性项,其中key指定属性名 -->
<prop key="熊燕子">159</prop>
<prop key="wj">173</prop>
</props>
</property>
<property name="array">
<!-- 为调用setArray()方法配置数组作为参数值 -->
<list>
<value>小学</value>
<value>中学</value>
<value>大学</value>
</list>
</property>
</bean>
2.2 编写各实体Bean
这里不做阐述,详细代码可见附件;
2.3 编写测试代码
public class Main {
// 1.指明xml配置文件位置,便于Spring读取,从而知道Bean的相关信息
private static final String PATH_XML = "com/wj/chapter3/di/applicationContext-di.xml";
@SuppressWarnings("resource")
public static void main(String[] args) {
// 2.根据xml配置文件,创建Spring IOC容器的上下文
ApplicationContext cxt = new ClassPathXmlApplicationContext(PATH_XML);
// 3.设置普通属性值测试
Di_Bean_Value valuebean = cxt.getBean("valueDiBean", Di_Bean_Value.class);
System.out.println("**************设置普通属性值测试*************");
System.out.println("int类型:" + valuebean.getIntegerField());
System.out.println("double类型:" + valuebean.getDoubleField());
System.out.println("String类型:" + valuebean.getStringField());
System.out.println();
// 4. 配置合作者Bean测试
Di_Bean_Ref refBean = cxt.getBean("refDiBean", Di_Bean_Ref.class);
System.out.println("**************配置合作者Bean测试*************");
System.out.println("合作者Bean:" + refBean.toString());
System.out.println();
// 5. 指定使用byName策略测试
ByNameBean byNameBean = cxt.getBean("byNameBean", ByNameBean.class);
System.out.println("**************指定使用byName策略测试*************");
byNameBean.test();
System.out.println();
// 6. 指定使用byType策略测试
ByTypeBean byTypeBean = cxt.getBean("byTypeBean", ByTypeBean.class);
System.out.println("**************指定使用byType策略测试*************");
byTypeBean.test();
System.out.println();
// 7. 测试注入内嵌Bean
OuterBean outerBean = cxt.getBean("outerBean", OuterBean.class);
System.out.println("**************测试注入内嵌Bean*************");
outerBean.test();
System.out.println();
// 8. 测试注入集合值
DI_Bean_Collection collectionBean = cxt.getBean("collectionBean", DI_Bean_Collection.class);
System.out.println("**************测试注入集合值*************");
collectionBean.test();
}
}
2.4 查看测试结果,验证注入的正确性
可以看出,测试基本成功。
补充:Spring还支持组合属性的方式进行注入,但是这不常见,就没写入实例。
代码下载地址:http://pan.baidu.com/s/1mi0u4Q0,密码:p2yv
- 大小: 67.8 KB
分享到:
相关推荐
《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...
在探讨Spring 3.X企业应用开发过程中,第四章的内容聚焦于如何在Spring框架的核心组件——IoC(控制反转)容器中装配Bean。在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的...
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
配置文件中会定义Bean的定义,这些Bean是Spring容器管理的对象。 接下来,我们将创建一个简单的类`HelloWorld`,它包含一个返回问候消息的方法。这个类将成为我们的核心业务逻辑。为了使`HelloWorld`受Spring管理,...
举例来说,使用ClassPathXmlApplicationContext可以从classpath的XML配置文件中读取应用程序上下文,从而初始化Spring IoC容器,并加载应用程序中定义的所有bean。而FileSystemXmlApplicationContext则从文件系统中...
这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...
- **注意事项:**使用工厂方法时,Spring容器无法自动检测Bean的类型,因此在进行类型匹配或依赖注入时,需要明确指定Bean的类型。另外,如果工厂方法抛出异常,Spring容器会捕获并处理,导致Bean无法正常创建。 4...
该案例主要用于演示SpringBean的基本使用方法。 - **场景介绍**:通过一个简单的案例来展示如何在普元EOS中创建和使用SpringBean。 - **关键知识点**: - **SpringBean开发**:了解如何在EOS平台上创建和配置...
【Spring框架技术——容器和bean的基本原理】 Spring框架的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,简称IoC)。这一特性改变了传统组件调用的方式,使得...
Bean是容器中的基本单元,它们被容器初始化、装配和管理。Spring提供了XML、注解和Java配置三种方式来定义Bean的元数据。通过实例化容器,开发者可以获取并使用容器管理的Bean。文档详细解释了Bean的概念,包括命名...
在Java开发中,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。当我们需要在非Spring管理的普通类中调用Spring管理的bean对象时,需要掌握特定的方法。这篇文档将...
在Spring中,Bean是一个由Spring IoC容器管理的对象,它代表应用程序中的一个组件或服务。Bean可以通过XML配置文件、注解或Java配置类来定义。而自动扫描和管理Bean则是通过注解或配置文件中的包扫描设置实现的。 #...
总的来说,ApplicationContext作为Spring的核心组件,扮演着应用程序的“大脑”角色,它负责管理和协调整个Spring容器中的Bean。理解并掌握ApplicationContext的工作原理和使用技巧,对于深度开发和优化Spring应用至...
4. **环境与配置**:在`env.xml`中,我们可以配置环境相关的属性,比如系统属性、JNDI属性等。Spring Core允许我们在不同环境中轻松地切换配置,适应开发、测试和生产环境的需求。 5. **类型匹配与类型安全**:`...
当Spring容器扫描到这个注解时,会自动寻找类型匹配的bean进行注入。如果存在多个候选bean,可以通过`@Qualifier`注解指定特定的bean。 2. `@Qualifier` 注解:与`@Autowired`结合使用,用于在多个相同类型的bean中...
然后,Spring容器可以通过XML配置或注解方式创建并初始化这个bean,当需要新增客户时,从容器中获取Customer bean实例,填充数据并调用相应的服务方法来保存到数据库。 客户信息查询:查询操作通常涉及到Spring的...
综上所述,"Spring3.1.3 Ioc在Web容器中的建立"涵盖了Spring的核心特性之一——IoC,以及在Web环境下的具体配置和使用方法。这个过程涉及到Spring容器的初始化、bean的定义与依赖注入,以及Web应用的结构配置。通过...
在Spring Framework中,IoC(Inversion of Control,控制反转)是核心概念之一,它使得应用程序的组件不再直接创建依赖对象,而是由Spring容器来管理和维护。BeanDefinition就是实现这一概念的关键元素,它包含了...
Spring提供了多种策略来创建Bean实例,如使用无参构造函数、工厂方法或者Prototype模式。这里会涉及BeanFactory和ApplicationContext接口,以及InstantiationStrategy接口。 3. **依赖注入** 依赖注入是Spring的...
在Spring 2.5引入了注解支持后,开发者可以使用注解来声明Bean的属性、方法或构造函数中的依赖,而无需XML配置。`@Autowired`是Spring中最常见的注解,用于自动装配匹配类型的Bean。然而,`@Resource`注解则提供了另...