关于spring aop两种代理混用的问题

目录
  • spring aop两种代理混用问题
    • 一、首先复习一下两种代理
    • 二、我们项目是spring-boot项目
  • spring的aop和代理模式理解
    • 代理模式代码的主要特点是
    • 代理模式目前实现的方式有三种
    • Aop的最大意义是

spring aop两种代理混用问题

工作繁忙,但是遇到问题还是要总结积累下来,今天项目中出现了代理混用的问题,解决之后记录一下对两种代理方式的学习理解。

一、首先复习一下两种代理

JDK动态代理 和 cglib代理

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理;后者实际上是生成一个子类,来覆盖被代理类,那么父类的final方法就不能代理,因为父类的final方法不能被子类所覆盖。一般而言Spring默认优先使用JDK动态代理技术,只有在被代理类没有实现接口时,才会选择使用CGLIB技术来实现AOP。

但是也提供了配置参数来强制选择使用 CGLIB 技术,如下:

<aop:config proxy-target-class="true" /> 

proxy-target-class="true" 表示强制使用 CGLIB 技术来实现AOP,因为CGLIB是生成子类也就是代理类来实现的,所以proxy-target-class,表示是否代理目标类。<aop:config /> 就会由spring来选择,spring优先使用JDK动态代理来实现AOP。

二、我们项目是spring-boot项目

默认即为proxy-target-class="true",service实现类使用@service注解后都是使用CGLIB代理。

我遇到问题是,service某个方法添加@Async注解使该方法可异步调用,然后原有从spring容器中获取Bean对象的方法运行时就报错了,原来这个service实现类就不在使用CGLIB而是直接使用JDK动态代理。时间紧迫,具体原因后续再次分析,今天的记录就先到这里。

spring的aop和代理模式理解

Spring的AOP:即面向切面编程,其代码实质,即代理模式的应用。

代理模式代码的主要特点是

不改变原有类的前提下,在原有类某些方法执行前后,插入任意代码。所以代理模式需要写新的类对原有的类进行包装。

代理模式目前实现的方式有三种

  • 静态代理:需要增强原有类的哪个方法,就需要对在代理类中包装哪个方法。个人理解,从功能上来说,原有类和代理类不一定要实现共同接口,但是为了赋予代理和和被代理类之间的逻辑关系,增加程序的可读性,可理解性,逻辑性,增加代理对象和被代理对象之间的关系,以更加符合面向对象编程是思维,而应该实现共同接口。
  • 动态代理:使用反射机制,方法和对象都是传入的变量,就可以经过传入的对象和方法而动态调用被代理对象的任何方法,jdk中提供了实现此动态代理的api,被代理类必须实现接口
  • Cglib代理:返回对象是代理对象的子类,不需要代理对象实现接口。当调用原对象方法时,实际上调用的是代理子类的方法。

Aop的最大意义是

在不改变原来代码的前提下,也不对源代码做任何协议接口要求。而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码。

