最近在做项目时发现公司的产品都是基于公司搭建好的基础框架进行开发,由于基础框架已经进行了高度封装,这样好处是能够快速开发新功能,但是很快就发现有好多东西都是重复的。于是决定开发一个工具类,用来生成一些固定模版的代码。在写这个工具类时用到了大量的反射技术,为了更好的了解反射技术,便找来几本书来参考,便看到了java的AOP(面向切面)。之前有了解过,但是云里雾里的。为了更好的理解面向切面参考《疯狂java系列》自己写了小列子加强对“面向切面”的了解。这个例子很浅,如需要深入研究请参考其他资料。
这个列子是用人类上厕所为列。这里抽象人类上厕所的步骤为3步(1,脱动作,2.采用什么姿势,3,穿动作)。这个例子可能有点俗。人类分为男,女。无论男,女上厕所的步骤都可以抽象成这三个步骤,(1,3)的动作是一样的,但是(2)步可就不一样了。那么问题就来了。怎么在(2)动作的前后执行(1)和(3)步骤呢。下面看代码实现:
主要通过Proxy与InvocationHandler类生成代理
package com.daxingzsh.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * java动态代理 * 面向切面编程 * AOP * @author xinxin * */ public class GoToilot { public static void main(String[] args){ People target1 = new Woman(); People target2 = new Man(); People woman = ProxyFactory.getProxy(target1); People man = ProxyFactory.getProxy(target2); //使用代理生成的对象被切入了业务逻辑 woman.goToilot(); System.out.println("-------------------------"); man.goToilot(); } } /** * 代理工厂 * @author xinxin * */ class ProxyFactory{ @SuppressWarnings("unchecked") public static <T> T getProxy(T target){ MyInvockHander hander = new MyInvockHander(target); return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), hander); } } /** * 动态代理 * 将处理逻辑切入被代理对象方法 * @author xinxin * */ class MyInvockHander implements InvocationHandler{ private Object target; public MyInvockHander(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PeopleGoToToilot toToilot = new PeopleGoToToilot(); //在调用被代理对象方法前执行处理逻辑 toToilot.start(); Object result = method.invoke(target, args); //在调用被代理对象方法后执行处理逻辑 toToilot.end(); return result; } } /** * 人类接口 * @author xinxin * */ interface People{ /** * 上厕所抽象方法 */ public void goToilot(); } /** * 女人实现类 * @author xinxin * */ class Woman implements People{ @Override public void goToilot() { System.out.println("女:蹲式"); } } /** * 男人实现类 * @author xinxin * */ class Man implements People{ @Override public void goToilot() { System.out.println("男:站式"); } } /** * 上厕所业务类 * @author xinxin * */ class PeopleGoToToilot{ public void start(){ System.out.println("脱"); } public void end(){ System.out.println("穿"); } }
相关推荐
对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的...
总结来说,Spring通过AOP和动态代理机制实现了事务的声明式管理,极大地简化了Java EE应用的事务控制,降低了代码复杂性,提高了可维护性。开发者可以专注于业务逻辑,而无需关心事务管理的细节。
Spring.NET是中国开源社区基于.NET Framework实现的一个轻量级企业级应用框架,它是对Java平台上的Spring框架的.NET版本。在本教程中,我们将深入探讨Spring.NET中的重要组件——IOC(Inversion of Control,控制...
Spring AOP实现了基于代理(proxy-based)的AOP机制,通过代理对象拦截目标对象的方法调用并执行额外的逻辑。 **3.1.2 Spring AOP基础概念** Spring AOP的核心概念包括切面(aspect)、连接点(join point)、通知...
在0.9.1中,AOP主要通过基于代理的实现,为开发者提供了声明式事务管理的能力,极大地简化了事务处理的代码。 在0.9.1版本中,Spring还包含了对JDBC的支持,通过Spring的JdbcTemplate,开发者可以避免编写大量的...
Spring AOP部分会介绍AOP的基本概念、Spring中的AOP实现以及与动态代理(Dynamic Proxy)和CGLib等技术的结合使用。 DAO(Data Access Object)支持是Spring提供的数据访问抽象,它封装了数据访问的细节,使得...
从代理机制初探 AOP 动态代理 <br>AOP 观念与术语 Spring AOP Advices Advices 包括了Aspect 的真正逻辑,由于缝合至Targets的时机不同,Spring 提供了几种不同的 Advices。 Before ...