首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

spring aop的1点东东

2012-08-09 
spring aop的一点东东一、AOP 概念Joinpoint(连接点):定义在哪里加入你的逻辑功能,对于Spring AOP,Jointpoi

spring aop的一点东东

一、AOP 概念
Joinpoint(连接点):定义在哪里加入你的逻辑功能,对于Spring AOP,Jointpoint指的就是Method。
Advice(通知):特定的Jointpoint处运行的代码,对于Spring AOP 来讲,有Before advice、AfterreturningAdvice、ThrowAdvice、AroundAdvice(MethodInteceptor)等。
Pointcut(切入点):一组Joinpoint,就是说一个Advice可能在多个地方织入,
Aspect(切面):Advisor,需要实现的交叉功能
Weaving(织入):将Aspect加入到程序代码的过程,对于Spring AOP,由ProxyFactory或者ProxyFactoryBean负责织入动作。
Target(目标对象):这个很容易理解,就是需要Aspect功能的对象。

?

二、Spring AOP 代理原理
Spring AOP 是使用代理来完成的,Spring 会使用下面两种方式的其中一种来创建代理:
1、JDK动态代理,特点只能代理接口,性能相对较差,需要设定一组代理接口。
2、CGLIB 代理,可代理接口和类(final method除外),性能较高(生成字节码)。


三、Spring AOP 通知类型
1、BeforeAdvice:前置通知需实现MethodBeforeAdvice,但是该接口的Parent是BeforeAdvice。BeforeAdvice可以修改目标的参数,也可以通过抛出异常来阻止目标运行
2、AfterreturningAdvice:实现AfterreturningAdvice,我们无法修改方法的返回值,但是可以通过抛出异常阻止方法运行
3、AroundAdvice:Spring 通过实现MethodInterceptor(aopalliance)来实现包围通知,最大特点是可以修改返回值,当然它在方法前后都加入了自己的逻辑代码。通过MethodInvocation.proceed()来调用目标方法(甚至可以不调用)。
4、ThrowsAdvice:通过实现若干afterThrowing()来实现。
5、IntroductionInterceptor:Spring 的默认实现为DelegatingIntroductionInterceptor

四、Spring AOP? Advisor

把Advice和Pointcut组合到一个对象中。可以是bean里面的方法进行拦截。

接口为PointAdvisor

一般使用DefaultPointcutAdvisor就足够了,给它Advice和Pointcut。
当然如果想少写那么几行代码也可以使用NameMatchMethodPointcutAdvisor,RegexpMethodPointcutAdvisor等。

?

BeforeAdvice

public class LoggerBeforeAdvice implements MethodBeforeAdvice {
??? private Logger logger;
??? public void setLogger(Logger logger) {
??? ??? this.logger = logger;
??? }
??? /*
??? ?* method : 目标对象方法的镜像
??? ?* args? :? 目标对象方法的擦书
??? ?* target: 目标对象
??? ?* 注:此方法在目标对象方法调用前被代理对象调用
??? ?*/
??? public void before(Method method, Object[] args, Object target)
??? ??? ??? throws Throwable {???
??? ??? //调用一个织入的方面(这里是Logger)
??? ??? //完成记录日志的功能
??? ??? logger.log(method.getName() + " is invoked...");
??? }
}

befor.xml

<bean id="logger" is invoked......" +
??? ??? ??? ??? "? returnValue "+ returnValue);
??? }
}

after.xml

<bean id="logger" class="org.springframework.aop.framework.ProxyFactoryBean">
??? <!-- 注入目标对象 -->
??? <property name="target">
??? ??? <ref bean="target"/>
??? </property>
???
??? <!-- 注入拦截器(或者增强器)(可以注入多个拦截器) -->
??? <property name="interceptorNames">
??? ??? <list>
??? ??? ??? <value>beforeAdvisor</value>
??? ??? ??? <value>afterAdvisor</value>
??? ??? </list>
??? </property>???
??? <!-- 注入代理接口 -->
??? <property name="proxyInterfaces">
??? ??? <list>
??? ??? ??? <value>com.briup.aop.ITestService</value>
??? ??? </list>
??? </property>??
</bean>

?

最后再给个TestServiceImpl.java

public class OrderServiceImpl implements IOrderService {
??? public Order find(Long id) throws OrderException {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("find("+id+")");???
??? ??? return new Order();
??? }
??? public void remove(Long id) throws OrderException {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("remove("+id+")");
??? }
??? public void save(Order order) throws OrderException {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("save()");
??? ???
??? }
??? public void update(Order order) throws OrderException {
??? ??? // TODO Auto-generated method stub
??? ??? System.out.println("update()");
??? ??? //throw new OrderException("更新失败");
??? }
}

热点排行