标签:
注解可以充分利用Java的反射机制获取类结构信息,从而有效减少配置工作;注解与java代码位于同一个文件,便于对变动的统一维护;
1) Spring容器默认禁用注解装配,因此使用注解装配之前需要在配置文件中显示打开注解装配:
<?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:util="http://www.springframework.org/schema/util" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:http="http://cxf.apache.org/transports/http/configuration" 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.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:annotation-config /> <!-- bean declarations go here --> </beans>
2) Spring提供的@Autowired:
#1直接修饰类变量,无需setter方法;
#2优先byType;
#3如果没有找到bean或者byType匹配得到的bean有多个,则抛出异常;
#4如果byType匹配得到的bean有多个,可以使用@Qualifier(“[id]”)限定Bean ID;
#5如果没有找到bean,可以使用@Autowired(required=false)要求不进行装配,但不推荐;
1 <bean id="instrument1" class="com.active.leo.helloworld.InstrumentImpl" /> 2 3 <bean id="instrument2" class="com.active.leo.helloworld.InstrumentImpl2" /> 4 5 @Autowired 6 7 @Qualifier("instrument2") 8 9 private Instrument instrument;
3) JSR-330提供的@Inject
#1 JCP为统一依赖注入规范而推出的一种模型;
#2与@Autowired基本相同,除了没有required属性,因此必须进行装配,否则异常;
#3可以修饰类属性,类方法和类构造器;
#4如果byType匹配得到的bean有多个,可以使用@Named(“[id]”)限定Bean ID;
4) JSR-250提供的@Resource
#1@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入;
#2@Resource有两个重要的属性,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
@Resource装配顺序
#1如果同时指定name和type,则从上下文找唯一匹配的bean进行装配,找不到则异常;
#2如果仅指定name,则从上下文中找名称(id)匹配的bean进行装配,找不到则异常;
#3如果仅指定type,则从上下文中找类型匹配的bean进行装配,找不到或者找到多个都异常;
#4如果同时没有指定name和type,则首先自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)通过反射机制使用byName自动注入策略,如果匹配则自动装配,否则异常;
通过注解进行Bean的自动检测
1) 在配置文件中开启bean自动检测的功能,需要指定扫描的Java包路径;
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 7 xmlns:util="http://www.springframework.org/schema/util" 8 9 xmlns:jaxws="http://cxf.apache.org/jaxws" 10 11 xmlns:http="http://cxf.apache.org/transports/http/configuration" 12 13 xmlns:context="http://www.springframework.org/schema/context" 14 15 xsi:schemaLocation=" 16 17 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 18 19 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd 20 21 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 22 23 http://www.springframework.org/schema/context 24 25 http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 26 27 28 29 <context:component-scan 30 31 base-package="com.active.leo.helloworld"> 32 33 </context:component-scan> 34 35 </beans>
2) 如果注解后添加string则显示指定bean名字,否则bean名字为首字母小写的类型名,如@Component(“specificName”)
3) @Component: 对应通用Bean
4) @Controller: 对应控制层Bean,如Spring MVC Controller
5) @Service: 对应业务层Bean,如Struts Action
6) @Repository: 对应持久层Bean,如DAO
面向切面编程
1) Spring AOP:统一在一个地方定义【通用功能】,通过声明的方式定义这些通用的功能以何种【方式】【织入】到某些【特定应用】里去,并且【不需要修改】特定应用的代码;
#1通用功能:Advice,如日志、安全或事务;
#2方式:PointCut,如方法调用、字段修改和抛出异常,Spring AOP仅支持方法调用;
#3织入:Weaving,三个织入时期:编译期,类加载期和运行期,Spring
AOP仅支持运行期;
#4特定应用:JoinPoint,如类路径;
#5不需要修改:动态为目标类创建代理对象;
2) AspectJ的功能比Spring AOP更加全面,如果需要可以在Spring中加载AspectJ的功能模块;使用Spring AOP除了常规Spring的jar包外还需要引入aspectjweaver-[xxx].jar;
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 7 xmlns:aop="http://www.springframework.org/schema/aop" 8 9 xmlns:tx="http://www.springframework.org/schema/tx" 10 11 xmlns:context="http://www.springframework.org/schema/context" 12 13 xsi:schemaLocation=" 14 15 http://www.springframework.org/schema/beans 16 17 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 18 19 http://www.springframework.org/schema/tx 20 21 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 22 23 http://www.springframework.org/schema/aop 24 25 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 26 27 http://www.springframework.org/schema/context 28 29 http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 30 31 32 33 <context:annotation-config /> 34 35 36 37 <bean id="audience" class="com.active.leo.helloworld.Audience" /> 38 39 <bean id="instrumentAlist" class="com.active.leo.helloworld.InstrumentAlist" /> 40 41 <bean id="instrument2" class="com.active.leo.helloworld.InstrumentImpl2"/> 42 43 44 45 <aop:config> 46 47 <aop:aspect ref="audience"> 48 49 <aop:pointcut id="performance" 50 51 expression="execution(* com.active.leo.helloworld.Performer.perform(..))" /> 52 53 54 55 <aop:before pointcut-ref="performance" method="takeSeats" /> 56 57 <aop:before pointcut-ref="performance" method="turnOffCellPhones" /> 58 59 <aop:after-returning pointcut-ref="performance" method="applaud" /> 60 61 <aop:after-throwing pointcut-ref="performance" method="demandRefund" /> 62 63 </aop:aspect> 64 65 </aop:config> 66 67 68 69 </beans>
#1<aop:aspct表示定义一个切面,并且与名为audience的bean关联;
#2<aop:pointcut>表示定义一个名为performance的切点,并与调用perform方法触发绑定;
#3<aop:before>表示定义调用perform方法触发之前的动作;
#4<aop:after-returning>表示定义调用perform方法触发正常结束之后的动作;
#5<aop:after-throwing>表示定义调用perform方法抛出异常后的动作;
#6<aop:around>合并before和after-returning,PreceedingJoinPoint.proceed()为目标动作;
#7如果目标动作有参数,可以借助arg/arg-names在切面方法中获取;
3) Spring AOP也可以通过注解实现
#1首先要在配置文件中添加<aop:aspectj-autoproxy />;
#2然后通过@Aspect,@Pointcut,@Before,@AfterReturning,@Around等实现
Spring Framework之Bean的自动装配检测和AOP简述
标签:
原文地址:http://www.cnblogs.com/leo-chen-2014/p/4485812.html