本章主要继续介绍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主要有两种方式:XML配置和注解配置。在本例中,我们将重点关注XML配置,对应的压缩包文件名为“springxmldemo”,...
5. **@Autowired** - 自动装配Bean,可以根据类型或名称进行匹配。 6. **@Resource** - 类似于@Autowired,但更侧重于根据名称来装配。 7. **@Qualifier** - 当有多个相同类型的Bean时,可以通过指定名称进行精确...
在探讨Spring 3.X企业应用开发过程中,第四章的内容聚焦于如何在Spring框架的核心组件——IoC(控制反转)容器中装配Bean。在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的...
在Spring框架中,动态装配bean并将其注入到Controller中是一种常见的需求,这允许我们根据运行时的条件或配置来创建和管理对象。本篇将详细解释两种实现方式:基于XML配置和使用`@PostConstruct`注解。 首先,让...
Spring装配Bean的3种方式总结 Spring框架是Java EE应用程序的核心框架之一,它提供了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)等功能。依赖注入是Spring框架的核心...
Spring通过组件扫描(Component Scanning)和自动装配(Autowiring)来实现这一目标,使得开发者无需手动配置大部分bean的依赖关系。 首先,我们来看组件扫描。组件扫描允许Spring容器自动发现应用上下文中创建的...
6. **Autowiring-mode**:定义了如何自动装配Bean。Spring支持按类型、按名称等多种自动装配模式。 7. **Lazy-initialization-mode**:懒加载模式,表示Bean是否在容器启动时立即创建,还是在首次请求时创建。 8. ...
在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
Spring自动装配Bean实现过程详解 Spring框架提供了自动装配Bean的功能,该功能可以根据Bean的属性名称或类型自动将Bean装配到其他Bean中,从而简化了Bean的配置工作。在本文中,我们将详细介绍Spring自动装配Bean...
二、Bean的作用域 Bean的作用域是指Bean的生命周期和可用性。Spring框架提供了多种作用域,例如 singleton、prototype、request、session、globalSession等。 1. singleton:这是默认的作用域,表示每个应用程序中...
Spring Boot 中的条件装配 Bean 的实现 在 Spring Boot 框架中,条件装配 Bean 是一种非常重要的机制,它允许在 Bean 装配时增加前置条件判断。这种机制从 Spring Framework 3.1 开始引入,目的是为了提供一种更加...
装配bean——集合类型注入值: 本文介绍数组、list集合、set集合、map集合、properties的注值 博客原文地址:http://blog.csdn.net/tingzhiyi/article/details/52104203
以上就是Spring使用注解方式装配Bean的基本过程和关键注解的介绍。通过这种方式,我们可以轻松地管理Bean的生命周期,实现依赖注入,以及对Bean的其他配置,极大地提高了代码的可维护性和灵活性。在实际项目中,结合...
Spring装配bean方法实例总结 Spring框架中,bean的装配是非常重要的一个步骤,它可以通过多种方式来实现,包括XML配置、Java配置和自动装配等。下面是Spring装配bean方法实例总结。 一、XML配置 在Spring框架中...
3. **依赖注入(DI)** Spring的依赖注入允许bean之间通过接口而非具体实现进行耦合,提高了代码的可测试性和可维护性。依赖注入有两种方式: - **设值注入(setter注入)**:通过setter方法设置依赖的bean。 - **...
3. Spring Bean 的实例化策略 - 单例(Singleton):默认模式,Spring容器只为每个Bean定义一个实例,全局共享。 - 原型(Prototype):每次请求都会创建一个新的Bean实例。 - 作用域(Scope):还包括请求...
运行环境eclipse。其Dynamic Web Project,Target Runtime为Apache Tomcat v8.5,Dynamic web module version 为 3.1。 目的:Spring容器已经成功获取了UserController实例,并通过调用实例中的方法执行了各层中的...
二、Bean 基本配置 Bean 的基本配置包括 Bean 的命名、依赖注入和自动装配等。 2.1 Bean 的命名 Bean 的命名可以使用 id 和 name 属性指定多个名字,名字之间用逗号、分号或空格进行分隔。如果没有指定 id 和 ...
在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...
Spring 中自动装配 Bean 的属性 在 Spring 框架中,自动装配 Bean 的属性是非常重要的一部分,今天我们将为大家分享关于在 Spring 中自动装配 Bean 的属性的知识。 首先,Spring 的最基本的能力就是 DI,即依赖...