Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法

Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk)。

Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用

JDK提供的Proxy,和spring进一步封装的CGLIB。二者生成的代理没有任何区别,生成的都是代理对象。只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象

如何切换spring框架中默认生成代理的方式

<aop:config proxy-target-class=”true|false”></aop:config>

True代表使用目标类生成代理

False代表使用jdk的proxy接口生成代理(默认)

Proxy(代理):静态代理和动态代理

作用:起到传递会话的作用,中断整个会话。

好处:在完成核心业务的同时,做一些附加的操作。

目标类(target):被代理类称之为目标类。

开发代理的原则:和目标类功能一致且实现相同的接口。

静态代理

开发一个代理类,手动的为每个业务类添加代理方法,能够完成代理的功能。

问题:往往在开发中,书写的不仅仅是一个或两个业务层,开发的业务层有很多,如果为每一个业务层开发一个静态代理类,不仅没有减轻工作量,反而增加了工作量。于是就提出了动态代理的方法,为现有的业务层在运行的过程中动态创建代理类,通过动态代理类去解决现有业务层中业务代码冗余的问题。

动态代理

通过jdk提供的proxy这个类,动态为现有的业务生成代理类。

Proxy.newProxyInstance(loader,interfaces,h); //返回值就是动态代理对象

参数一:当前线程类加载器

参数二:生成代理类的接口类型

参数三:通过代理对象调用方法是会优先进入参数三中的invoke方法

原文地址:https://www.cnblogs.com/lkldeblog/p/10685848.html

时间: 2024-08-06 05:18:23

Spring框架中2种生成代理对象的方法的相关文章

Java中四种遍历Map对象的方法

方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(Map.Entry<Integer,Integer> entry:map.entrySet()){ System.out.println("key="

Java中两种动态代理的实现

本文介绍了java中两种动态代理的实现方法,Spring的动态代理也是基于这两种方法的.直接附上源码: 1.JDK实现 使用JDK实现动态代理必须使用接口 接口Work.java public interface Work { public void work(); } 实现类WorkImpl.java public class WorkImpl implements Work { @Override public void work() { System.out.println("我在工作&q

动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

动态代理创建的核心代码: TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance( Target.class.getClassLoader(),//与目标对象相同的类加载器 new Class[]{TargetInterface.class}, new InvocationHandler() { @Override //proxy 即该代理对象 //method 代理对象的方法,里面封装这接口中的所有方法 //arg

设计模式在 Spring 框架中的良好应用

在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三大类:创建模式.结构模式和行为模式.创建模式对于创建对象实例非常有用.结构模式通过处理类或对象的组合来作用于企业级应用的设计结构,从而降低了应用的复杂性,提

再析在spring框架中解决多数据源的问题

在前面我写了<如何在spring框架中解决多数据源的问题>,通过设计模式中的Decorator模式在spring框架中解决多数据源的问题,得到了许多网友的关注.在与网友探讨该问题的过程中,我发现我的方案并不完善,它只解决了一部分问题. 总结多数据源的问题,其实它需要分为以下三种情况:各个数据源的数据结构不同.各个数据源的数据结构相同.各个数据源的数据结构部分相同又有部分不同.对于第二种情况,各个数据源的数据结构相同,我们使用一个sessionFactory,而在sessionFactory中通

Spring5源码解析-Spring框架中的事件和监听器

事件和平时所用的回调思想在与GUI(JavaScript,Swing)相关的技术中非常流行.而在Web应用程序的服务器端,我们很少去直接使用.但这并不意味着我们无法在服务端去实现一个面向事件的体系结构. 在本文中,我们将重点介绍Spring框架中的事件处理.首先,会先介绍下事件驱动编程这个概念.接着,我们会将精力放在专门用于Spring框架中的事件处理之上.然后我们会看到实现事件调度和监听的主要方法.最后,我们将在Spring应用程序中展示如何使用基本的监听器. 事件驱动编程 在开始讨论事件驱动

dubbo源码分析三:consumer注册及生成代理对象

本章我们将分析一下consumer向注册中心注册,并获取服务端相应的信息,根据这些信息生产代理对象的过程和源码. 1.类图 上图展示了部分消费者注册及生成代理对象过程中需要使用到的类和接口,其中: spring适配涉及到的类:DubboNamespaceHandler.DubboBeanDefinitionParser.ReferenceBean; 配置信息存储:ReferenceConfig.RegistryConfig.MonitorConfig.ProtocolConfig.Consume

【Spring】8、Spring框架中的单例Beans是线程安全的么

看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的.如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全. 最浅显的解决办法就是将多态bean的作用域由"singleton&

Spring框架中的aop

1.建立了日志类 package cn.edu.proxy.cglibproxy; public class Logger { public void logging() { // TODO Auto-generated method stub System.out.println("logging"); } } 2.建立安全类 package cn.edu.proxy.cglibproxy; public class Security { public void security()