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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
目标:生成一个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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
13天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
26天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
38 4
|
28天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
132 1
|
23天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
32 0
|
2天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
17天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
39 1
Spring 框架:Java 开发者的春天
|
23天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
29 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
8天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
20 1
|
10天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
25 2
|
9天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
53 1
下一篇
无影云桌面