今天主要是AOP编程,徐老师先讲了原理,由浅入深,最
后让开发由aspectJ来完成,使开发更简单,收获蛮大
1.Aspect术语
通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实
现日志功能的代码,如向日志文件写日志。通知在连接点插入
到应用系统中。
连接点::应用程序执行过程中插入切面的地点,可以是
方法调用,异常抛出,或者 要修改的字段。
切入点:定义了通知应该应用在哪些连接点,
通知可以应用到AOP框架支持的任何 连接点。
引入:不变源代码的情况下,为类添加新方法
和属性。
目标对象::被通知的对象。既可以是你编写的类也可以是
第三方类。
代理对象:崭新的对象,将通知应用到目标对
象后创建的对象,应用系统的其他部 分不用为了支持代理对象而 改变。
织入:将切面应用到目标对象从而创建一个新代理对
象的过程。织入发生在目标
对象生命周期的多个点上:
编译期:切面在目标对象编译时织入.这需要一个特殊的编译器.
类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器.
运行期:切面在应用系统运行时织入.
4.切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。
两种:jdk动态代理(接口,松耦合),cglib(对类代理)
2.方法介绍
一.通知类型
1.前置通知
public interface MethodBeforeAdvice{
void before(Method m,Object[]
os
,Object target){
}
}
该接口提供了获得目标方法、参数和目标对象的机会。不能够改变运行时参数,即不能替换参数对象和目
标对象。
注意在方法结束后不返回任何值东西。原因是该接口返回后,目标方法将会被调用,应该返回目标对象的
返回值。该接口唯一能
阻止目标方法被调用的途径是抛出异常或(System.exit())。
2.动态代理对象ProxyFactoryBean是一个在BeanFactory中显式创建代理对象的中心类,可以给它一个
要实现的接口、一个要代理的目标对象、一个
要织入的通知,并且他将创建一个崭新的代理
对象。
3.后置通知
同前置通知类似。
public interface AfterReturningAdvice{
public void afterReturning(Object
returnValue,Method
m,Object[] os,Object target);
}
多了一个返回值。
4.环绕通知
public
interface
MethodInterceptor extends Interceptor{
Object invoke(MethodInvocation invocation);
}
该接口同前两种通知有两个重要区别:1.该通知能够控制目标方法
是否真的被调用。通过invocation.proceed()方法来调用。
2.该通知可以控制返回的对象。可以返回一个与proceed()方法返回对象完全不同的对象。但要谨慎使用。
5.异常通知
public interface ThrowsAdvice{
}
该接口为标识性接口,没有任何方法,但实现该接口的类必须要有如下形
式的方法:
void
afterThrowing(Throwable
throwable);
void
afterThrowing(Method
m,Object[] os,Object
target,Throwable
throwable);
第一个方法只接受一个参数:需要抛出的异常。
第二个方法接受异常、被调用的方法、参数以及目标对象。
二.创建切入点方法
1. 切入点根据方法和类决定何处
织入通知。ClassFilter接口决定了一个类
是否符合通知的要求:
public interface ClassFilter{
boolean matches(Class clazz);
}
实现该接口的类决定了以参数传递
进来的类是否应该被通知。实现该接
口的类一般根据类名决定,但不一
定必须如此。
注意: 为减少系统负担,尽量使用静态切入点
2.定义切入点 spring提供了Advisor类。他把通知和切入点组合到一个对象中。更确切地说PointcutAdvisor提供了这些功
能
3.使用aspectJ开发
1.添加类库:aspectjrt.jar和aspectjweaver.jar
2.添加aop schema.
3.定义xml元素:<aop:aspectj-autoproxy>
4.编写java类,并用@Aspect注解成通知
AspectJ 支持 5 种类型的通知注解:
@Before: 前置通知, 在方法执行之前执行
@After: 后置通知, 在方法执行之后执行
@AfterRunning: 返
回通知, 在方法
返回结果之后执行
@AfterThrowing: 异
常通知, 在方法
抛出异常之后
@Around: 环绕通知, 围绕着方法执行
配置成普通bean元素即可.
注意:
JoinPoint参数可访问连接点细节,入方法名和参数等.
今天知识点蛮多的,对面试挺有用的,好好掌
握!
posted on 2010-02-28 01:11
d66380022 阅读(263)
评论(0) 编辑 收藏