Spring AOP(一)AOP简介及JDK动态代理实例

1、什么是AOP
面向切面编程。就是这样。
2、AOP术语
(1)连接点(Joinpoint)
     程序执行的某个特定位置。比如类在初始化的前后,方法执行的前后。
(2)切点(PointCut)
一个类会有很多个链接点,但是如何定位到某个特定的连接点的逻辑或条件或方法我们称之为切点。就像sql语句的where条件。
(3)增强/通知(Advice)
织入到目标连接点的一段代码程序。
(4)目标对象(Target)
增强织入的目标类。
(5)引介(Introduction)
是一种特殊的增强,为目标类织入属性和方法。这样我们可以为一个原本没有实现某个接口的类,通过Aop变成某个接口的实现类。
(6)织入(Weaving)
是增强添加到连接点的具体过程。有三种方式:编译期织入、类装载期织入、动态代理期织入。spring使用动态代理织入的方式在运行期织入,AspectJ采用编译期和装载期织入的方式。
(7)代理(Proxy)
一个类被织入增强后,就产生一个结果类。这个类是原类和增强逻辑的结合。代理和原类可是有相同接口的类,也可能是原类的子类,所以我们可以用调用原类的方式调用代理类。
(8)切面
切面由切点和增强组成,它既包括了横切逻辑的定义,也包括了连接点。
3、AOP实例
     (1)Jdk动态代理。
              Jdk动态代理主要涉及到两个类,一个是Proxy另一个是接口InvocationHandler。InvocationHandler主要是织入横切逻辑实现增强,并将切点和增强融合在一起形成切面。
          a、业务接口  ForumService
          b、对应的业务实现类  ForumServiceImpl
          c、切面 PerformanceHandler
          d、测试类 JdkTest
--- ForumService
public interface ForumService {
    public abstract void removeTopic();
}
--ForumServiceImpl
public class ForumServiceImpl  implements ForumService {
    @Override
    public void removeTopic() {
        System. out.println( " 删除。。。。 ");
        try {
            Thread. sleep( 2000);
        }  catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
--PerformanceHandler

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Created by weiyuan on 2018/7/9/009.
 * InvocationHandler  像是一个切面,将目标类和增强编织成一个切面
  */
public class PerformanceHandler  implements InvocationHandler {
    private  Object  target;
    private Log  logger = LogFactory. getLog(PerformanceHandler. class);
    public PerformanceHandler(Object target){
        this. target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {

        logger.info( " 执行的方法 "+ target.getClass().getName()+ "."+method.getName());
        logger.info( " 开始执行。。。。 ");
        Object object = method.invoke( target, args);
        logger.info( " 完成。。。。 ");
        return object;
    }
}
--JdkTest

import com.aop.jdk.handler.PerformanceHandler;
import com.aop.jdk.impl.ForumServiceImpl;

import java.lang.reflect.Proxy;

/**
 * Created by weiyuan on 2018/7/9/009.
 */
public class JdkTest {
    public static void main(String[] args) {
        // 希望被代理的目标类
        ForumService target =  new ForumServiceImpl();
        // 切面
        PerformanceHandler handler =  new PerformanceHandler(target);
        // 代理类实例
        ForumService forumServiceProxy = (ForumService) Proxy. newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                handler);
        forumServiceProxy.removeTopic();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值