码迷,mamicode.com
首页 > 编程语言 > 详细

Spring Framework之Bean的自动装配检测和AOP简述

时间:2015-05-07 20:08:56      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

注解可以充分利用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>
View Code

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;
View Code

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>
View Code

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>
View Code

#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!