一.Bean的配置
1.bean常用属性和子元素:
bean属性 | 说明 |
id | bean的唯一标识符,spring容器对bean的配置,管理都通过该属性进行 |
name | spring容器通过此属性进行配置和管理,name属性可以为bean指定多个名称,每个名称之间用逗号或分好隔开 |
class | 指定bean的实现类,他必须使用类的全限定名 |
scope | 用于设定bean实例的作用域,其属性值有singleton(单例)、prototype(原型)、request、session、global Session、application和websocket,默认值为singleton |
bean子元素名称及属性 | 说明 |
property | <bean>元素的子元素,用于调用bean实例中的setter()方法完成属性赋值,从而完成依赖注入。该元素name属性指定bean实例中的相应属性名,ref属性或value属性用于指定参数值 |
constructor-arg | <bean>元素的子元素,用于使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号(从0开始)type属性指定构造参数的类型,参数值可以通过ref属性或value属性直接指定,也可以通哟ref或value子元素指定 |
ref | <property>、<constructor-arg>等元素的属性或子元素,可以用于指定对Bean工厂中某个Bean实例的引用 |
value | <property>、<constructor-arg>等元素的属性或子元素,可以用于直接给定一个常量值 |
list | 用于封装List或数组属性的依赖注入 |
set | 用于封装Set类型属性的依赖注入 |
map | 用于封装Map类型属性的依赖注入 |
entry | <map>元素的子元素,用于设置一个键值对。其key属性指定字符串类型的键值对,ref 属性或value属性直接指定其值,也可以通过ref或value子元素指定其值 |
2.作用域的种类
作用域名称 | 说明 |
singleton(单例) | 使用singleton定义的bean在spring容器中国将只有一个实例,也就是说,无论有多少个bean引用它,始终将指向同一个对象,这也是spring容器中默认的作用域 |
prototype(原型) | 每次通过spring容器获取prototype定义的bean时,容器都将创建一个新的bean实例 |
request | 在一个HTTP请求中,容器会返回该bean的同一个实例,对不同的HTTP请求则会产生一个新的bean,而且该bean仅在当前HTTP Request 内有效 |
session | 再一次HTTP Session 中,容器会返回该bean的同一个实例,对不同的HTTP请求则会产生一个新的bean,而且该bean仅在当前Http Session内有效 |
application | 为每个ServletContext对象创建一个实例,仅在web相关的ApplicationContext中有效 |
websocket | 为每个Websocket对象创建一个实例,仅在web相关的ApplicationContext中有效 |
3.bean的装配
(1)基于xml的装配:例子在前边(spring总结1)
(2)基于Annotation的装配:注解装配
spring中常用注解:
注解名称 | 说明 |
@Component | 可以使用此注解描述spring中的bean,但它是一个泛化的概念,仅仅表示一个组件(bean),并且可以作用在任何层次。使用时只需要将该注解标注在相应类上即可 |
@Repository | 用于将数据访问层(Dao层)的类标识为spring中的bean,其功能与@Component相同 |
@Service | 通常作用在业务层(Service层),用于将业务层的类标识为spring中的bean,其功能与@Component相同 |
@Controller | 通常作用在控制层(如spring MVC的Controller),用于将控制层的类标识为spring中的bean,其功能与@Component相同 |
@Autowired | 用于对bean的属性变量,属性的setter()方法及构造方法进行标注,配合对应的注解处理器完成bean的自动配置工作。默认按照bean的类型进行装配 |
@Resource | 其作用与@Autowired一样,区别在于@Autowired默认按照bean类型装配,而@Resource默认按照bean实例明后才能进行装配。@Resource中有两个重要属性:name和type。spring将name属性解析为bean的实例名称,type解析为办类型的实例类型。若指定name属性,则按照实例名称进行装配。若指定type属性,则按照bean类型进行装配;若都不指定,则按照bean实例名称装配,不能匹配时再按照bean类型进行装配;若都无法匹配,则抛出NoSuchBeanDefinitionException异常 |
@Qualifer | 与@Autowired注解配合使用,会将默认的按照bean类型装配修改为按bean的实例名称装配 |
通过使用注解装配任然要在xml文件中进行书写装配代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!--使用context命名空间在配置文件中开启相应的注解处理器-->
<context:annotation-config/>
<!--只需配置<bean>,不需配置bean下的属性变量-->
<bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl"/>
..........
</beans>
(3)自动装配:spring的<bean>语速中包含一个autowire属性,我们通过设置autowire的属性类自动装配bean。
autowire属性有五个值:
属性值 | 说明 |
default | 有<bean>的商机标签<beans>的default-autowire属性值确定。例如<beans default-autowire="byName">,该<bean>元素中的autowire属性对应的属性值为byName |
byName | 根据属性的名称自动装配。容器将根据名称查找与属性完全一致的bean,并将其属性自动装配 |
byType | 根据睡醒的数据类型自动装配,如果一个bean的数据类型兼容另一个bean中属性的数据类型,则自动装配 |
constructor | 根据构造函数参数的数据类型进行byType模式的自动装配 |
no | 在默认情况下,不使用自动装配,bean依赖必须通过ref元素定义 |