【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

时间: 2024-10-26 19:42:28

【spring框架】利用动态代理实现AOP的相关文章

【spring框架】动态代理的学习(转)

      以下的内容部分参考了网络上的内容,在此对原作者表示感谢!          Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的.          首先,invoke方法的完整形式如下:  public Object invoke(Object proxy, Method method, Object[] args) throws T

Android动态代理以及利用动态代理实现ServiceHook

Java 的动态代理 首先我们要介绍的就是 Java 动态代理,Java 的动态代理涉及到两个类:InvocationHandler 接口和 Proxy 类,下面我们会着重介绍一下这两个类,并且结合实例来着重分析一下使用的正确姿势等.在这之前简单介绍一下 Java 中 class 文件的生成和加载过程,Java 编译器编译好 Java 文件之后会在磁盘中产生 .class 文件.这种 .class 文件是二进制文件,内容是只有 JVM 虚拟机才能识别的机器码,JVM 虚拟机读取字节码文件,取出二

用Java动态代理实现AOP

动态 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等.AOP似乎一时之间成了潮流.Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP.本文不是要在理论上具体阐述何为AOP, 为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net去瞧瞧.这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP. 为了简单起见

Java动态代理实现AOP

AOP 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等.AOP似乎一时之间成了潮流.Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP.本文不是要在理论上具体阐述何为AOP, 为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net去瞧瞧.这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP. 为了简单起

Spring的无接口代理实现AOP

package com.rx.spring.cglib; public class UserManagerImpl { // implements UserManager { public void addUser(String username, String password) { System.out.println("-------UserManagerImpl.addUser()----------"); } public void deleteUser(int id) {

动态代理方式实现AOP

摘要:面向对象的思想强调"一切皆是对象",在面向对象的程序中我们使用真实概念的模型思考问题,使得整个软件系统开发可以像搭建房屋一样有条不紊.然而面向对象也并非完美无缺的,它更注重于对象层次结构方面的东西,对于如何更好的管理对象行为内部结构,还存在着些许不足.那么我们如何使这个问题的得到更完美的解决呢?答案就是AOP. 主要内容: AOP简述 利用动态代理实现AOP 总结 一.AOP简述 AOP的概念早在上个世纪九十年代初就已经出现了,当时的研究人员通过对面向对象思想局限性的分析研究出了

【spring框架】AOP介绍

什么是AOP 1.面向切面编程(Aspect-Oriented-Programming) a)是面向对象的思维方式的有力补充. 下面利用之前写过的模拟Spring的工程给大家演示什么是AOP. 假设我们现在需要在UserDaoImpl类的save方法中add数据代码前后加日志信息: 即是加业务逻辑. 方法1:直接加代码: package cn.edu.hpu.dao.Impl; import cn.edu.hpu.dao.UserDao; import cn.edu.hpu.model.User

Spring框架与AOP思想的研究与应用

摘要 本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明了动态代理模式的可行性与有效性. 关键词 AOP:横切关注点:控制反转:动态代理 引言 Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一.其发展历史从学术领域和研发机构的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中.使用Spring框架固然给我们的编程带来了好处与便利,但是同时存在

Apache Geronimo和Spring 框架,第4部分

混合使用Spring AOP和Spring Web Flow 简介:本系列教程共分为 6 个部分,这是其中的第 4 部分,介绍了 Spring AOP 模块提供的面向方 面编程(Aspect-Oriented Programming,AOP)支持.通过本教程,您将会了解 Spring 框架如何简化使 用 AOP 的过程,会看到 Spring Web Flow (SWF) 模块,并了解如何以 XML 配置文件格式声明性地定义 应用程序的 Web 流程.您还将看到 Apache Geronimo W