【spring框架】利用动态代理实现AOP

简介:
目标:生成一个UserDao的代理,然后在代理执行的过程中,把关于日志记录的逻辑加进去。

UserDao.java:
package cn.edu.hpu.dao;

import cn.edu.hpu.model.User;
public interface UserDao {
	public void save(User u);
}

UserDaoImpl.java:
package cn.edu.hpu.dao.Impl;

import cn.edu.hpu.dao.UserDao;
import cn.edu.hpu.model.User;


public class UserDaoImpl implements UserDao{


	public void save(User u) {
	    System.out.println("add success!!");		
	}


}

现在需要要在执行UserDaoImpl的save方法之前和之后执行LogIntercept类的beforeMethod与afterMethod方法赖创建日志。


首先让LogIntercept类实现动态代理的接口InvocationHandler
然后重写invoke方法。
package cn.edu.hpu.aop;


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


//日志的拦截器
public class LogIntercept implements InvocationHandler{
	private Object terget;
	
	public void beforeMethod(){
		System.out.println("save start...");
	}
	
	public void afterMethod(){
		System.out.println("save end...");
	}


	public void setTarget(Object terget) {
		this.terget=terget;
	}
	//无论调用代理对象的哪个方法,invoke方法都要被调用
	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {
		beforeMethod();
		m.invoke(terget, args);
		afterMethod();
		return null;
	}
}

测试方法:
@Test
public void testProxy(){
	//产生一个被代理的对象
	UserDao userDao=new UserDaoImpl();
	LogIntercept li=new LogIntercept();
	li.setTarget(userDao);
	UserDao userDaoProxy=(UserDao)Proxy.newProxyInstance(
			userDao.getClass().getClassLoader(), 
			new Class[]{UserDao.class}, 
			li);
	userDaoProxy.save(new User());
}

测试结果:
save start...
add success!!
save end...


当你有一件事情,需要在多个方法上面都要加相同的业务逻辑的时候,用动态代理会帮你省好多事情。

剖析一下动态代理的实现:
UserDao userDaoProxy=(UserDao)Proxy.newProxyInstance(
			userDao.getClass().getClassLoader(), 
			new Class[]{UserDao.class}, 
			li);
得到的是UserDao接口吗?测试一下:
System.out.println(userDaoProxy.getClass());
得到:class $Proxy4
说明userDaoProxy并不是UserDao接口,而是JDK的一个动态代理类$Proxy4,它是根据你传给它的参数中的接口那一项,得到接口本身,继而拿到接口的所有方法,哪个方法调用都会把接口本身传给invocationHandlder(li的invoke方法拿到)。

好了,我们写完了动态代理的AOP,但是,到底什么是AOP(Aspect-Oriented-Programming)面向切面编程呢?

你会发现,我们正常的程序写起来就是一条直线,比如:
接受用户名密码--->连接数据库--->创建XXX对象--->存储--->创建日志--->END

而面向切面编程就好像我们在中间"咔嚓"砍掉一刀,在上面加上逻辑,在另外一个地方"咔嚓"一刀,也在上面加逻辑,而方法自己本身并不知道。

面向切面编程是面向对象编程的有一伟大思想。应用的地方太多,权限、日志、检查、事务(可以在CRUD方法前加上Transiention.start(),事务结束后加上Transiention.commit())、异常的管理(单独写一个业务逻辑,想给哪个方法加异常管理就加)。

比如权限,再给每个JSP文件设权限的时候,在每个JSP文件开始的时候要做个检查,正常的写JSP文件或方法,我们的业务逻辑才是我们的主要内容,但是由于要检查权限,非要在前面加上检查权限的代码,代码会很繁琐,不会专注于特定的内容了,而且去掉它的时候会很麻烦。

但是利用面向切面的编程,就不会产生这些问题,而且这些加上的业务逻辑可以利用Spring的配置文件轻松的去掉或者加上。

现在是实现了InvocationHandler,如果利用Spring,不用实现InvocationHandler{接口也可以,它就是使用了直接生成二进制码,用继承。
Sturts2中的拦截器使用的就是AOP切面编程

顺便说一下,一般写程序推荐面向接口编程。

转载请注明出处:http://blog.csdn.net/acmman/article/details/44276427

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
10月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
712 2
|
10月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
866 0
|
9月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
9月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
9月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
793 8
|
10月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
896 1
|
11月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
11月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1439 0
|
9月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
2208 6
AOP 切面编程