这篇文章类似spring文档,随时查阅(3.X)
spring框架自带10个命名空间:
- aop:为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素
- beans:支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间
- context:为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Spring直接管理的对象;
- tx:提供声明式事务配置
- mvc:启用SpringMVC的能力,例如面向注解的控制器,视图控制器和拦截器
- jee:提供了与JavaEE API的集成,例如JNDI和EJB
- jms:为声明消息驱动的POJO提供了配置元素
- lang:支持配置由Groovy,JRuby或BeanShell等脚步实现的Bean
- oxm:支持Spring的对象到XML映射配置
- util:提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素
bean:
bean是beans下的;bean的属性:
id:唯一标示该bean的标识符;
name:作用和id一样,但由于使用XML(XML自带id属性),建议使用id
factory-bean:指明该对象由那个beanFactory创建
factory-method:指明创建该对象的方法
scope:指明bean的作用域:
singleton:在每一个Spring容器中,一个bean只有一个对象实例
prototype:允许Bean的定义可以被实例化任意次(每次调用都创建一个实例)
request:在一次HTTP请求中,每个Bean对应一个实例,该作用域仅在基于Web的Spring上下文(例如springMVC中有效)
session:跟request类似,在一个HTTP Session中....
global-session:在一个全局的HTTP Session中,每一个Bean定义对应一个实例,该作用域仅在Portlet上下文中才有效
init-method:在Bean初始化完成后调用该方法
destory-method:在Bean销毁前调用该方法
autowire:自动装配bean
byName:把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中,如果没有,则该属性不进行装配
byType:把与Bean的属性具有相同类型的其他Bean自动装配到Bean对应属性中,如果没有,则该属性不进行装配
constructor:把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中
autodetect:首先尝试使用constructor进行自动装配,如果失败,再尝试使用byType
bean下标签:
property:name; value or ref(属性值和引用)(setting注入)
constructor-arg:name; value or ref(属性值和引用)(构造器注入)
(上述注入还可以为集合:
<list>:装配list类型的值,允许重复
<set>:装配set类型的值,不允许重复
<map>:装配map类型的值,名称和值可以是任意类型
<props>:装配properties类型的值,名称和值必须都是String类型
)
使用注解的装配
spring的注解装配
@Autowired @Qualifier
JSR-330(JCP发布的java依赖注入规范 在javax当中)
@Inject @Named
备注
关于Spring中的<context:annotation-config/>配置
当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如:
使用@Autowired注解,必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor的Bean:
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>
使用 @Required注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean:
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
类似地,使用@Resource、@PostConstruct、@PreDestroy等注解就必须声明 CommonAnnotationBeanPostProcessor;使用@PersistenceContext注解,就必须声明 PersistenceAnnotationBeanPostProcessor的Bean。
这样的声明未免太不优雅,而Spring为我们提供了一种极为方便注册这些BeanPostProcessor的方式,即使用<context:annotation- config/>隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor以及PersistenceAnnotationBeanPostProcessor这4个BeanPostProcessor。如下:
<context:annotation-config/>
另,在我们使用注解时一般都会配置扫描包路径选项:
<context:component-scan base-package="pack.pack"/>
该配置项其实也包含了自动注入上述processor的功能,因此当使用<context:component-scan/>后,即可将<context:annotation-config/>省去。
我们还可以随意调整扫描行为:使用<context:include-filter>或者使用<context:exclude-filter>
<context:component-scan base-package="pack.pack">
<context:include-filter type="assignable"
expression="pack.pack.abc"/>
</context:component-scan>
这里的type就是过滤的策略,type的类型:
annotation:过滤扫描使用指定注解所标注的那些类,通过expression属性指定要扫描的注解
assignable:过滤扫描派生与expression属性所指定类型的那些类
aspectj:过滤扫描与expression属性所指定的AspectJ表达式所匹配的那些类
custom:使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定
regex:过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类