spring学习笔记6--AOP

  1. spring通过Advisor(切面)将Pointcut和Advice组装起来,有了Advisor的信息,spring就可以利用JDK或CGLIB动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象 了。
  2. spring使用增强类定义横切逻辑.增强既包括横切逻辑,又包含部分连接点信息。

增强类型

AOP联盟为增强定义了org.aopalliance.aop.Advice接口。spring支持5中类型的增强。

  • 前置增强:BeforeAdvice。
  • 后置增强:AfterReturningAdvice
  • 环绕增强:org.aopalliance.intercept.MethodInterceptor
  • 异常抛出增强:ThrowsAdvice.
  • 引介增强:IntroductionInterceptor。在目标类中添加一些新的属性和方法。

这些增强接口都有一些方法,通过实现这些接口方法,并在接口方法中定义横切逻辑,就可以将他们织入目标类方法的相应连接点。

示例

public interface Waiter {
    public void serve(String name);
}
public class NaiveWaiter implements Waiter {

    @Override
    public void serve(String name) {
        System.out.println("serve to:"+name);

    }

}
public class GreetingBeforeAdvice implements MethodBeforeAdvice{

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("hello "+args[0]);

    }

}
public class BeforeAdviceTest {
    public static void main(String[] args) {
        Waiter target = new NaiveWaiter();
        BeforeAdvice advice = new GreetingBeforeAdvice();

        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTarget(target);
        proxyFactory.addAdvice(advice);

        Waiter proxy = (Waiter) proxyFactory.getProxy();
        proxy.serve("tom");
    }
}

剖析ProxyFactory

proxyFactory内部就是使用JDK或CGLIB动态代理技术的。spring定义了一个AopProxy接口。并提供了两个final类型的实现类:Cglib2AopProxy,JdkDynamicAopProxy。可以通过指定proxyFactory.setInterfaces(Class[] interface)方法指定使用JdkDynamicAopProxy。还可以通过proxyFactory.setOptimize(true)方法指定使用cglib.默认使用cglib.

在spring中配置
<bean id="greetingAdvice" class="x.x.GreetingAdvice"/>
<bean id="target" class="x.x.NaiveWaiter"/>
<bean id="water" class="org.springframework.aop.framework.ProxyFactoryBean" p:proxyInterfaces="x.x.Waiter"
p:interceptorNames="greetingAdvice"
p:target-ref="target"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值