Struts2中的拦截器,spring中的赖加载都是用代理模式实现

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring中AOP概念与两种动态代理模式原理详解

    目录 1.概念 1.AOP技术简介 2.AOP的优势 3.Spring AOP术语 4.AOP 开发明确的事项 2.AOP底层实现 1.AOP 的动态代理技术: 3.基于cglib的动态代理代码 总结 1.概念 1.AOP技术简介 AOP 为Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一

  • 解决spring AOP中自身方法调用无法应用代理的问题

    目录 spring AOP中自身方法调用无法应用代理 如下例 可以使用如下两种方式修改代码以应用事务 (1)在MyServiceImpl中声明一个MyService对象 (2)使用AopContext类 spring aop 内部方法调用事务不生效 方法1: 方法2: spring AOP中自身方法调用无法应用代理 如下例 public class MyServiceImpl implements MyService { public void do(){ //the transaction a

  • Spring aop 如何通过获取代理对象实现事务切换

    Spring aop 获取代理对象实现事务切换 在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关, 这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识, 答案是: 通过spring aop类里面的AopContext类获取当前类的代理对象, 这样就能切换对应的事务管理器了,具体做法如下: (1).在applicationContext.xml文件中配置如下: <!-- 开启暴露Aop代理到ThreadLocal支持 --> &

  • Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例

    实例 代码已托管到Github-> https://github.com/yangshangwei/SpringMaster 在 Spring-AOP 静态普通方法名匹配切面 案例中,我们通过配置两个ProxyFactoryBean分别为waiter和seller的Bean创建代理对象, 如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • Spring AOP 与代理的概念与使用

    一.AOP 的基本概念 1.1 什么是 AOP Aspect Oriented Programming,面向切面编程. 就跟我们说 OOP 是面向对象一样,AOP 是面向切面的.切面是分散在应用中的一个标准代码或功能.切面通常与实际的业务逻辑不同(例如,事务管理).每个切面专注于一个特定的环切功能. 这里的切面呢,可以理解为横切.比如在所有的 DAO 层方法上加上一个同样的切面,功能是记录日志:又或者在某个接口上应用一个切面,作用是检查权限. AOP 是基于代理来实现的.而代理又分为静态代理和动

  • Spring-AOP @AspectJ进阶之如何绑定代理对象

    概述 使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了. 这里我们通过this()来了解对象绑定的用法: 实例 代码已托管到Github-> https://github.com/yangshangwei/SpringMaster 业务类 package com.xgj.aop.spring.advisor.aspectJAdvance.bindProxyObj; import

  • 带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理

    目录 1 基础 2 JavaBean属性 3 JDK和CGLIB代理 总结 若使用 Spring IoC 容器(ApplicationContext或BeanFactory)作为你的业务对象(你也应该这么做!),你会想使用 Spring AOP FactoryBean的一种. 工厂 bean 引入了中间层,让它创建不同类型的对象. 在Spring创建 AOP 代理的基本方式是使用 org.springframework.aop.framework.ProxyFactoryBean.这可以完全控制

  • 关于spring aop两种代理混用的问题

    目录 spring aop两种代理混用问题 一.首先复习一下两种代理 二.我们项目是spring-boot项目 spring的aop和代理模式理解 代理模式代码的主要特点是 代理模式目前实现的方式有三种 Aop的最大意义是 spring aop两种代理混用问题 工作繁忙,但是遇到问题还是要总结积累下来,今天项目中出现了代理混用的问题,解决之后记录一下对两种代理方式的学习理解. 一.首先复习一下两种代理 JDK动态代理 和 cglib代理 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代

  • spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 2. 开发需要被拦截的类. 3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式.这样的话,那就交由Spring AoP容器管理. 另外需要引用 aspectJ 的 jar 包:

  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 A. 抽象主题角色 声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题 B. 代理主题(Proxy)角色: 代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象:代理主题角

  • Spring中的两种代理JDK和CGLIB的区别浅谈

    一.原理区别: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用

  • 浅谈Spring的两种事务定义方式

    一.声明式 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等.详细配置如下: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="

  • 利用spring aop实现动态代理

    下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 package aop007_ComPrint; public interface Print { public void ColorPrint(); //彩色打印 public void WhitePrint(); //黑白打印 } 然后定义两个实现类,分别实现彩色打印和黑白打印 package aop007_ComPrint; public class ColorPri

  • 浅谈Spring的两种配置容器

    Spring提供了两种容器类型 SpringIOC容器是一个IOC Service Provider.提供了两种容器类型:BeanFactory和ApplicationContext.Spring的IOC容器是一个提供IOC支持的轻量级容器.除了基本的ioc支持,它作为轻量级容器还提供了IOC之外的支持. BeanFactory BeanFactory是基础类型IOC容器.顾名思义,就是生产Bean的工厂.能够提供完整的IOC服务.没有特殊指定的话,其默认采用延迟初始化策略.只有当客户端对象需要

  • Spring Boot两种全局配置和两种注解的操作方法

    目录 零.学习目标 一.全局配置文件概述 二.Application.properties配置文件 1.配置tomcat端口号和web虚拟路径 2.对象类型的配置与使用 3.两种属性注解方式的对比 三.Application.yaml配置文件 四.两种配置文件的比较 五.课后作业 零.学习目标 1.掌握application.properties配置文件 2.掌握application.yaml配置文件 3.掌握使用@ConfigurationProperties注入属性 4.掌握使用@Valu

  • SpringBoot/Spring AOP默认动态代理方式实例详解

    目录 1. springboot 2.x 及以上版本 2. Springboot 1.x 3.SpringBoot 2.x 为何默认使用 Cglib 总结: Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中,AOP如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxy

  • spring+hibernate 两种整合方式配置文件的方法

    之前的文章都是讲解springmvc+spring+mybatis 的整合,而很少有springmvc+spring+hibernate 因为工作的需要,最近在使用hibernate 所以下面我们来看看 spring整合hibernate的配置文件,这里只说spring+hibernate 的配置文件而不说springmvc 因为这些是不用变的. spring整合hibernate 有两种方式 1.注解方式 2.xml方式实现 1.注解方式实现: applicationContext.xml配置

随机推荐