Spring 接口代理 类代理

1.Question Description :

when you use @Transactional annotation and @RequiresPermissions annotation (about shiro) together,

you will find the @RequiresPermissions annotation donot work, why?

2. Explain:

It‘s caused by the Proxy Mechanism of Spring, because the Spring framework preference for Interface Proxy than Class Proxy,

the method of the class ExampleServiceImpl was agented several times.

Let‘s look the two kinds of Interface.

2.1 @Transactional Annotation:

It was  based on the Interface Proxy default, so it will produce Proxy Object One just like ExampleServiceImpl$$;

2.2  @RequiresPermissions :

It was based on the Interface Proxy default too, but it produces Proxy Object Two based on Proxy Object One just like ExampleServiceImpl$$$$,

that is a really Class Proxy.

  2.3  when the two kinds of Proxy way exist together,  the Classs Proxy will out of action.

3.  Solution:

we should change its Proxy Way, as follows:

and the same time, change the Proxy Way of Spring, as follows:

    

then @RequiresPermissions Annotation works!

时间: 2024-11-05 20:46:02

Spring 接口代理 类代理的相关文章

java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。

1.java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理. 2.代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理在把方法给用户前可以添加一些方法,如错误日志,用户类的方法运行的时间来监听类方法的性能.当代理完成时候就是当代理调用方法时候,就会启动InvocationHandler里的invoke方法.用户并不知道用户要为哪个类带理,因此在框架中用配置文件来获取代理的类,用户需要用框架时候就修改配置文件即可.

AOP 代理类的创建

AOP 代理类的创建 入口:AnnotationAwareAspectJAutoProxyCreator#postProcessAfterInitialization 和 AnnotationAwareAspectJAutoProxyCreator#getEarlyBeanReference /** * 代理配置:保证所有的代理创建者都有一致的属性配置 */ public class ProxyConfig implements Serializable { /** use serialVers

啰里吧嗦式讲解java静态代理动态代理模式

一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于是遇到了动态代理这个大坑, 写博客等于是对自己学习过程的一个回顾和总结 本文主要参考欧阳锋的10分钟看懂动态代理设计模式 二.理解和弄懂代理的前期准备 2.1.什么是代理 简单来说就是有活不自己干,让别人干, 比如你不想写作业, 让同学帮你写,然后写上自己的名字, 这个同学就是你的代理, 帮你处理一

Spring AOP(基于代理类的AOP实现)

#基于代理类的AOP实现:step1: 1 package com.sjl.factorybean; 2 /**切面类*/ 3 import org.aopalliance.intercept.MethodInterceptor; 4 import org.aopalliance.intercept.MethodInvocation; 5 6 public class MyAspect implements MethodInterceptor { 7 @Override 8 public Obj

带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动

上一章节我们已经实现了从客户端往服务端发送数据并且通过反射方法调用服务端的实现类最后返回给客户端的底层协议. 这一章节我们来实现客户端代理类的注入. 承接上一章,我们实现了多个底层协议,procotol 有 netty,http,和 socket 三个实现类,每个实现类都有启动服务端和客户端发送数据两个方法. 问题 如何实现底层协议的选择那? 可以通过配置文件来选择协议. 单独的配置文件还是和 Spring 的配置文件结合起来那? 我们选择与 Spring 结合的配置文件,自定义一些属性的标签,

基于代理类实现Spring AOP

目录 ProxyFactoryBean类介绍 基于JDK动态代理的Spring  AOP实现 基于CGLIB代理的Spring  AOP实现 Spring的通知类型 ProxyFactoryBean类 虽然直接使用代理就可以创建代理的实例,但需要自己写创建代理的方法,比如JDK动态代理: 1 ........ 2 //创建代理方法,参数是目标接口的实例 3 public Object createProxy(UserInterface user){ 4 this.user=user; //初始化

Spring AOP 实现原理(三) 使用 使用 CGLIB 生成代理类

CGLIB(Code Generation Library),简单来说,就是一个代码生成类库.它可以在运行时候动态是生成某个类的子类. 此处使用前面定义的 Chinese 类,现在改为直接使用 CGLIB 来生成代理,这个代理类同样可以实现 Spring AOP 代理所达到的效果. 下面先为 CGLIB 提供一个拦截器实现类: public class AroundAdvice implements MethodInterceptor { public Object intercept(Obje

连接MyBatis内部SqlSession与业务接口的代理类MapperProxy

目的 系统中的业务接口需要调用MyBatis的SQL时,业务接口定义的参数不符合MyBatis自己内部的规范,那么就需要把业务接口的参数转换成MyBatis内部参数规,MapperProxy代理就完成了这一职责,下面就来分析一下. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {     if (Object.class.equals(method.getDeclaringCla

jdk代理(只能代理实现了接口的类)

被代理对象实现了某些接口,在运行时产生class(代理)类,使用动态代理实现InvocationHandler接口 1.创建一个实现InvocationHandler的类,它必须实现invoke(proxy:被代理对象,method:被代理方法,args:方法的参数)方法,定义一个Object对象,写一个有参构造器传入.调用method.invoke(target)方法 2.创建被代理的类以及接口,含有业务逻辑方法 3.调用Proxy的静态方法,创建一个代理类Proxy.newProxyInst