[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]
分享到:
相关推荐
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
配套教材,里面的代码测试过都是可运行的,配套学习很方便
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
Spring注解驱动开发第33讲——AOP原理总结
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 spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
NULL 博文链接:https://ylxy3058.iteye.com/blog/2224244
里面是精确的讲解了Aop 的配置 初级人员能够读懂的
源代码是spring-boot添加aop切面功能的demo,简单易懂.
开发工具 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...
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...
解释Spring中的Aop代理.
springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。...
介绍了springAop默认代理方式
JavaEE spring自动实现AOP代理
spring中AOP中标签加载通知,spring中AOP中标签加载通知spring中AOP中标签加载通知spring中AOP中标签加载通知,spring中AOP中标签加载通知
Java Spring代理模式AOP-IOC分析