Spring框架的AOP实现(JDK+CGLIB)

AOP的底层采用了代理技术,代理技术提供了两种,一种是JDK动态代理,另一种是CGLIB动态代理。

基于JDK的动态代理:必须是面向接口,只有实现了具体的接口的类才能生成代理对象。
基于CGLIB的动态代理:对于没有实现了接口的类,也可以生成代理,生成这个类的子类方式。一般如果实现接口,使用JDK动态代理完成AOP。没有实现接口,使用CGLIB动态代理实现AOP。

JDK动态代理的实现

UserDao,UserDaoImpl:

package com.spring.demo06;

public interface UserDao {

    public void save();

    public void update();

}

package com.spring.demo06;

public class UserDaoImpl implements UserDao{

    @Override
    public void save() {
        System.out.println("保存数据库。。。");
    }

    @Override
    public void update() {
        System.out.println("更新数据库。。。");
    }

}

JDK动态代理的工具类:

package com.spring.demo06;

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

/*
 * 使用JDK的方式生成代理对象
 */
public class MyProxyUtils {

    public static UserDao getProxy( UserDao userDao) {
        //使用Proxy类型生成一个代理对象
        UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), new InvocationHandler() {

            //代理对象的方法一执行,invoke中的方法就执行一次
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //如果save方法添加记录日志功能
                if("save".equals(method.getName())) {
                    System.out.println("记录日志。。。。");
                }
                System.out.println("代理对象。。。。");
                //让UserDaoImpl中的save或者update方法正常执行
                return method.invoke(userDao, args);
            }
        });
        //返回代理对象
        return proxy;
    }
}

测试:

package com.spring.demo06;

import org.junit.Test;

public class TestAOP {

    @Test
    public void run() {
        //目标对象
        UserDao userDao = new UserDaoImpl();
        userDao.save();
        userDao.update();

        System.out.println("================================");
        //使用工具类获取代理对象
        UserDao proxy = MyProxyUtils.getProxy(userDao);
        //调用代理对象的方法
        proxy.save();
        proxy.update();

    }
}

运行结果:

CGLIB动态代理的实现

UserDaoImpl:

package com.spring.demo07;

public class UserDaoImpl{

    public void save() {
        System.out.println("保存数据库。。。");
    }
    public void update() {
        System.out.println("更新数据库。。。");
    }

}

动态代理工具类:

package com.spring.demo07;

import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/*
 * 使用CGLIB的方式生成代理对象
 */
public class MyCglibUtils {

    public static UserDaoImpl getProxy() {
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(UserDaoImpl.class);
        //设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            //代理对象的方法执行,回调函数就会执行
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("CGLIB代理对象");
                if("save".equals(method.getName())) {
                    System.err.println("记录日志。。。。");
                }
                //正常执行
                return methodProxy.invokeSuper(obj, args);
            }
        });

        //生成代理对象
        UserDaoImpl proxy = (UserDaoImpl)enhancer.create();
        return proxy;
    }
}

测试:

package com.spring.demo07;

import org.junit.Test;

public class TestAOP {

    @Test
    public void run() {
        //目标对象
        UserDaoImpl userDao = new UserDaoImpl();
        userDao.save();
        userDao.update();

        System.out.println("================================");
        //使用CGLIB的方式生成代理对象
        UserDaoImpl proxy = MyCglibUtils.getProxy();
        //调用代理对象的方法
        proxy.save();
        proxy.update();

    }
}

运行结果:

原文地址:https://www.cnblogs.com/jumpkin1122/p/11624132.html

时间: 2024-08-01 12:24:14

Spring框架的AOP实现(JDK+CGLIB)的相关文章

Spring框架之-AOP

在工作以及面试当中Spring是必不可少的,当然了简单的认知是spring的两大特性: IOC控制翻转(也是依赖注入).AOP(面向切面) 首先什么叫aop,aop到底能做什么?大致意思是这样的 AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理.日志管理.权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性. 例如我刚才所做的日志切面,记录每次的请求和响应消息入库 我并没有像某些人把插入库的方法写在每个请求的方法里,就像上

java架构解密——Spring框架的AOP

一直以来,我们应用了不少的AOP框架,但是对于AOP的底层实现却没有过多的深入,古话就是"知其然,不知其所以然",随着AOP学术讨论的骤然兴起,我也开拓了自己的眼界,深入了解了AOP这个五彩斑斓的世界! 先来看看大众的定义: 百度百科: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函

Spring框架及AOP

Spring核心概念 Spring框架大约由20个功能模块组成,这些模块主分为六个部分: Core Container :基础部分,提供了IoC特性. Data Access/Integration Web AOP(Aspect Orient Programming) Instrumentation Test Spring两大核心技术 控制反转(Inversion of Control IoC) 称之为”依赖注入”,是面向对象编程中的一个设计理念,用来降低程序代码之间的耦合度. 将组建对象的控制

Spring框架:AOP详解

AOP的中文名称叫做面向切面编程.这个名字非常形象,因为你真的可以把一个系统像面包一样切开,并直接在面包上增加修饰.切面可大可小,大到整个系统,小到某一个方法. AOP有什么用呢?举个例子,每个组件中都可能含有安全.事务.数据库等方面的逻辑,AOP就是把每个组件中的安全作为一个方面进行集中处理,事务作为一个方面,数据库作为一个方面等等.这样才能做到高内聚.低耦合.AOP中有三个重要的术语:通知.切点.连接点.他们之间的关系如下图. AOP实现的原理是修改目标类中的代码.至于怎么修改,有多种方式:

Spring框架学习——AOP的开发

一.AOP开发中的相关术语. ——JoinPoint(连接点):指那些可以被拦截到的点.比如增删改查方法都可以增强,这些方法就可以被称为是连接点. ——PointCut:切入点,真正被拦截的点,指对哪些连接点进行拦截的定义.JoinPoint是指方法可以增强,而切入点就是实际哪个方法进行增强或修改,这样的方法被称为切入点. ——Advice(增强/通知):方法层面的增强.指拦截到了方法后需要做的事情,也就是增强的功能部分被称为通知.分为前置(方法主体之前).后置.环绕通知. ——Introduc

基于Spring AOP的JDK动态代理和CGLIB代理

一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 二.主要用途 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务

spring框架学习(六)AOP

spring框架学习(六)AOP AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法:在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉.这种重复代码不仅使编码麻烦,

Spring框架AOP源码剖析

今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西的源码剖析,作为多年的开发者,想必大家在面试的时候都被问过,你知道Spring框架AOP的底层实现机制吗,这可是很简单的噢,我们会说,如果某个类有接口就使用JDK动态代理,没有接口就用CGLIB动态代理,并且Spring也提供了可配置开关,不管有无接口都一律使用CGLIB动态代理,例如 <aop:aspectj-autoproxy proxy-target-class="true"/&

spring框架之AspectJ的XML方式完成AOP的开发

1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * spring-aop-4.2.4.RELEASE.jar * com.springsource.org.aopalliance-1.0.0.jar * aspectJ的开发包 * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar * spring