一,
创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质。
声明Bean:
从Spring3.0开始,Spring容器提供了两种配置Bean的方式,传统上,Spring使用一个或者多个XML作为配置文件,而Spring3.0同时还提供了基于Java注解的配置方式。
1.XML的配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
在beans元素内你可以放置所有的Spring配置信息,包括<bean>元素的声明。但是Bean命名空间并不是你遇到的唯一的Spring命名空间,Spring核心框架自带的10个命名空间配置。
aop:为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素。
beans:支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间。
context:为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Spring直接管理对象。
jee:提供了与Java EE API的集成,例如JNDI和EJB。
jms:为声明消息驱动的POJO提供了配置元素。
lang:支持配置由Groovy,JRuby或BeanShell等脚本实现的Bean。
mvc:启动Spring MVC的能力,例如面向注解的控制器,视图控制器和拦截器等
oxm:支持Spring的对象到XML映射配置
tx:提供声明式事物配置
util:提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素。
Bean声明:
<bean id="newBean" class="类所在的路径"> <bean>是Spring元素最基本的配置单元,通过该元素Spring将创建一个对象,这里创建了一个由Spring容器管理的名字为newBean的Bean,id属性定义了Bean的名字,也作为该Bean在Spring容器中的引用。
通过构造器注入:在构造Bean的时候,我们可以使用<constructor-arg value=" "||ref=" ">元素来告诉Spring的额外信息。
对于没有公开的构造方法,我们通过工厂方法创建Bean,有时候静态工厂方法是实例化对象的唯一方法,Spring支持通过<bean>元素的factory-method属性来装配工厂创建的Bean,.
public class Stage{
private Stage(){
}
private static class StageSingletonHolder(){
static Stage instance=new Stage();
}
public static getInstance(){
return StageSingletonHolder.instance;
}
}
<bean id="stage" class="com.jt.Stage" factory-method="getInstance">
Spring Bean的作用域:
所有的Spring Bean默认都是单例,当容器分配一个Bean时(无论是通过装配还是调用容器的getBean()方法),它总是返回一个相同的Bean实例。但有时我们需要每次请求都获得一个唯一的Bean实例。
Bean的作用域:
singleton:在每一个Spring容器中,一个Bean定义只有一个实例(默认)
prototype:允许Bean的定义可以被实例化任意次(每次调用都创建一个实例)
request:在一次HTTP请求中,每个Bean对应一个实例,该作用域仅基于web的Spring上下文(例如Spring MVC)中才有效。
session:在一个HTTP SESSION中,每个Bean对应一个实例,该作用域仅在基于web的Spring上下文中才有效
global-session:在一个全局HTTP SESSION中,每个Bean对应一个实例,该作用域仅在portlet上下文中才有效。
初始化和销毁Bean:
当实例化一个Bean时,可能需要执行一些初始化操作来确保该Bean处于可用状态,同样地,当你不需要Bean,将其从容器中移除,我们可能还需要按顺序执行一些清除工作,初始化和销毁只需要调用init-method,destory-method参数来配置<bean>元素
通过set方法注入Bean:
通常JavaBean的属性是私有的,同时拥有一组存取器方法,以setXXX()和getXXX()形式存在,,Spring可以借助属性的set方法来配置属性的值,以实现setter方式的注入,在Spring中,我们可以使用<property>元素配置Bean属性,<property>与<constructor-arg>类似,只不过一个是根据构造器来注入值,另一个时根据属性的setter来注入值
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2048000000" /><!--设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。 -->
<property name="defaultEncoding" value="UTF-8"></property>
<property name="uploadTempDir" value="/home/certs"></property><!--设置上传文件时的临时目录,默认是Servlet容器的临时目录。 -->
<property name="maxInMemorySize" value="1024000"></property><!--设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是1024000。 -->
</bean>
还可以注入内部Bean
还可以使用Spring的命名空间p装配属性
装配集合:
list:装配list类型的值,允许重复
set:装配set类型的值,不允许重复
map:装配map类型的值,名称和值可以是任意类型
props:装配properties类型的值,名称和值必须是String类型
map和props的区别:这两个元素分别对应java.util.Map和java.util.Properties,当我们需要键-值对组成的集合时,这两种配置元素非常有用。区别在于:props要求键和值都必须为String类型,map允许键-值可以是任意类型。