2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解
序,随着Spring容器管理Bean数量增加,XML文件会越来越大,而且纯手工配置XML很繁琐,Spring和JAVA都提供了一些注解方式用以简化XML配置。
目录
一、自动装配(autowiring)
1 byName
2 byType
3 constructor
4 autodetect
5 默认自动装配
二、使用注解自动装配
1 使用@AutoWired
2 使用@Qualifier限定歧义性的依赖
3 @Inject
4 @Named
三、自动检测(autodiscovery)
1 构造型(stereotype)注解
2 过滤组件扫描
四、使用Spring基于Java的配置
1 定义一个配置类
2 声明一个简单的Bean
一、自动装配(autowiring)
自动装配有助于减少<property>元素和<constructor-arg>元素。
自动装配粗略有四种byName/byType/constructor/autudetect,自动装配策略用在<beans>或<bean>节点,达到减少XML配置的目的,自动装配只能适用于部分场景,要和手动装配搭配使用。
1 byName
与bean的属性具有相同名字的其他bean自动装配到bean的对应属性中。
例子:添加autowire="byName"后,缺少的参数就会寻找同名的bean名字进行装配。
<bean id="poeticDuke" class="single.spring.PoeticJuggler" autowire="byName">
2 byType
与bean的属性具有相同类型的其他bean自动装配到bean的对应属性中。
autowire="byType"
3 constructor
与bean的构造器入参具有相同类型的其他bean自动装配到bean构造器的对应入参中
autowire="constructor"
4 autodetect
首先尝试使用constructor进行自动装配,如果失败,再尝试使用byType进行自动装配。
autowire="autodetect"
5 默认自动装配
如果需要为spring应用上下文中的每个Bean配置相同的autowire属性,就可以配置相同的自动装配策略来简化配置,在<beans>上增加一个default-autowire属性。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context "
default-autowire
="byType">
注意事项:当使用constructor自动装配策略时,我们必须让Spring自动装配构造器的所有入参---我们不能混合使用constructor自动装配策略和<constructor-arg>元素。
二、使用注解自动装配
Spring2.5开始开始使用注解自动装配Bean的属性。
使用<context:annotation-config/>启动基于注解的自动装配。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context ">
<context:annotation-config/>
<!-- bean declarations go here -->
</beans>
1 使用@AutoWired
org.springframework.beans.factory.annotation.Autowired
对属性的set方法、构造器、甚至是Bean引用的任意方法,Spring会对该方法执行byType自动装配。
例子
@Autowired
public void setInstrument(Instrument instrument) {
this.instrument = instrument;
}
另外也可对属性直接标注,required=false表示,当无匹配Bean时,默认赋值为null。而不会抛出NoSuchBeanDefinitionException
@Autowired(required=false)
private Instrument instrument;
2 使用@Qualifier限定歧义性的依赖
org.springframework.beans.factory.annotation.Qualifier
当匹配的Bean太多时,需要使用Qualifier来限定范围。
例如:指定ID为guitar的bean
@Autowired(required=false)
@Qualifier("guitar")
private Instrument instrument;
3 @Inject
javax.inject.Inject
@Inject
private Poem poem;
4@Named
javax.inject.Named
@Inject
@Named("guitar")
private Poem poem;
三、自动检测(autodiscovery)
自动检测比自动装配更进了一步,让spring能够自动识别哪些类需要被配置成Spring Bean,从而减少对<bean>元素的使用。
例子:base-package="com.springinaction.springidol"制动了扫描的包及其子包。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context ">
<context:component-scan
base-package="com.springinaction.springidol">
</context:component-scan>
</beans>
1 构造型(stereotype)注解
@Component---通用的构造型注解,标识该类为Spring组件
org.springframework.stereotype.Component
@Component("name")此时为类指定ID为name,否则默认类名首字母小写。
@Controller---标识将该类定义为Spring MVC controller
org.springframework.stereotype.Controller
@Repository---标识该类定义为数据仓库
org.springframework.stereotype.Repository
@Service---标识该类定义为服务
org.springframework.stereotype.Service
2 过滤组件扫描
配置Instrument类的所有子类都自动注册为Spring容器的Bean
<context:component-scan base-package="com.springinaction.springidol">
<context:include-filter type="assignable" expression="com.springinaction.springidol.Instrument" />
</context:component-scan>
除了使用自定义@SkipIt注解的类,其他所有的Instrument实现都需要注册为Spring容器的Bean。
<context:component-scan base-package="com.springinaction.springidol">
<context:include-filter type="assignable" expression="com.springinaction.springidol.Instrument" />
<context:exclude-filter type="annotation" expression="com.springinaction.springidol.SkipIt" />
</context:component-scan>
过滤器类型type的取值及示意:
| 过滤器类 型 | 描述 |
| annotation | 过滤器扫描使用指定注解所标注的那些类。通过expression属性指定要扫描的注解 |
| assignable | 过滤器扫描派生于expression属性所指定类型的那些类 |
| aspectj | 过滤器扫描与expression属性所指定的AspectJ表达式所匹配的那些类 |
| custom | 使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定 |
| regex | 过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类。 |
四、使用Spring基于Java的配置
spring 3.0提供了利用纯粹Java代码来配置spring应用了。
<context:component-scan base-package="com.springinaction.springidol" />不仅自动注册那些使用构造型(stereotype)注解所标注的Bean,而且也会自动加载使用@Configuration注解所标注的类。
1 定义一个配置类
@Configuration注解等价于XML中<beans>元素
package com.springinaction.springidol;
import org.springframework.context.annotation.Configuration; @Configuration
public class Juggler{
//Bean declaration methods go here
}
2 声明一个简单的Bean
org.springframework.context.annotation.Bean
@Bean等价于<bean>,告知Spring将返回一个对象,方法名duke做为该Bean的ID,
@Bean
public Performer duke(){
return new Juggler();
}
2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解的更多相关文章
- Network Real Trace Analysis 2015年12月10日
了解网络中真实的流量,国内很难找到巨人的肩膀. WAND是新西兰waikato 大学计算机系的研究小组,主要做网络测量,大规模网络流量捕获,网络分析.还做专业的分析软件. libtrace是其开源的分 ...
- 2015年12月10日 spring初级知识讲解(三)Spring消息之activeMQ消息队列
基础 JMS消息 一.下载ActiveMQ并安装 地址:http://activemq.apache.org/ 最新版本:5.13.0 下载完后解压缩到本地硬盘中,解压目录中activemq-core ...
- 2015年12月01日 GitHub入门学习(二)手把手教你Git安装
序:Mac与Linux中,Mac都预装了Git,各版本的Linux也都提供了Git的软件包.下面手把手教你Windows下的安装. 一.Git Windows GUI 下载地址 msysgit htt ...
- 2015年12月13日 spring初级知识讲解(四)面向切面的Spring
2015年12月13日 具体内容待补充...
- 我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)
作业二:三级菜单 三级菜单 可一次进入各个子菜单 思路: 这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量 ...
- 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)
2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- 2016年12月10日 星期六 --出埃及记 Exodus 21:5
2016年12月10日 星期六 --出埃及记 Exodus 21:5 "But if the servant declares, `I love my master and my wife ...
- 【C++】命令行Hangman #2015年12月15日 00:20:27
增加了可以在构造Hangman对象时通过传入参数设定“最大猜测次数”的功能.少量修改.# 2015年12月15日 00:20:22 https://github.com/shalliestera/ha ...
随机推荐
- RAC 相关概念解释
1.1 并发控制 在集群环境中, 关键数据通常是共享存放的,比如放在共享磁盘上. 而各个节点的对数据有相同的访问权限, 这时就必须有某种机制能够控制节点对数据的访问. Oracle RAC 是利用DL ...
- hdu 3089 约瑟夫环
原来并不知道约瑟夫环还可以递推直接解orz 约瑟夫问题的递推公式: 设f[n]表示一共n个人,数到k出局,这样最后的winner (n个人从0开始标号,即0--n-1) f[n]=(f[n-1]+k) ...
- 帝国备份王(Empirebak) \class\functions.php、\class\combakfun.php GETSHELL vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 EmpireBak是一款完全免费.专门为Mysql大数据的备份与导入而设 ...
- Spring mvc web 配置
Spring Framework本身没有Web功能, Spring MVC使用WebApplicationContext类扩展ApplicationContext ,使得拥有web功能.那么,Spri ...
- A.Kaw矩阵代数初步学习笔记 9. Adequacy of Solutions
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- Linux 下的常用工具
Useful Linux Utilities (This article is under constant construction) ssh 相关文章 How To Change OpenSSH ...
- CF 213A Game(拓扑排序)
传送门 Description Furik and Rubik love playing computer games. Furik has recently found a new game tha ...
- django admin中保存添加的数据提示need string or buffer, int found
原因 def __unicode__(self): return unicode(self.pk) 此处如果没有unicode就会报这个错误,原因就是编码错误 以为是文件开始没有加utf-8导致的,然 ...
- MyBatis详解 与配置MyBatis+Spring+MySql
MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本 ...
- spring---aop 配置
第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...