Object-proxy

Spring AOP 浅析

余生颓废 提交于 2021-02-19 17:02:18
Spring AOP是由接入BeanPostProcessor后置处理器开始的,它是Spring IoC容器经常使用的一个特性,这个Bean后置处理器是一个监听器,可以监听容器触发的Bean声明周期时间。向容器注册后置处理器之后,向容器中管理的Bean就具备了接受IoC容器回调事件的能力。 BeanPostProcessor的使用非常简单,只需要提供一个BeanPostProcess接口的实现类 BeanPostProcessor的源码如下: public interface BeanPostProcessor { //在Bean的初始化之前提供回调入口 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } //在Bean的初始化之后提供回调入口 @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } BeanPostProcessor后置处理器的调用发生在Spring

jdk动态代理模式

寵の児 提交于 2021-01-27 17:27:05
原理 在程序的执行过程中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类 作用 访问控制,在代理中,控制是否可以调用目标对象的方法 功能增强,可以完成在目标对象的调用是增加额外的功能 可以随时给不同的目标创建代理类 实现步骤 1 创建接口,定义目标类要完成的功能 public interface HelloService { void sayHello(); } 2 创建目标类实现接口 public class HelloImpl implements HelloService { @Override public void sayHello() { System.out.println("Hello"); } } 3 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能 public class MyInvokerHandler implements InvocationHandler { private Object target; /** * 传入目标对象,对其创建代理对象 * @param target */ public MyInvokerHandler(Object target) { this.target = target; } /** * invoke()代理类需要完成的功能 * * @param proxy

【奇淫巧技】Java动态代理(JDK和cglib)

时光怂恿深爱的人放手 提交于 2020-12-30 14:29:17
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 首先看一下静态代理: 1、Count.java package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); } 2、CountImpl.java package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author Administrator *

java设计模式-----11、代理模式

。_饼干妹妹 提交于 2020-12-06 13:42:59
  Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。   所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。   代理模式的结构   代理模式的角色与职责     1、subject(抽象主题角色) :真实主题与代理主题的共同接口或抽象类。     2、RealSubject(真实主题角色): 定义了代理角色所代表的真实对象。     3、Proxy(代理主题角色): 含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。   举个例子说明一下代理模式   比如说买书,网上有很多专门卖书的网站,我们从这些商城买书,但是书不是这些商城印的,他们只负责卖,书是出版社印的,所以说到底,我们其实还是从出版社买书,网上书城只是出版社的代理,所以出版社是被代理对象,书城是代理对象。   所以,根据角色与职责划分, subject(抽象主题角色) 就是卖书,卖书是书城与出版社的共同功能, RealSubject(真实主题角色) 就是出版社,它的功能就是卖书,但不直接卖给用户,而是被书城代理,通过代理来卖, Proxy(代理主题角色) 就是书城

Java动态代理

回眸只為那壹抹淺笑 提交于 2020-11-18 23:56:22
jdk动态代理 实现原理:利用字节码技术,生成新的class文件,来达到动态代理效果。 新的class文件是怎么组织的?由于代理目标是接口,则通过实现接口和继续代理类来完成。看看下面的例子更容易明白。 demo 接口 public interface PeoPleInterface { void say() throws Throwable; } 实现类 public class GrilPeoPle implements PeoPleInterface { @Override public void say() { System.out.println("女人说"); } } 代理类 public class PeoPleInvacationHandler implements InvocationHandler { private Object obj; public PeoPleInvacationHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("人类开始"); Object invoke = method.invoke

spring动态代理的理解(java)

佐手、 提交于 2020-10-14 11:52:06
java动态代理的理解 代理模式是设计模式的其中一种 , 也是Java相关框架中的重要应用。我也是初学者, 个人见解, 不喜勿喷, 简单的说就是需要 进行功能增强的代理类 和 原本真实对象的被代理类 会实现同样的接口, 代理类的字节码文件是在jvm运行的时候动态生成该类(下面进行的介绍), 但是代理类会多去继承一个Java中的 Proxy 类 , 代理类负责为代理类(也就是生成真是对象的java类)预处理信息、增强信息、过滤信息最终把已经增强的转发给代理类。然而,回想之后,代理类又是谁生成的呢? 因此,还需要一个类去动态的生成代理类,这个类在编写的时候还需要用到一个Java中的invocationhandler类,这个类是用于增强 被代理类 中的方法,也就是谁继承了invocationhandler,谁就要去实现该接口对需要增强的类的方法(该接口中的invoke方法), 并且通过调用 代理类生成器的生成代理类方法 ,就会去调用该实现类的invoke方法, 这是个人自己的理解,所说的动态生成器类就是在这个生成动态代理类的Java类中,不能有别的自己编写的Java类的引用( 可以在该类中看是否有import导入自己编写的类 ),万事俱备, 只欠东风, 那就是搞一个测试, 去看下按照自己的理解是否可行。 1.首先先编写dao和service的代码 dao实现部分代码 public

代理模式

旧巷老猫 提交于 2020-08-12 06:45:12
一 代理模式简介 代理(Proxy)是一种设计模式 提供了对目标对象另外的访问方式 代理对象代理目标对象 达到增强目标对象功能的目的 二 静态代理 需要定义接口或者父类 代理对象与目标对象一起实现相同接口或者继承相同父类 优点: 在不修改目标对象的功能前提下 对目标功能扩展 缺点: 因为代理对象需要与目标对象一起实现相同接口或者继承相同父类 所以会有很多代理类 导致类太多 同时 如果接口增加方法 代理对象与目标对象都要维护 1. 接口 /** * 接口 * Created by Hy on 2020/7/10. */ public interface IUserService { void insertUser(); String deleteUser( int id); } 2. 目标对象 /** * 目标对象 * Created by Hy on 2020/7/10. */ public class UserService implements IUserService { @Override public void insertUser() { System.out.println( "insert ok" ); } @Override public String deleteUser( int id) { System.out.println( "delete... ...

代理模式

强颜欢笑 提交于 2020-08-11 15:00:19
一 代理模式简介 代理(Proxy)是一种设计模式 提供了对目标对象另外的访问方式 代理对象代理目标对象 达到增强目标对象功能的目的 二 静态代理 需要定义接口或者父类 代理对象与目标对象一起实现相同接口或者继承相同父类 优点: 在不修改目标对象的功能前提下 对目标功能扩展 缺点: 因为代理对象需要与目标对象一起实现相同接口或者继承相同父类 所以会有很多代理类 导致类太多 同时 如果接口增加方法 代理对象与目标对象都要维护 1. 接口 /** * 接口 * Created by Hy on 2020/7/10. */ public interface IUserService { void insertUser(); String deleteUser( int id); } 2. 目标对象 /** * 目标对象 * Created by Hy on 2020/7/10. */ public class UserService implements IUserService { @Override public void insertUser() { System.out.println( "insert ok" ); } @Override public String deleteUser( int id) { System.out.println( "delete... ...

Bean后置处理器

主宰稳场 提交于 2020-08-06 05:35:04
示例 @Component public class IndexA { @Autowired IndexB bbb; public IndexA() { System.out.println( "IndexA constructor..." ); } public void printf(){ System.out.println( "indexA printf : " ); System.out.println("indexB --> " + (bbb == null ? null : bbb.getClass().getName())); } } @Component public class IndexB { @Autowired IndexA aaa; public IndexB() { System.out.println( "IndexB constructor..." ); } public void printf(){ System.out.println( "indexB printf : " ); System.out.println("indexA --> " + (aaa == null ? null : aaa.getClass().getName())); } } @Configuration @ComponentScan({ "com.study

Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法

人盡茶涼 提交于 2020-08-05 23:10:20
1. BeanFactory   BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。   Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。   实例化容器 1 Resource resource = new FileSystemResource("beans.xml" ); 2 BeanFactory factory = new XmlBeanFactory(resource); 1 ClassPathResource resource = new ClassPathResource("beans.xml" ); 2 BeanFactory factory = new XmlBeanFactory(resource); 1 ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {