Spring实战笔记2---Bean的装配

创建应用对象之间协作关系的行为通常成为装配,该篇的主要内容有两个,一个Spring装配Bean的几种方式以及Spring表达式,其实这两者是分不开的,在Spring中,对象无需自己负责查找或者创建与其关联的其他对象,相反容器负责把需要相互协作的对象一引用赋予各个对象,目前我们先说声明式的装配,注解式的装配等溜到下篇再详细记录,在声明用的xml配置文件中,可以使用表达式来完成一些简单的逻辑处理,和方法调用或者对象引用,在有些特殊的需求当中非它莫属,首先是装配Bean

声明Bean

<bean id="duke" class="com.springinaction.springidol.Juggler"/ >

该语句在Spring容器中声明了一个类型为com.springinaction.springidol.Juggler的对象,使用id为duke来引用该对象,这里说一句,在Spring容器中,对象之间的引用都是通过依赖注入的方式引用的,也就是说是通过xml配置文件来配置类和类之间的关系。

通过构造器注入

<bean id="duke" class="com.springinaction.springidol.Juggler" >
	<constructor-arg value="15"/>
</bean>

在Juggler类中有一个只有一个入参的构造器,参数类型是int,我们通过<bean>标签下的<constructor-arg>标签来定义入参的值,如果没有该标签,那么Spring容器将会调用Juggler类的默认构造器,如果该类中存在多个构造器,那么Spring容器根据传入的参数个数以及类型选择参数数量组多的那个构造器

上边的例子只为Juggler类注入了一个简单值的参数,也就是String加上基本数据类型,如果参数类型是一个复杂类型的话,可以先生命一个该类型的Bean,然后在构造器注入的时候引用该类,如下

<bean id="duke" class="com.springinaction.springidol.Juggler" >
	<constructor-arg value="15"/>
	<constructor-arg ref="sonnet29"></constructor-arg>
</bean>

<bean id="sonnet29" class="com.springinaction.springidol.Sonnet29"/>

注意在第二个参数上把value属性换成了ref,ref的值是声明的某个Bean的id引用

通过工厂方法创建Bean

有时候静态工厂方法是实例化对象的唯一方法,比如说在使用单例模式的情况下,整个应用只允许有一个某类型的对象,这个时候就可以使用工厂方法创建Bean了,但是在类中需要提供静态的工厂方法来获得实例,以下是一个单例的例子,具体变量的含义不用太在意,只是说一下创建的方式

package com.springinaction.springidol;

public class Stage {

	private Stage() {

	}

	private static class StageSingoletonHolder {
		static Stage instance = new Stage();
	}

	public static Stage getInstance() {
		return StageSingoletonHolder.instance;
	}
}

这个类中的静态工厂方法是getInstance(),在配置应用上下文文件的时候,就不能按照正常方式声明Bean了,因为不能再通过构造方法来创建对象,Spring提供了一个factory-method 属性,可以定义Bean的静态工厂方法,配置如下

<bean id="stage" class="com.springinaction.springidol.Stage"
	factory-method="getInstance" />

在创建容器的时候Spring机会通过getInstance创建对象了

Bean的作用域

在声明Bean的时候可以设置Bean的作用域,目前这个阶段用到的就只有两个属性值,其他的等到后续碰到的时候再来学习,请看如下两个配置

<bean id="duke" class="com.springinaction.springidol.Juggler"
	scope="singleton" />

<bean id="duke" class="com.springinaction.springidol.Juggler"
	scope="prototype" />

singleton代表在该Spring容器中这个定义的Bean只能有一个实例,prototype代表在该Spring容器当中每次调用方法获得Bean的时候多会生成一个新的实例,有必要讨论一下的就是singleton,如果没有设置scope,那么该值就是默认值,主要想说一下这个单一实例的含义,该单例跟上述静态工厂方法的单例是截然不同的,该单例方式是针对于Spring容器的也就是应用上下文中的单例,在调用应用上下文对象的getBean()方法获得指定的bean的时候如果没有设置prototype值,那么应用上下文对象就会从容器中找到已经生成好的该Bean的对象返回回来,如果设置了prototype值,那么在每次调用getBean的时候都会生成一个新的Bean对象。如果其他的应用上下文中也有声明该类型的Bean那么也会在其他应用上下文中穿件新的对象,甚至实在同一个应用上下文中定义了两个该类型的Bean也会生成两个对象,只不过id引用不一样而已,所以说这并不是纯粹上的单例模式。

