Spring学习1_面向切面( AOP )实现原理

     面向切面编程 (Aspect Oriented Programming,简称AOP) 是Spring的一个重要特性,其原理是采用动态代理方式实现。

     下面通过一个Demo来模拟AOP实现

     整个代码目录结构如下:

     

       其中LogInterceptor类完成为所有Service方法添加日志记录的功能。

   1、Dao层实现

package com.dao;

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("excute save;");
        
    }

    @Override
    public void delete() {
        System.out.println("excute delete;");
        
    }

}

    2、拦截器类实现 

package com.handler;

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


public class LogInterceptor implements InvocationHandler{
    
    private Object target;
    
    
    
    public void setTarget(Object target) {
        this.target = target;
    }

    public void beforMethod(Method method) {    
        System.out.println(method.getName() +"  start.");
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        beforMethod(method);
        method.invoke(target, args);
        return null;
    }

}

    3、AOP实际执行时是通过动态代理,对上述拦截器进行包装生成的代理类来完成切面功能的,测试如下:

 

package com.test;

import java.lang.reflect.Proxy;

import org.junit.Test;

import com.dao.UserDao;
import com.dao.UserDaoImpl;
import com.handler.LogInterceptor;

public class TestAop {

    @Test
    public void testAopProxy() {
        UserDao userDao = new UserDaoImpl();
        LogInterceptor logInterceptor = new LogInterceptor();
        logInterceptor.setTarget(userDao);
        UserDao proxyDao = (UserDao) Proxy.newProxyInstance(userDao.getClass()
                .getClassLoader(),  new Class[]{UserDao.class}, logInterceptor);
        proxyDao.save();
        proxyDao.delete();
    }
}

   测试结果如下:

     

转载于:https://www.cnblogs.com/toDjlPersonnalBlog/p/4651030.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值