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

一步一步学习spring(五)——AOP之代理模式

阅读更多
[size=medium]
在开发的过程中,我们总在专注逻辑的具体实现。但是,在实现过程中,我们不得不加上逻辑除外的其它处理,比如说,记录日志、异常处理、权限验证等。

   在具体逻辑中,加上日志记录、权限验证等处理时有什么不妥呢?我认为主要有以下几点:
   1. 大家都在追求简洁易读的代码,如果在具体逻辑实现中夹杂些与业务不相干的代码,这样的代码能简洁易读吗?
   2. 代码开发过程中,大家都希望自己写的代码有复用性、移植性,这样,既减少了代码的开发量,又使自己的代码显得简洁。没听到大师常说吗?这框架还好,就是侵入性比较大,为什么侵入性不好,就是由于限制了开发出来代码的复用性和移植性。同理,在具体逻辑实现中夹杂与业务不相干的代码,同样限制了开发出来代
码的复用性和移植性。

   怎么解决上面出现的问题呢?还好,可以使用java中的代理模式来解决这个问题。你可以采用自己写的接口代理来处理这个问题,也可以使用JDK自带的java动态代理。

   虽然,网上这种例子很多,但我自己温习时,也写了个例子,大家可以看看,如果觉得不生动,可以在网上找,这种实例网上一大堆。

   先贴出接口代理的例子吧。此例子主要是描述销售商销售物品的处理,其中,销售物品时主要逻辑,而是否有资格销售则是逻辑外的验证,判断是否有资格销售物品,主要看销售商是否有营业执照。

   销售对象接口类 SalesObject.java

package com.tja.test.proxyTest;

/**
 * 销售对象接口
 * 
 */
public interface SalesObject {
    
	Object sell();
}



   以下是电脑销售商类,是销售对象接口的具体实现,实现的主要逻辑是销售电脑,sell()方法,ComputerSales具体代码如下:

package com.tja.test.proxyTest;

/**
 * 电脑销售商
 *
 */
public class ComputerSales implements SalesObject {

	public Object sell() {
		System.out.println("电脑销售商卖出一台电脑!");
		return new Object();
	}

}


要销售电脑,必须要营业执照啊。所以,在电脑销售商销售电脑时,要判断它是否有办营业照,而这个验证处理写在sell()方法里,就出现了上面描述处理逻辑中夹杂着与业务部相干代码问题,所以,我们写个代理类来解决上面问题。ComputerSalesProxy具体代码如下:

package com.tja.test.proxyTest;

public class ComputerSalesProxy implements SalesObject {

	ComputerSales cs;
	
	public ComputerSalesProxy(ComputerSales cs) {
		this.cs = cs;
	}
	public Object sell() {
		Object obj = null;
        if(checkValidity(cs)) {
        	obj = cs.sell();
        } else {
        	System.out.println("该电脑销售商经营不合法,不能销售电脑");
        }
		return obj;
	}
	
	/**
	 * 验证该电脑销售商的经营合法性
	 * 
	 * @param cs
	 *        电脑销售商
	 * @return
	 */
	public boolean checkValidity(ComputerSales cs) {
		System.out.println("此电脑销售商已经办了营业执照,可以合法销售电脑!");
		return true;
	}
}



测试方法如下:
package com.tja.test.proxyTest;

public class Test {

	public static void main(String[] args) {
		ComputerSalesProxy proxy = new ComputerSalesProxy(new ComputerSales());
		proxy.sell();
		/*ProxyObject po = new ProxyObject(new ComputerSales());
		((SalesObject)po.getProxyObject()).sell();*/
	}
}


得出结果:此电脑销售商已经办了营业执照,可以合法销售电脑!
         电脑销售商卖出一台电脑

2. 使用jdk自带的动态代理来处理以上问题。注意:要对某个类进行代理,要求该类必须实现一接口。2 采用jdk中的InvocationHandler进行动态代理。具体代理如下:
package com.tja.test.proxyTest;

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

public class ProxyObject implements InvocationHandler {

	private Object aimObj;
	
	public ProxyObject(Object obj) {
		this.aimObj = obj;
	}
	
	public Object getProxyObject() {
		return Proxy.newProxyInstance(aimObj.getClass().getClassLoader(), aimObj.getClass().getInterfaces(),this);
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		boolean boo = checkValidity((SalesObject)proxy);
		Object object = null;
		if(boo) {
			object = method.invoke(aimObj, args);
		}
		return object;
	}

	public boolean checkValidity(SalesObject cs) {
		System.out.println("此电脑销售商已经办了营业执照,可以合法销售电脑!");
		return true;
	}
}



测试方法如下:
package com.tja.test.proxyTest;

public class Test {

	public static void main(String[] args) {
		/*ComputerSalesProxy proxy = new ComputerSalesProxy(new ComputerSales());
		proxy.sell();*/
		ProxyObject po = new ProxyObject(new ComputerSales());
		((SalesObject)po.getProxyObject()).sell();
	}
}


得出结果: 此电脑销售商已经办了营业执照,可以合法销售电脑!
          电脑销售商卖出一台电脑!
[/size]
3
0
分享到:
评论

相关推荐

    Spring 入门案例——AOP

    1. **通知(Advice)**:在Spring AOP中,有五种不同类型的通知: - 前置通知(Before Advice):在目标方法被调用之前执行。 - 后置通知(After Advice):在目标方法执行完成后,无论是否抛出异常都会执行。 - ...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    五、Spring源码分析——Spring Aop

    在Spring框架中,AOP主要通过代理模式实现,提供了声明式的通知(advises)和切面(aspects)。 Spring AOP分为两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,如果目标类实现了接口,Spring会...

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

    Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...

    Spring——aop

    在Java开发领域,Spring框架是不可或缺的一部分,它提供了许多强大的功能,其中AOP(面向切面编程)是其重要特性之一。AOP允许开发者将关注点分离,使得业务逻辑代码与系统服务如日志、事务管理等可以独立处理,提高...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你深入理解这一强大的编程模式。 一、AOP概念 1. Joinpoint(连接点):在Spring AOP中,Joinpoint指的是程序执行的某个特定点...

    spring-boot aop

    Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...

    Java Spring代理模式AOP-IOC分析

    Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...

    Spring注解驱动开发第33讲——AOP原理总结

    Spring注解驱动开发第33讲——AOP原理总结

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    spring学习(aop ioc代理模式的理解以及整合mybatis进行开发使用)

    spring学习(aop ioc代理模式的理解以及整合mybatis进行开发使用)

    java Spring代理模式AOP-IOC结合

    Java Spring 代理模式 AOP-IOC 结合 从给定的文件信息中,我们可以总结出以下知识点: 一、为什么需要代理模式 在软件开发中,我们经常会遇到一些非功能性需求,如日志记录、身份验证、性能监控等,这些需求会...

    springAop默认代理方式.zip

    4. **代理模式的创建**:Spring AOP 使用`org.springframework.aop.framework.ProxyFactoryBean`或`@EnableAspectJAutoProxy`注解来配置代理。`ProxyFactoryBean`是XML配置方式,而`@EnableAspectJAutoProxy`是基于...

    解释Spring中的Aop代理

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改源代码的情况下,向应用程序添加跨切面的...理解和熟练运用AOP代理能够极大地提高代码的可维护性和复用性,是Spring开发者必备的技能之一。

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    征服Spring AOP—— @AspectJ

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。@AspectJ是Spring AOP的一种注解驱动方式,它极大地简化了...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

Global site tag (gtag.js) - Google Analytics