初始化和销毁Bean

实例化一个Bean或者从容器中移除一个Bean的时候可能需要做一些额外的处理,所以Spring提供了定义初始化和销毁时候的方法配置如下

<bean id="duke" class="com.springinaction.springidol.Juggler"
		init-method="turnOnLights" destroy-method="turnOffLights" />

init-method属性定义了Bean初始化时候调用的方法,destrory-method属性定义了Bean销毁时调用的方法,如果为每一个Bean都声明这样的两个方法未免太过麻烦,所以Spring还提供过了定义默认初始和销毁方法配置如下

<?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-3.0.xsd"
	default-init-method="turnOnLights"
	default-destroy-method="turnOffLights"></beans>

在beans标签中定义default-init-method和default-destroy-method方法在期中定义的Bean中,每个bean的默认初始化和销毁方法都会是上边定义的两个方法。

注入Bean属性

通常javaBean的属性都是私有属性,只能通过相应的getter和setter方法,Spring的注入属性的方法也是通过配置xml配置文件,先来说一说有注入的方式,再来看具体的配置方法。

注入Bean的属性是通过<property>标签来完成,属性分为一下几种:

*注入简单值(String或者基本数据类型)

*注入其他的Bean(注入相同类型的已经是声明的bean)

*注入内部Bean(类似于内部类)

*注入集合

*注入空值

以下的配置文件将会一次展示上述的注入方式,配置文件如下

	<bean id="duke" class="com.springinaction.springidol.Juggler">
		<!-- 注入简单值 -->
		<property name="property1" value="property"></property>
		<property name="property2" value="15"></property>
		<!-- 注入其他Bean -->
		<property name="property3" ref="property3"></property>
		<!-- 注入内部Bean -->
		<property name="property4" >
			<bean class="com.springinaction.springidol.Property4"/>
		</property>
		<!-- 注入空值 -->
		<property name="property5" ><null/></property>
		<!-- 注入集合 -->
		<!-- List -->
		<property name="List">
			<list>
				<value>item1</value>
				<ref bean="item2"/>
				<bean class="com.springinaction.springidol.Item3"/>
				<null/>
			</list>
		</property>
		<!-- Set -->
		<property name="Set">
			<set>
				<value>item1</value>
				<ref bean="item2"/>
				<bean class="com.springinaction.springidol.Item3"/>
				<null/>
			</set>
		</property>
		<!-- Map -->
		<property name="Map">
			<map>
				<entry key="item1" value="item1"/>
				<entry key="item1" value-ref="item2"/>
				<entry key-ref="item3" value="item3"/>
			</map>
		</property>
		<!-- Properties -->
		<property name="props">
			<props>
				<prop key="item1">item1</prop>
			</props>
		</property>
	</bean>

从上往下整理一遍<property>标签中name属性代表的是Bean中属性的名称,value值代表的属性值,但是只能表示简单的值,ref可以引用一个已经声明的Bean,值是Bean的id,在引用简单值的时候Spring会根据属性的具体类型做自动的类型转换,所以我们看第二个注入值是一个字符串“15”,但是属性的类型是int。

我们可以在属性内部声明一个Bean当作是属性的值,这就是所说的注入内部Bean,该Bean只在属性标签内才有用,和内部类的特性比较像,但是不能像内部类一样创建一个静态公开的内部类,可以在类以外调用,在Spring中内部bean是不能被外部引用的。

Spring提供了注入控值的配置,也就是给属性注入null值使用<null/>标签。

如果属性的类型是集合,我们不必去集成一个集合类然后通过注入bean的方式注入,可以直接利用Spring提供的集合标签来注入。

首先是List由标签<list>表示,在该标签中有四种表示值的方式,我都已经列出来了,简单值、Bean引用、内部Bean、空值。

再是Set 由标签<set>表示,set和list的作用差不多,但是在set中不能出现重复的值

然后是Map由标签<map>表示,该标签下的<entry>标签表示的是map中的一个元素,分别有一下四种属性值key、key-ref、value、value-ref,map的键值可以是任何类型的值,简单值使用不带ref后缀的属性,Bean引用使用带ref后缀的属性引入Bean。

