Spring_AOP_Annotation使用Aspect实现动态代理

spring_aop_annotation 的实现:

1.1在beans.xml中加入aop的schema

1.2在xml中打开aop的自动检索

<aop:aspectj-autoproxy/>

1.3创建一个需要实现动态代理的类

1.4导入aspectj包,Spring使用的是aspect这个包来实现AOP,所以需要导入这个包。

Maven之pom.xml :

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.6.8</version>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
	<version>1.6.8</version>
	</dependency>
<dependency>
	<groupId>aopalliance</groupId>
	<artifactId>aopalliance</artifactId>
	<version>1.0</version>
</dependency>

1.5在这类上面使用@Aspect来声明这个类是一个切面类

//让这个切面类被Spring所管理
@Component("logAspect")
// 声明这是一个切面类
@Aspect
public class LogAspect {
    //......
<span style="font-family:FangSong_GB2312;">}</span>

1.6在相应的要进行横切点上面加入PointCut的说明

 execution(* com.spring.dao.*.add*(..))
 * 第一个*表示任意返回值
 * 第二个*表示com.spring.dao包中所有类
 * 第三个*表示以add开头的所有方法
 * (..)表示任意参数

1.7如果希望获取相应的调用信息,可以通过joinPoint 传递

/**
 * 程序开始之前执行
 * execution(* com.spring.dao.*.add*(..)) 第一个*表示任意返回值
 * 第二个*表示com.spring.dao包中所有类 第三个*表示以add开头的所有方法 (..)表示任意参数
 */
@Before("execution(* com.spring.dao.*.add*(..)) || "
		+ "execution(* com.spring.dao.*.update*(..)) || "
		+ "execution(* com.spring.dao.*.delete*(..))")
public void logStart(JoinPoint jp) {
	// 得到执行的对象
	System.out.println(jp.getTarget());
	// 得到执行的方法
	System.out.println(jp.getSignature().getName());
	Logger.info("方法执行前加入日志,来自LogAspect");
}

具体实现代码:

XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">

	<!-- 打开Spring的Annotation的支持 -->
	<context:annotation-config />
	<!-- 设定Spring去哪些包中找Annotation -->
	<context:component-scan base-package="com.spring" />
	<!-- 打开基于Annotation的aop自动代理 -->
	<aop:aspectj-autoproxy/>
</beans>

LogAspect类

package com.spring.proxy;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//让这个切面类被Spring所管理
@Component("logAspect")
// 声明这是一个切面类
@Aspect
public class LogAspect {
	/**
	 * 程序开始之前执行
	 * execution(* com.spring.dao.*.add*(..)) 第一个*表示任意返回值
	 * 第二个*表示com.spring.dao包中所有类 第三个*表示以add开头的所有方法 (..)表示任意参数
	 */
	@Before("execution(* com.spring.dao.*.add*(..)) || "
			+ "execution(* com.spring.dao.*.update*(..)) || "
			+ "execution(* com.spring.dao.*.delete*(..))")
	public void logStart(JoinPoint jp) {
		// 得到执行的对象
		System.out.println(jp.getTarget());
		// 得到执行的方法
		System.out.println(jp.getSignature().getName());
		Logger.info("方法执行前加入日志,来自LogAspect");
	}

	/**
	 * 程序结束之后执行
	 * @param jp
	 */
	@After("execution(* com.spring.dao.*.add*(..)) || "
			+ "execution(* com.spring.dao.*.update*(..)) || "
			+ "execution(* com.spring.dao.*.delete*(..))")
	public void logEnd(JoinPoint jp) {
		// 得到执行的对象
		System.out.println(jp.getTarget());
		// 得到执行的方法
		System.out.println(jp.getSignature().getName());
		Logger.info("方法执行后加入日志,来自LogAspect");
	}

	/**
	 * 函数调用过程中执行
	 * @param pjp
	 * @throws Throwable
	 */
	@Around("execution(* com.spring.dao.*.add*(..)) || "
			+ "execution(* com.spring.dao.*.update*(..)) || "
			+ "execution(* com.spring.dao.*.delete*(..))")
	public void logAround(ProceedingJoinPoint pjp) throws Throwable {
		Logger.info("开始在Around中加入日志,来自LogAspect");
		//执行程序
		pjp.proceed();
		Logger.info("结束Around");
	}
}

UserService类

package com.spring.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.spring.dao.IUserDao;
import com.spring.model.User;

//@Component(value="userService")
@Service("userService")		//业务层一般用@Service注入
public class UserService implements IUserService {
	private IUserDao userDao;

	public IUserDao getUserDao() {
		return userDao;
	}

	//默认通过名称注入,在JSR330中提供了@Inject来注入
	//@Resource(name="userProxyDao")	//此处用代理类注入
	//@Resource(name="userDynamicDao")
	@Resource(name="userDao") //aspect
	public void setUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public void add(User user) {
		userDao.add(user);
	}

	@Override
	public void delete(int id) {
		userDao.delete(id);
	}

	@Override
	public User load(int id) {
		return userDao.load(id);
	}

}

测试类及测试结果:

时间: 2025-01-31 00:43:14

Spring_AOP_Annotation使用Aspect实现动态代理的相关文章

Spring_AOP_XML使用Aspect实现动态代理(常用)

Spring_AOP_XML使用Aspect实现动态代理(常用) XML使用Aspect实现动态代理此方式比较常用,和使用注解最大的好处是我们不用每个方法前面定义横切点上面加入PointCut的说明,在XML中只需要定义一次就可以多出使用. 在上面Spring_AOP_Annotation使用Aspect实现动态代理的基础上修改,去除LogAspect中方法上的注解. XML文件配置: <?xml version="1.0" encoding="UTF-8"?

java动态代理

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式 代理模

【转载】Java JDK 动态代理(AOP)使用及实现原理分析

转自:http://blog.csdn.net/jiankunking/article/details/52143504 版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图: 简单结构示意图: 为了保持

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

Atitit 代理CGLIB&#160;动态代理&#160;AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

Java——动态代理技术

1.程序中的代理 为具有相同接口的目标类的各个方法,添加一些系统功能,如日志,异常处理,计算方法运行的 时间,事务管理等等,都可以交给另一个类去实现这些功能,该类称为代理类. 注意:为了让代理类共享目标类中的各个方法,可以让代理类实现和目标类相同的接口. public class AProxy { //AProxy类为A的代理类,可以计算sayHi方法的运行时间 public void getTime() { //方法开始前时间 new A().sayHi(); //方法结束后时间 } } cl

Spring AOP基础之JDK动态代理

JDK动态代理 Jdk动态代理是装饰模式的一个典型用例,关于装饰模式这里不多解释,直接说重点吧.jdk动态代理实际上就是代替继承方案,在不破坏原始类的原则下,在运行期间为某个类动态注入一些新的方法.java.lang.reflect.Proxy提供了生成代理类的接口.进入源代码,我们可以看见关于Proxy的详细说明这里截取一些关键的部分: /** * {@code Proxy} provides static methods for creating dynamic proxy * classe

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye