spring AOP原理解析

一、介绍

spring AOP:切面编程,是对类功能的增强。功能包括统一的权限控制、日志打印、异常处理等统一化处理;

二、实现方式

spring实现AOP的方式有两种,JDKProxy和CGLIB;spring是依照,如果类实现了接口,则选择JDKProxy,如果未实现接口,则选择CGLIB;

1、JDKProxy:适用于接口实现类,通过创建代理类,同样实现目标类的接口,以此来增强目标类的功能。

1)IUserOperation接口

package com.caocao;

/**
 * Created by xuhui on 2019/10/8
 */
public interface IUserOperation {
    String getUserName(String userId);
}

2)UserOperationImpl接口实现类

package com.caocao;

/**
 * Created by xuhui on 2019/10/8
 */
public class UserOperationImpl implements IUserOperation {
    @Override
    public String getUserName(String userId) {
        System.out.println("userId = [" + userId + "]");
        return userId + "_name";
    }
}

3)JDKProxy实现

package com.caocao;

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

/**
 * Created by xuhui on 2019/10/8
 */
public class UserProxy {
    public static void main(String[] args) {
        jdkProxy();
    }

    public static void jdkProxy() {
        IUserOperation userOperation = new UserOperationImpl();
        IUserOperation proxy = (IUserOperation) Proxy.newProxyInstance(userOperation.getClass().getClassLoader(),
                userOperation.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("method = [" + method + "], args = [" + args + "]");
                        return method.invoke(userOperation, args);
                    }
                });
        proxy.getUserName("333");
    }

}

4)输出结果

method = [public abstract java.lang.String com.caocao.IUserOperation.getUserName(java.lang.String)], args = [[Ljava.lang.Object;@23ab930d]
userId = [333]

2、CGLIB:适用于所有类,通过创建目标类的子类,来增强目标类的功能。

1)CGLIB实现

package com.caocao;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * Created by xuhui on 2019/10/8
 */
public class UserProxy {
    public static void main(String[] args) {
        cglib();
    }

    public static void cglib() {
        UserOperation userOperation = new UserOperationImpl();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(userOperation.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("method = [" + method + "], objects = [" + objects + "]");
                return method.invoke(userOperation, objects);
            }
        });
        UserOperation proxy = (UserOperation) enhancer.create();
        proxy.getUserName("333");
    }
}

2)结果输出

method = [public java.lang.String com.caocao.UserOperation.getUserName(java.lang.String)], objects = [[Ljava.lang.Object;@61baa894]
userId = [333]

原文地址:https://www.cnblogs.com/jave1ove/p/11636632.html

时间: 2024-08-28 18:29:11

spring AOP原理解析的相关文章

Spring Framework源码(六):Spring AOP之解析标签

首先看下spring framework配置例子: <aop:config> <aop:aspect id="myaop" ref="log"> <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/> <aop:before pointcut-ref="mycut"

spring aop 原理

http://blog.csdn.net/moreevan/article/details/11977115 Spring AOP 实现原理 2013-09-24 15:23 79554人阅读 评论(11) 收藏 举报  分类: spring(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)

Spring AOP原理

Spring利用动态代理技术实现了AOP增强功能.这个动态代理是通过Java的动态代理或CGLIB技术实现.具体根据代理对象实现的是类或者接口来决定. Spring AOP的过程跟我们平时使用动态代理的过程是很相似的,只不过它帮助我们自动组装了增强方法与代理对象,这样我们就可以更加灵活,因为我们可以选择增强触发的时机,而且更加关注我们要做的事情.从原理以及源代码的角度,整个过程还是分为两个阶段, 第一个阶段是生成代理对象,这个过程根据代理对象是否实现了接口来选择使用不同的工厂生成代理对象. 第二

spring aop原理 JDK动态代理和CGLIB动态代理

Spring的两大特性是IOC和AOPIOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果.理解spring的ioc也很重要.但是今天主要来和大家讲讲aop.AOP 广泛应用于处理一些具有横切性质的系统级服务,AOP 的出现是对 OOP 的良好补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP实现的关键在于AOP框架自动创建的AOP代理.AOP代理主要分为静态代理和动态代理, 静态代理的代表为AspectJ:动态代理则

spring底层原理解析

? 一.概念 1.Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系.其核心就是控制反转(IOC),和面向切面(AOP) ,简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架. 2.SpringMVC Spring 框架提供了构建 Web 应用

Spring AOP原理及拦截器

原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent).事务管理(Transaction Management).安全管理(Security).日志管理(L

[Solution] AOP原理解析及Castle、Autofac、Unity框架使用

AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发中的一个热点. 常用于: Authentication Caching Lazy loading Transactions AOP基本原理 普通类 1 2 3 4 5 6 7 8 9 class Person : MarshalByRefObject {     public string Say(

spring——AOP原理及源码(一)

教程共分为五篇,从AOP实例的构建及其重要组件.基本运行流程.容器创建流程.关键方法调用.原理总结归纳等几个方面一步步走进AOP的世界. 本篇主要为读者演示构建AOP实例及AOP核心组件分析. 一.项目构建 读者可直接下载示例工程,或复制以下的代码到本地工程开启教程. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0

spring——AOP原理及源码(二)

回顾: 在上一篇中,我们提到@EnableAspectJAutoProxy注解给容器中加入了一个关键组件internalAutoProxyCreator的BeanDefinition,实际类型为 AnnotationAwareAspectJAutoProxyCreator的BeanDenation 并且发现这是一个后置处理器,也是一个XXXAware接口的实现类.以及探究了它的继承关系如下. 接下来我们就从后置处理器和BeanFactoryAware的角度来看看AnnotationAwareAs