最后是Properties由标签<props>表示,props中的键值只能是String类型的值,<prop>代表了Properties中的一个元素,具体配置方法见上边的配置示例。

Spring实战笔记2---Bean的装配

时间: 2024-12-11 07:03:44

Spring实战笔记2---Bean的装配的相关文章

Spring实战笔记4---Spring的自定装配与自动检测

Spring的自动装配与自动检测是为了最小化Spring XML配置,如果我们有很多的Bean要装配到spring 容器中,那么我们的配置文件将会看起来很长很长,让人觉得头晕,适当的使用自动装配与自动检测,将有助于缓解以上提到的问题 *自动装配:(autowiring) 有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系. *自动检测:(autodiscovery) 比自动装配更进一步,让Spri

[Spring实战系列](9)装配集合

前两篇文章中,我们已经了解了如何使用Spring 配置简单属性值(使用value 属性)和引用其他Bean 的属性(使用ref 属性).但是value 和ref 仅在Bean 的属性值是单个值的情况下才有用.当Bean 的属性值是集合,Spring 该如何配置呢? 当配置集合类型的Bean属性时,Spring 提供了4 种类型的集合配置元素. 集合元素 用途 <list> 装配list类型的值,允许重复. <set> 装配set类型的值,不允许重复. <map> 装配m

Spring实战笔记3---使用表达式

如果用过jsp表达式的人见到Spring表达是,第一反应一定会是:奥,原来是它呀(应该有不同的版本).Spring表达式和jsp的表达式是大同小异,只要之前接触过jsp表达式,那么学习Spring的表达式那就是非常容易的事情了. 首先来说一下Spring表达式的一些特性,也可以说成是一些用法: *使用Bean的id来引用Bean: *调用方法和访问对象的属性: *对值进行算数.关系和逻辑运算: *正则表达式匹配 *集合操作 Spring表达式(SpEL)使用#()来标记的(jsp是使用$()),

Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.kejian.spring.bean.autowire.Student" p:name="Tony" autowire="byName"></bean> 1.2 类型 byName 目标bean的id与属性名一置,若不匹配置为null byTy

Spring学习笔记--注入Bean属性

这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.springframework.context.ApplicationContext; import org.springframework.context.support.Clas

Spring实战笔记:Spring核心(二)

spring core 面向切面的Spring 1.AOP:面向切面编程 在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面. AOP框架是Spring的一个重要组成部分.但是Spring IoC容器并不依赖于AOP,这意味着你有权利选择是否使用AOP,AOP做为Spring IoC容器的一个补充,使它成为一个强大的中间件解决方案. AOP在Spring Framework中的作用 提供声明式企业服务,特别是为了替代EJB声明式服务.最重要的服务是声明性事务管理.

Spring学习四、Bean自动装配与注解开发

七.Bean的自动装配 自动装配是Spring满足bean依赖的一种方式! Spring会在上下文中自动寻找bean,自动装备属性 在Spring中有三种自动装配方式 在xml中显示配置 在Java中显示配置 隐式的自动装配[重要] 7.1 测试 环境搭建:一个人两个宠物 7.2 ByName自动装配 <!-- ByName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid --> <bean id="people" class="c

Spring MVC系列-(2) Bean的装配

2. Bean的装配 Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系.Spring提供了三种主要的装配机制: XML显式配置: Java配置类进行显式配置: 隐式的bean发现机制和自动装配. 推荐使用Java配置类结合隐式的自动bean扫描机制. 2.1 通过XML装配Bean XML配置是Spring刚出现时的主要配置方式.这种方式需要手动编写XML,并在其中配置好Bean的定义. 创建XML并定义Bean 下面是Person类的定义, public class

spring实战笔记一

1.是什么? Spring是一个开源的框架,是为了解决企业级应用开发的复杂性而创建的.  简而言之,Spring是为简化Java开发而创建的. 2.如何简化开发? 为了降低java开发的复杂性,Spring采用了4中关键策略.  ①基于POJO的轻量级和最小侵入性编程  ②通过依赖注入和面向接口实现松耦合  ③基于切面和惯例进行声明式编程  ④通过切面和模板减少样板式代码 3.bean的生命周期 在传统的java应用中,bean的生命周期很简单.new关键字实例化,不用时被自动回收. 但在Spr