`
DynamicMan
  • 浏览: 25473 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

3.装配bean(二)

 
阅读更多

        本章主要继续介绍spring基于XML装配bean的知识,主要介绍spring对属性的注入。

 设值注入简单值和引用其他bean:

 

package org.robbie.test.spring.beans;

public interface Instrument {
	void play();
}

 

package org.robbie.test.spring.beans;

public class Flute implements Instrument {

	@Override
	public void play() {
		System.out.println("play flute");
	}

}

 

package org.robbie.test.spring.beans;

import org.robbie.test.spring.exception.PerformerException;
import org.robbie.test.spring.inf.Performer;

public class Instrumentalist implements Performer {

	private String song;

	private Instrument instrument;

	public Instrumentalist() {
	}

	@Override
	public void perform() throws PerformerException {
		
	}

	public String getSong() {
		return song;
	}

	public void setSong(String song) {
		this.song = song;
	}

	public Instrument getInstrument() {
		return instrument;
	}

	public void setInstrument(Instrument instrument) {
		this.instrument = instrument;
	}

}

 

<?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">

	<bean id="instrumentalist" class="org.robbie.test.spring.beans.Instrumentalist">
		<property name="instrument" ref="flute"></property>
		<property name="song" value="god is a girl"></property>
	</bean>
	<bean id="flute" class="org.robbie.test.spring.beans.Flute"></bean>
</beans>

 

 

注入内部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-3.0.xsd">

	<bean id="instrumentalist" class="org.robbie.test.spring.beans.Instrumentalist">
		<property name="instrument">
			<bean class="org.robbie.test.spring.beans.Flute"></bean>
		</property>
		<property name="song" value="god is a girl"></property>
	</bean>
</beans>

 内部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-3.0.xsd">

	<bean id="instrumentalist" class="org.robbie.test.spring.beans.Instrumentalist">
		<constructor-arg>
			<bean class="org.robbie.test.spring.beans.Flute"></bean>
		</constructor-arg>
		<property name="song" value="god is a girl"></property>
	</bean>
</beans>

从上面的例子可以看出, 内部bean适用于一次性注入,不能被复用,也没有ID(可以给ID,但是没有用处),并且影响XML的可读性,这样的配置方式比较少见,在项目中谨慎适用。

 

 

适用命名空间装配属性

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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">

	<bean id="instrumentalist" class="org.robbie.test.spring.beans.Instrumentalist"
		p:song="god is a girl" p:instrument-ref="flute">
	</bean>
	<bean id="flute" class="org.robbie.test.spring.beans.Flute"></bean>
</beans>

 上面的例子增加了一段命名空间配置:

 

 

xmlns:p="http://www.springframework.org/schema/p"

 

 

装配集合属性

集合元素 用途
<list> 装配list类型的值,允许重复
<set> 装配set类型的值,不允许重复
<map> 装配map类型的值,名称和值可以为任意类型
<props> 装配properties类型的值,名称和值必须为string类型

 

装配List,Set和Array

 

package org.robbie.test.spring.beans;

import java.util.Collection;

public class Band {

	private Collection<Instrument> instruments;

	public Collection<Instrument> getInstruments() {
		return instruments;
	}

	public void setInstruments(Collection<Instrument> instruments) {
		this.instruments = instruments;
	}
}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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">
           
	<bean id="flute" class="org.robbie.test.spring.beans.Flute"></bean>
	<bean id="guita" class="org.robbie.test.spring.beans.Guita"></bean>
	<bean id="piano" class="org.robbie.test.spring.beans.Piano"></bean>
	<bean id="band" class="org.robbie.test.spring.beans.Band">
		<property name="instruments">
			<list>
				<ref bean="flute" />
				<ref bean="guita" />
				<ref bean="piano" />
			</list>
		</property>
	</bean>
</beans>

 如果属性不为集合,而是数组,例如Instrument[] instruments也同样适用以上配置。

 

以下为Set集合装配

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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">
           
	<bean id="flute" class="org.robbie.test.spring.beans.Flute"></bean>
	<bean id="guita" class="org.robbie.test.spring.beans.Guita"></bean>
	<bean id="piano" class="org.robbie.test.spring.beans.Piano"></bean>
	<bean id="band" class="org.robbie.test.spring.beans.Band">
		<property name="instruments">
			<set>
				<ref bean="flute" />
				<ref bean="guita" />
				<ref bean="piano" />
			</set>
		</property>
	</bean>
</beans>

 

 

Map集合装配

 

package org.robbie.test.spring.beans;

import java.util.Map;

public class Band {

	private Map<String, Instrument> instruments;

	public Map<String, Instrument> getInstruments() {
		return instruments;
	}

	public void setInstruments(Map<String, Instrument> instruments) {
		this.instruments = instruments;
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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">
           
	<bean id="flute" class="org.robbie.test.spring.beans.Flute"></bean>
	<bean id="guita" class="org.robbie.test.spring.beans.Guita"></bean>
	<bean id="piano" class="org.robbie.test.spring.beans.Piano"></bean>
	<bean id="band" class="org.robbie.test.spring.beans.Band">
		<property name="instruments">
			<map>
				<entry key="flute" value-ref="flute"></entry>
				<entry key="guita" value-ref="guita"></entry>
				<entry key="piano" value-ref="piano"></entry>
			</map>
		</property>
	</bean>
</beans>

 

属性 用途
key 指定map中entry的键为String
key-ref 指定map中entry的键为spring上下文中其他bean的引用
value 指定map中entry的值为String
value-ref 指定map中entry的值为spring上下文中其他bean的引用

 

装配properties集合

 

package org.robbie.test.spring.beans;

import java.util.Properties;

public class Band {

	private Properties instruments;

	public Properties getInstruments() {
		return instruments;
	}

	public void setInstruments(Properties instruments) {
		this.instruments = instruments;
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p"
	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">
           
	<bean id="band" class="org.robbie.test.spring.beans.Band">
		<property name="instruments">
			<props>
				<prop key="guita" >guita</prop>
				<prop key="piano" >piano</prop>
				<prop key="flute" >flute</prop>
			</props>
		</property>
	</bean>
</beans>

 

 

装配空值:

在某些特定情况下,如果全局变量给定了一个默认的值,但是在创建对象的时候,又想为整个变量设置为空时,可以采用spring的空值注入。

 

<property name="instruments"><null /></property>

 

 

使用表达式装配:

        之前所有的基于XML的装配都成为静态装配,如果在某些时候需要在运行期动态的对spring bean进行装配的话需要用到springEL(Spring Expression Language),springEL是用一种表达式,通过计算在运行期进行bean的装配,包括对属性和构造参数的装配等,通过使用springEL可以达到难以想象的动态装配效果。

SpringEL拥有很多特性,包括:

使用bean的ID来引用bean
调用方法和访问对象的属性
对值进行算术、关系、逻辑运算
正则表达式匹配
集合操作

 

SpringEL中的字面值:

整形:

 

<property name="property" value="#{5}"></property>

 浮点型:

 

 

<property name="property" value="#{89.3}"></property>

 科学计数:

 

 

<property name="property" value="#{1e4}"></property>

 字符串型:

 

 

<property name="name" value="#{'name'}"></property>

 

<property name="name" value='#{"name"}'></property>

 单引号和双引号都支持

布尔型:

 

<property name="name" value="#{false}"></property>

 

 

引用bean、properties和方法

通过bean的id引用bean:

 

<property name="property" value="#{otherBean}"></property>

 引用其他bean的属性:

 

 

<property name="property" value="#{otherBean.property}"></property>

 引用其他bean的调用方法:

 

 

<property name="name" value="#{otherBean.method()}"></property>

 

 可以调用工具方法进行结果处理:

 

<property name="name" value="#{otherBean.method().toUpperCase()}"></property>

 

 如果方法返回空值,则会抛出异常,如果要避免异常出现可以使用如下写法:

 

<property name="name" value="#{otherBean.method()?.toUpperCase()}"></property>

 

 操作类

调用静态方法和属性以及常量可以使用:

 

<property name="name" value="#{T(java.lang.Math).PI}"></property>

 在SpEL上执行的操作:

 

运算符类型 运算符
算数运算 +,-,*,/,%,^
关系运算 <,>,==,>=,<=,It,gt,,le,ge,eq
逻辑运算 and, or , not, |
条件运算 ?:
正则表达式 matchs

数值运算:

 

<property name="name" value="#{juggler.total + 40}"></property>
<property name="name" value="#{juggler.total / 40}"></property>
<property name="name" value="#{juggler.total * 40}"></property>
<property name="name" value="#{juggler.total % 40}"></property>

 比较运算:

 

 

<property name="name" value="#{juggler.total == 40}"></property>
<property name="name" value="#{juggler.total > 40}"></property>
<property name="name" value="#{juggler.total lt 40}"></property>

逻辑运算:

 

 

<property name="name" value="#{juggler.total > 40 and juggler.total < 80}"></property>
<property name="name" value="#{juggler.total > 40 or juggler.total < 80}"></property>
<property name="name" value="#{not juggler.total > 40}"></property>

 三元运算:

 

 

<property name="name" value="#{juggler.total == 40 ? '1' : '2'}"></property>

 三元运算变体:

 

 

<property name="name" value="#{juggler.total ?:  '2'}"></property>

 以上表达为如果juggler.total不为空则为本身的值,如果为空就为2

 

正则表达式:

 

<property name="name" value="#{juggler.name matchs '[a-zA-z0-9._%+-]+'}"></property>

 

 

在SpEL中筛选集合:

 

<property name="name" value="#{cities[2]}"></property>
 

 cities为在spring中定义的集合,该例为方位该集合中的第三个元素

 

调用集合中的方法:

 

<property name="name" value="#{cities[2].size()}"></property>

 访问map集合:

 

 

<property name="name" value="#{cities['key']}"></property>

 读取properties文件中的值:

 

 

<util:properties id="settings" location="classpath:settings.properties"></util:properties>  
	<bean id="flute" class="org.robbie.test.spring.beans.Flute">
		<property name="name" value="#{settins['name']}"></property>
	</bean>

 访问spring内置特殊属性的值:

 

访问环境变量:

 

<property name="name" value="#{systemEnvironment['JAVA_HOME']}"></property>

 访问启动参数:

 

<property name="name" value="#{systemProperties['application.home']}"></property>

 

 

查询集合成员:

使用.?[]

 

<property name="bigCities" value="#{cities.?[population gt 10000]}"></property>

 查询集合cities中人口数大于10000的城市元素,并将这些元素注入进属性当中

 

查询第一个匹配项:

 

<property name="bigCities" value="#{cities.^[population gt 10000]}"></property>

 查询集合cities中第一个匹配人口大于10000的元素,并进行属性注入

 

查询最后一个匹配项:

 

<property name="bigCities" value="#{cities.$[population gt 10000]}"></property>

  查询集合cities中最后一个匹配人口大于10000的元素,并进行属性注入

 

 

 

投影集合(根据某种条件筛选出一个新的集合)

 

<property name="bigCities" value="#{cities.![name]}"></property>

 把集合cities中每个元素的name属性进行重新组织,形成一个新的集合,然后将这个新的集合注入进属性当中

先查询集合再投影集合:

<property name="bigCities" value="#{cities.?[population gt 10000].![name]}"></property>

 在cities中查询人口大于10000的元素,并把这个元素的name属性的值重新组织成一个新的集合,将这个新的集合注入进属性当中

 

        SpEL非常的灵活,但是最终只是一组字符串的表达式,没有任何的校验,容易出现错误,按照书籍理解,如果传统的装配方式不能够满足时,再考虑SpEL方式进行装配。

 

 

分享到:
评论

相关推荐

    spring装配bean实例代码

    本文将深入探讨Spring装配Bean的实例代码,帮助你更好地理解这一关键概念。 首先,Spring装配Bean主要有两种方式:XML配置和注解配置。在本例中,我们将重点关注XML配置,对应的压缩包文件名为“springxmldemo”,...

    基于java的企业级应用开发:Bean的装配方式.ppt

    5. **@Autowired** - 自动装配Bean,可以根据类型或名称进行匹配。 6. **@Resource** - 类似于@Autowired,但更侧重于根据名称来装配。 7. **@Qualifier** - 当有多个相同类型的Bean时,可以通过指定名称进行精确...

    第四章 在Ioc容器中装配Bean

    在探讨Spring 3.X企业应用开发过程中,第四章的内容聚焦于如何在Spring框架的核心组件——IoC(控制反转)容器中装配Bean。在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的...

    动态的装配bean,注入到Controller中

    在Spring框架中,动态装配bean并将其注入到Controller中是一种常见的需求,这允许我们根据运行时的条件或配置来创建和管理对象。本篇将详细解释两种实现方式:基于XML配置和使用`@PostConstruct`注解。 首先,让...

    spring装配bean的3种方式总结

    Spring装配Bean的3种方式总结 Spring框架是Java EE应用程序的核心框架之一,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能。依赖注入是Spring框架的核心...

    基于框架的Web开发-装配Bean自动装配.doc

    Spring通过组件扫描(Component Scanning)和自动装配(Autowiring)来实现这一目标,使得开发者无需手动配置大部分bean的依赖关系。 首先,我们来看组件扫描。组件扫描允许Spring容器自动发现应用上下文中创建的...

    spring入门学习-3、Bean装配(XML).pdf

    6. **Autowiring-mode**:定义了如何自动装配Bean。Spring支持按类型、按名称等多种自动装配模式。 7. **Lazy-initialization-mode**:懒加载模式,表示Bean是否在容器启动时立即创建,还是在首次请求时创建。 8. ...

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    Spring自动装配Bean实现过程详解

    Spring自动装配Bean实现过程详解 Spring框架提供了自动装配Bean的功能,该功能可以根据Bean的属性名称或类型自动将Bean装配到其他Bean中,从而简化了Bean的配置工作。在本文中,我们将详细介绍Spring自动装配Bean...

    详解Spring中Bean的生命周期和作用域及实现方式

    二、Bean的作用域 Bean的作用域是指Bean的生命周期和可用性。Spring框架提供了多种作用域,例如 singleton、prototype、request、session、globalSession等。 1. singleton:这是默认的作用域,表示每个应用程序中...

    spring boot中的条件装配bean的实现

    Spring Boot 中的条件装配 Bean 的实现 在 Spring Boot 框架中,条件装配 Bean 是一种非常重要的机制,它允许在 Bean 装配时增加前置条件判断。这种机制从 Spring Framework 3.1 开始引入,目的是为了提供一种更加...

    装配bean—集合类型注入值源码

    装配bean——集合类型注入值: 本文介绍数组、list集合、set集合、map集合、properties的注值 博客原文地址:http://blog.csdn.net/tingzhiyi/article/details/52104203

    day38 16-Spring的Bean的装配:注解的方式

    以上就是Spring使用注解方式装配Bean的基本过程和关键注解的介绍。通过这种方式,我们可以轻松地管理Bean的生命周期,实现依赖注入,以及对Bean的其他配置,极大地提高了代码的可维护性和灵活性。在实际项目中,结合...

    Spring装配bean方法实例总结

    Spring装配bean方法实例总结 Spring框架中,bean的装配是非常重要的一个步骤,它可以通过多种方式来实现,包括XML配置、Java配置和自动装配等。下面是Spring装配bean方法实例总结。 一、XML配置 在Spring框架中...

    SpingIOC注入实例化bean

    3. **依赖注入(DI)** Spring的依赖注入允许bean之间通过接口而非具体实现进行耦合,提高了代码的可测试性和可维护性。依赖注入有两种方式: - **设值注入(setter注入)**:通过setter方法设置依赖的bean。 - **...

    粗略实现spring创建bean

    3. Spring Bean 的实例化策略 - 单例(Singleton):默认模式,Spring容器只为每个Bean定义一个实例,全局共享。 - 原型(Prototype):每次请求都会创建一个新的Bean实例。 - 作用域(Scope):还包括请求...

    Spring中的Bean的管理_Bean的装配方式_基于注解的装配_项目

    运行环境eclipse。其Dynamic Web Project,Target Runtime为Apache Tomcat v8.5,Dynamic web module version 为 3.1。 目的:Spring容器已经成功获取了UserController实例,并通过调用实例中的方法执行了各层中的...

    spring在IoC容器中装配Bean详解

    二、Bean 基本配置 Bean 的基本配置包括 Bean 的命名、依赖注入和自动装配等。 2.1 Bean 的命名 Bean 的命名可以使用 id 和 name 属性指定多个名字,名字之间用逗号、分号或空格进行分隔。如果没有指定 id 和 ...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...

    在Spring中自动装配Bean的属性

    Spring 中自动装配 Bean 的属性 在 Spring 框架中,自动装配 Bean 的属性是非常重要的一部分,今天我们将为大家分享关于在 Spring 中自动装配 Bean 的属性的知识。 首先,Spring 的最基本的能力就是 DI,即依赖...

Global site tag (gtag.js) - Google Analytics