AOP之代理模式(一)

AOP,为Aspect OrientedProgramming的缩写,意为:面向切面,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

说了一堆很官方的话,大家可能不是特别明白,不过这些算是我们实践的理论寄出去,还是很有必要知道的,但是现在不必要很懂,接下来从最简单的代码开始,一步步的慢慢深入了解,到底什么是AOP,什么是代理模式。学习,就是这样一个理论与实践相结合的过程。

先来看一下最基本的,没有任何优化的代码:

/**
 * 业务接口类
 * @author sunliduan
 *
 */
public interface Greeting {
	void sayHello(String name);
}
package com.tgb.sld;
/**
 * 业务实现类
 * @author sunliduan
 *
 */
public class GreetingImpl implements Greeting {

	@Override
	public void sayHello(String name) {
		System.out.println("Hello! " + name);
	}
}

由于业务变动,我需要在执行sayHello之前,插入一段代码b,实现某项功能,例如日志或者工作流等。最简单的就是直接在业务实现类里直接插入这段代码,然后在sayHello方法中调用这段代码。详见以下代码:

package com.tgb.sld;
/**
 * 业务实现类
 * @author sunliduan
 *
 */
public class GreetingImpl implements Greeting {

	@Override
	public void sayHello(String name) {
		before();
		System.out.println("Hello! " + name);
		after();
	}

	private void before() {
		System.out.println("Before==我在被切类的里面");
	}

	private void after() {
		System.out.println("After==我在被切类的里面");
	}

}

可是这样有很多缺点:首先是插入的方法before()和after()不能得到复用,某一个需要插入这两个方法的类都需要复制粘贴到本类中;而过多的复制粘贴也必然造成维护极不方便,我们需要修改每一处复制粘贴的地方,一不小心有一个地方忘记修改了,那可就麻烦啦。其次要想插入新的功能方法,我们必须停止已经运行的服务,重新编译部署,这对用户来说是很不友好的。

为了解决以上的问题,我们可以使用代理模式,且看下面代理模式的一步步发展。

第一步:静态代理,其实就是设计模式中的Proxy模式。

/**
 * 业务接口类
 * @author sunliduan
 *
 */
public interface Greeting {
	void sayHello(String name);
}
/**
 * 业务实现类
 * @author sunliduan
 *
 */
public class GreetingImpl implements Greeting {

	@Override
	public void sayHello(String name) {
		System.out.println("Hello! " + name);
	}
}

为了实现切入方法和业务方法的解耦,我们加入了一个代理类:

/**
 * 静态代理类
 *
 * @author sunliduan
 *
 */
public class GreetingStaticProxy implements Greeting {

	private Greeting greeting;

	// 用静态代理类GreetingProxy代替Greeting类
	public GreetingStaticProxy(Greeting greeting) {
		super();
		this.greeting = greeting;
	}

	@Override
	public void sayHello(String name) {
		before();
		greeting.sayHello(name);
		after();
	}

	private void before() {
		System.out.println("Before==通过静态代理把我加到被切方法之前");
	}

	private void after() {
		System.out.println("After==通过静态代理把我加到被切方法之后");
	}
}

来看一看客户端如何调用:

public class Client {

	public static void main(String[] args) {
		Greeting staticProxyGreeting = new GreetingStaticProxy(new GreetingImpl());

		staticProxyGreeting.sayHello("sunliduan");

	}

}

业务不需要专门去调用,而是走到静态代理类里的sayHello方法,顺理成章的执行了切入方法,并调用了原来的业务方法。

可以说静态代理也就是设计模式中的代理模式,它是AOP的雏形。不过从这段代码看:1、要实现代理方式,必须要定义接口。2、每个业务类,必须有一个代理类。

但是一个业务类需要对应一个代理类,这样的代码还是有坏味道的,还是不能实现很好的复用。接下来动态代理就来了,敬请期待下一篇博客~~

时间: 2024-12-29 15:32:38

AOP之代理模式(一)的相关文章

AOP基础—代理模式

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行

反射实现AOP动态代理模式(Spring AOP实现原理)

其实AOP的意思就是面向切面编程. OO注重的是我们解决问题的方法(封装成Method),而AOP注重的是许多解决问题的方法中的共同点,是对OO思想的一种补充! 还是拿人家经常举的一个例子讲解一下吧: 比如说,我们现在要开发的一个应用里面有很多的业务方法,但是,我们现在要对这个方法的执行做全面监控,或部分监控.也许我们就会在要一些方法前去加上一条日志记录. 我们写个例子看看我们最简单的解决方案 我们先写一个接口IHello.java代码如下: package sinosoft.dj.aop.st

AOP之代理模式(三)

JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 .如果想代理没有实现接口的类可以使用CGLIB包.先来看看GCLIB的具体使用,然后再对应代码深入理解. 在使用CGLIB时需引入cglib-nodep-2.1_3.jar包. 先来一个基础类,注意,这里没有对应的接口. public class GreetingImpl { public void sayHello(String name) { Syste

AOP之代理模式(二)

上篇博文介绍的静态代理有一个最主要的缺点:每个业务类,必须有一个代理类.这样在程序中就会出现很多个代理类,这样的代码还是有坏味道的.这篇文章就为了解决这个问题而来--JDK动态代理. 先来看一看最基本的业务接口和业务类: <span style="font-size:18px;">/** * 业务接口类 * @author sunliduan * */ public interface Greeting { void sayHello(String name); }<

代理模式——用AOP测试业务层方法的执行时间

代理模式 对代理模式的理解,通过http://www.runoob.com/design-pattern/proxy-pattern.html 对AOP的代理模式,参考https://www.cnblogs.com/xujiming/p/5737531.html 目标:测试service层每一个方法的执行时间: 代理模式的本质:将被代理对象注入给代理对象,当调用代理对象时,实际上,是在调用被注入的被代理对象 理解: 代理对象 被代理对象 代理类 被代理对象 商家 厂商 房屋中介 房东 静态代理:

Java的代理模式

最近在学习Spring,关于Spring AOP的代理模式不是很了解,看了一篇博文就懂了. https://www.cnblogs.com/cenyu/p/6289209.html Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方

代理模式-利用JDK原生动态实现AOP

一.目录 二.概述与模型 1.概述 含义:控制对对象的访问. 作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理. 举例:我们在学习JDBC的时候,在批量处理的时候遇到过事务.流程:设置提交方式为手动提交-开启事务-批量处理-关闭事务-设置提交方式为默认.从这里我们清晰可以看见,每次进行批处理的时候,唯有增删改操作变化,其他的操作都是一样的.那么,我们可不可以把一样的操作提取出来交给一个类处理,批量操作提取出来交给一个类实现?

代理模式 与 Spring AOP

AOP:在一个服务的流程中插入与业务逻辑无关的系统服务逻辑(例如Logging.Security),这样的逻辑称为Cross-cutting concerns,将Cross-cutting concerns独立出来设计为一个对象,这样的特殊对象称之为Aspect,Aspect-oriented programming着重在Aspect的设计上以及与应用程序的织入(Weave). 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把

设计模式--5.5 代理模式-通用代码及aop

1.通用代码 (1)Subjects package com.design.代理模式.通用代码; public interface Subject { void request(); } (2)RealSubjects package com.design.代理模式.通用代码; public class RealSubject implements Subject { @Override public void request() { // TODO Auto-generated method