`
gatusso52
  • 浏览: 110398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

代理模式、静态代理、动态代理、Spring AOP

阅读更多

什么是代理模式:

代理模式的作用其实就是为一个对象提供一种代理以控制这个对象,然后把这个代理提供给别人来使用。

 

代理模式会在那些情况下使用呢 ?

在某些情况下,一个客户不想或者不能直接引用 或者说在引用目标对象前后要进行一些额外的工作 时候,代理对象可以在客户端和目标对象之间起到中介的作用。

 

代理模式的角色有 3 种:

抽象角色 :声明真实对象和代理对象的共同接口;

代理角色 :代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口 以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作前后,附加其他的操作,相当于对真实对象进行封装 一些额外的服务。

真实角色 :代理角色所代表的真实对象,是代理最终要引用的对象。

 

===============================================================================

例子:

 

抽象角色:

 

package net.sx.staticProxy;

public interface SayHello {
	public void say();
}

 

真实角色:

 

package net.sx.staticProxy;

public class SayHelloImpl implements SayHello{
	public void say() {
		System.err.println("hello!");;
	}
}

===============================================================================

那么:

 

静态代理:

 

package net.sx.staticProxy;

public class SayHelloProxy implements SayHello{
	SayHello s ;
	public SayHelloProxy(SayHello s){
		this.s=s;
	}

	public void say() {
		System.err.println("before static");
		s.say();
		System.err.println("after static");
	}
	
}
 

调用:

package net.sx.staticProxy;

public class Test {
	public static void main(String[] args) {
		SayHello a = new SayHelloImpl();
		SayHello p = new SayHelloProxy(a);
		p.say();
	}
}
 

===============================================================================

 

动态代理:

 

package net.sx.dynamicProxy;

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

public class MyHandler implements  InvocationHandler{
	private Object proxyObj ;
	public MyHandler(Object proxyObj){
		this.proxyObj = proxyObj;
	}
	
	public Object invoke(Object proxy,Method method,Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		Object result = null;
		System.err.println("before dynamic");
		result = method.invoke(proxyObj, args);
		System.err.println("after dynamic");
		return result;
	}

}
 

调用:

 

package net.sx.dynamicProxy;

import java.lang.reflect.Proxy;

public class Test {
	public static void main(String[] args) {
		SayHello s = new SayHelloImpl();
		SayHello p = (SayHello)Proxy.newProxyInstance(SayHello.class.getClassLoader(),
				new Class[]{SayHello.class}, 
				new MyHandler(s));
		p.say();
	}
}
 

===============================================================================

 

另用spring实现代理:


Advice:

 

package net.sx.springProxy;

import org.aopalliance.intercept.MethodInvocation;
import org.aopalliance.intercept.MethodInterceptor;

public class MyInterceptor implements MethodInterceptor{
	public Object invoke(MethodInvocation invocation) throws Throwable{
		Object result=null;
		System.err.println("before spring");
		result = invocation.proceed();
		System.err.println("after spring");
		return result;
	}
}

 

xml:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="sayHelloImpl" class="net.sx.springProxy.SayHelloImpl" />
	<bean id="myInterceptor" class="net.sx.springProxy.MyInterceptor" />
	<bean id="sayHelloBean"
		class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="proxyInterfaces">
			<value>net.sx.springProxy.SayHello</value>
		</property>
		<property name="interceptorNames">
			<list>
				<value>myInterceptor</value>
				<value>sayHelloImpl</value>
			</list>
		</property>
	</bean>
</beans>
 

 

调用:

 

package net.sx.springProxy;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
	public static void main(String[] args) {

		ApplicationContext ctx = new FileSystemXmlApplicationContext(
				"/net/sx/springProxy/aop_bean.xml");
		SayHello sayHelloBean = (SayHello)ctx.getBean("sayHelloBean");
		sayHelloBean.say();

	}
}
 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...

    两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    代理模式及手实现动态代理(aop原理)一、代理模式1. 定义2. 示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态...

    spring-aop-review-tcf.zip

    SpringAOP代理设计模式demo代码实现,从静态代理、动态代理两方面进行了编码实现

    《剑指offer》Java代理.pdf

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP

    吴天雄--Spring笔记.doc

    第二天内容:AOP(AOP常用概念、Spring的三种aop实现方式、代理设计模式(静态代理和动态代理));第三天内容:Spring自动装配,Spring自动加载properties文件,单例设计模式,声明式事务,Ajax,JSON。 --author:

    spring4示例代码

    spring-3 演示使用动态代理模式实现面向切面编程 使用注解方式进行AOP编程及使用配置xml方式进行AOP编程 spring-4 演示了spring与JDBCTemplate配合使用 spring-5 演示了声明式事务及使用xml配置文件处理事务

    spring.doc

    SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理...

    Spring 的文章 以及详细介绍

    依赖注入 构造函数注入 import Bean的自动装配 使用注解 实现自动装配 注解开发 使用java的方法配置Spring 代理模式 静态代理 加深理解 AOP AOP操作(准备) AOP操作(AspectJ配置文件) jdbcTemplate(概念和准备)

    spring:Spring框架

    静态代理:由程序员创建或工具生成代理类的源码,再编译代理类,在程序运行前就产生了代理类的字节码文件,代理对象和目标对象的关系在程序运行前就决定了。 动态代理:在程序运行期间由JVM根据反射机制动态生成的,...

    java 自整理的基础面试知识

    以及复杂度、Spring、SpringAPI、Spring2依赖注入、Spring注解、Spring数据访问、Spring 的MVC、Spring拦截器 过滤器、Spring面向切面编程(AOP)、代理模式(静态代理、动态代理)、反射原理、程序设计六大原则、...

    spring security 参考手册中文版

    Spring Security 参考 1 第一部分前言 15 1.入门 16 2.介绍 17 2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 ...

    Spring入门到精通2017视频教程

    掌握系统框架设计原理,工厂模式,委托模式的实现,Spring的IOC依赖注入技术,Struts2,Hibernate与Spring的整合,ApplicationContext读取资源文件的3种方法,多个配置文件的加载与导入,静态代理与动态代理,...

    JAVA高并发高性能高可用高扩展架构视频教程

    揭开springAOP神秘面纱(动态代理) Mysql性能优化之索引优化 写实现Tomcat服务器 移动后台端框架设计 公司级框架原理解析 解密公司内部框架开发(打造属于自己的专属框架) 手写Tomca之深度解析动态资源请求原理 深度...

    【Spring】3.助你跟面试官侃一个小时的AOP

    代理模式 是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理...

    Java 基础核心总结 +经典算法大全.rar

    静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板...

    java面试题

    spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,...

    基于maven项目的SSM框架与layu前端框架的代码

    实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织...

    Java Web程序设计教程

    12.4springaop的代理工厂 253 12.4.1选择合适的代理 253 12.4.2proxyfactory 254 12.4.3proxyfactorybean 254 12.5项目实战——输出日志 256 本章小结 258 课后练习 259 第13章 spring与javaee持久化数据...

Global site tag (gtag.js) - Google Analytics