`
xuxiaolei
  • 浏览: 150199 次
  • 性别: Icon_minigender_1
  • 来自: 彩虹之巅
社区版块
存档分类

spring中AOP代理的几种方式

阅读更多

部分例子摘自 spring in action

(1)使用ProxyFactoryBean的代理

package chapter4;

public interface Performable {
	public void perform() throws Exception;
}

package chapter4;

import java.util.Random;

public class Artist implements Performable {

	public void perform() throws Exception {
		int num = new Random().nextInt(100);
		
		if(num >= 50) {
			throw new Exception(String.valueOf(num));
		} else {
			System.out.println(num);
		}
	}
}

package chapter4;

public class Audience {
	public Audience() {
	}

	public void takeSeats() {
		System.out.println("The audience is taking their seats.");
	}

	public void turnOffCellPhones() {
		System.out.println("The audience is turning off " + "their cellphones");
	}

	public void applaud() {
		System.out.println("CLAP CLAP CLAP CLAP CLAP");
	}

	public void demandRefund() {
		System.out.println("Boo! We want our money back!");
	}
}

package chapter4;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

public class AudienceAdvice 
	implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice {
	
	private Audience audience;
	
	public void setAudience(Audience audience) {
		this.audience = audience;
	}

	public void before(Method method, Object[] args, Object target)
		throws Throwable {
		audience.takeSeats();
		audience.turnOffCellPhones();
	}

	public void afterReturning(Object returnValue, Method method, Object[] args,
			Object target) throws Throwable {
		audience.applaud();
	}
	
	public void afterThrowing(Exception ex) {
		audience.demandRefund();
	}
}
 
<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	<bean id="audience" class="chapter4.Audience" />
	
	<bean id="audienceAdvice" class="chapter4.AudienceAdvice" >
		<property name="audience" ref="audience" />
	</bean>
	
	<bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
		<property name="advice" ref="audienceAdvice" />
		<property name="expression" value="execution(* *.perform(..))" /> 
	</bean>
	
	<bean id="artistTarget" class="chapter4.Artist" />
	
	<bean id="artist" class="org.springframework.aop.framework.ProxyFactoryBean" >
		<property name="target" ref="artistTarget" />
		<property name="interceptorNames" value="audienceAdvisor" />
		<property name="proxyInterfaces" value="chapter4.Performable" />
	</bean>
</beans>

 (2)隐式使用ProxyFactoryBean的aop代理

DefaultAdvisorAutoProxyCreator实现了BeanPostProcessor,它将自动检查advisor的pointcut是否匹配bean的方法,如果匹配会替换bean为一个proxy,并且应用其advice。

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
	
	<bean id="audience" class="chapter4.Audience" />
	
	<bean id="audienceAdvice" class="chapter4.AudienceAdvice" >
		<property name="audience" ref="audience" />
	</bean>
	
	<bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
		<property name="advice" ref="audienceAdvice" />
		<property name="expression" value="execution(* *.perform(..))" /> 
	</bean>
	
	<bean id="artist" class="chapter4.Artist" />
</beans>

 (3)使用注解的aop代理

xml中增加了一个<aop:aspectj-autoproxy />,它创建了AnnotationAwareAspectJAutoProxyCreator在spring中,这个类将自动代理匹配的类的放方法。和上个例子中DefaultAdvisorAutoProxyCreator做同样的工作。

package chapter4;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class Audience {
	public Audience() {
	}
	
	@Pointcut("execution(* *.perform(..))")
	public void pointcut(){}

	@Before("pointcut()")
	public void takeSeats() {
		System.out.println("The audience is taking their seats.");
	}

	@Before("pointcut()")
	public void turnOffCellPhones() {
		System.out.println("The audience is turning off " + "their cellphones");
	}
	@AfterReturning("pointcut()")
	public void applaud() {
		System.out.println("CLAP CLAP CLAP CLAP CLAP");
	}
	@AfterThrowing("pointcut()")
	public void demandRefund() {
		System.out.println("Boo! We want our money back!");
	}
}
 
<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	<aop:aspectj-autoproxy />
	
	<bean id="audience" class="chapter4.Audience" />

	<bean id="artist" class="chapter4.Artist" />
</beans>

 (4)使用aop配置文件的自动代理

采用这种方法,不用加<aop:aspectj-autoproxy />

package chapter4;

import org.aspectj.lang.annotation.Aspect;

@Aspect
public class Audience {
	public Audience() {
	}

	public void pointcut() {
	}

	public void takeSeats() {
		System.out.println("The audience is taking their seats.");
	}

	public void turnOffCellPhones() {
		System.out.println("The audience is turning off " + "their cellphones");
	}

	public void applaud() {
		System.out.println("CLAP CLAP CLAP CLAP CLAP");
	}

	public void demandRefund() {
		System.out.println("Boo! We want our money back!");
	}
}
 
<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	<bean id="audience" class="chapter4.Audience" />
	
	<aop:config>
		<aop:aspect ref="audience">
			<aop:before method="takeSeats" pointcut="execution(* *.perform(..))" />
			<aop:before method="turnOffCellPhones" pointcut="execution(* *.perform(..))" />
			<aop:after-returning method="applaud" pointcut="execution(* *.perform(..))" />
			<aop:after-throwing method="demandRefund" pointcut="execution(* *.perform(..))" />
		</aop:aspect>
	</aop:config>

	<bean id="artist" class="chapter4.Artist" />
	
</beans>
分享到:
评论

相关推荐

    spring AOP配置的几种方式

    本文主要介绍几种常见的Spring AOP配置方式,并通过具体的示例来说明每种配置的特点。 #### 二、AOP配置所需基本元素 配置AOP时需要以下三个基本元素: 1. **Advice**:这是实际执行的代码,即我们所说的“切面”...

    Spring AOP 常用的四种实现方式

    本篇文章将深入探讨Spring AOP的四种常见实现方式。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP最基础的实现方式,适用于目标对象实现了特定接口的情况。Spring会创建一个代理对象,该对象实现...

    spring aop jar 包

    在Spring AOP中,主要涉及以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,比如日志记录、事务管理、性能监控等。在Spring AOP中,切面由通知(Advice)和切点(Pointcut)定义。 2. **通知...

    spring-aop.xsd

    6. 目标对象(Target Object):被AOP代理的对象。 7. 代理(Proxy):AOP框架创建的对象,它实现了目标对象的所有接口并拦截方法调用以执行通知。 在Spring配置文件中,我们可以通过以下方式引用`spring-aop.xsd`...

    研究下Spring中AOP的实现?

    Spring AOP有两种实现方式:代理模式和注解驱动。代理模式分为JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的目标对象,它通过实现InvocationHandler接口创建代理对象。而CGLIB代理则是在运行时为类生成...

    spring入门学习-6、AOP几种配置方式详解.pdf

    ### Spring AOP 几种配置方式详解 #### 一、Spring AOP 概述 Spring AOP(面向切面编程)是一种强大的编程模式,用于在应用程序中管理横切关注点,如日志记录、安全控制等。Spring 提供了多种方式来支持 AOP 的...

    spring aop spring aop

    在Spring AOP中,主要有以下几个核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,包含pointcut(切点)和advice(通知)两部分。例如,在上述代码中的`PersonProxy`类就是一个切面,它定义了`before()`和...

    Spring框架+SpringAOP动态代理

    ### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...

    spring编程AOP开发包

    面向切面编程(AOP,Aspect Oriented Programming)是Spring框架的一个核心特性,它提供了一种模块化和声明式的方式来处理程序中的交叉关注点,如日志、事务管理、性能监控等。AOP的主要思想是将这些横切关注点与...

    spring 应用aop 实例

    1. **配置AOP支持**:在Spring的配置文件(如`applicationContext.xml`)中,开启AOP代理。可以使用`&lt;aop:aspectj-autoproxy/&gt;`标签来启用基于注解的AOP支持。 2. **定义切面**:创建一个Java类,该类代表切面,...

    Spring中的AOP不生效

    在Spring框架中,AOP可以通过基于XML的配置或者基于注解的方式实现。但在实际开发过程中,可能会遇到配置好的AOP切面不生效的问题,本文将针对这一现象进行深入分析,并提供相应的解决方案。 #### 一、问题定位 当...

    springAOP中文文档

    除了使用 AspectJ 进行 AOP 开发之外,Spring 还提供了另外两种方式来实现 AOP: 1. **基于注解的配置**:通过在切面类和方法上使用特定的注解来定义切面和通知。 2. **基于 XML 的配置**:通过 XML 文件来配置切面...

    spring-aop

    描述提到“spring里的3个包”,这可能是指Spring AOP模块中涉及的几个核心包或组件: 1. **org.springframework.aop**:这是Spring AOP的基础包,包含了AOP的核心接口和类,如`Aspect`、`Advice`、`Pointcut`和`...

    spring_AOP.rar_876.aop_java aop_spring_aop

    Spring AOP(面向切面编程)是Java开发中Spring框架的核心特性之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。在SSH(Struts、Spring、Hibernate)经典企业级开发框架中,Spring AOP扮演着至...

    spring aop4.3.10

    在Spring AOP 4.3.10中,我们主要关注以下几个关键知识点: 1. **切面(Aspect)**:切面是AOP的核心概念,它封装了多个相关操作,包括通知(Advice)、引入(Introduction)、目标对象(Target Object)、织入...

    spring-aop和注解的实例

    Spring AOP通过以下几种方式实现切片: 1. **定义切面(Aspect)**:在Spring中,切面通常由一个带有`@Aspect`注解的类表示。这个类可以包含通知方法,这些方法会在指定的连接点执行。 2. **定义通知(Advice)**...

    SpringAOP.zip

    Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。

    spring AOP myeclipse 完整代码

    5. **运行与测试**:在MyEclipse中,你可以创建一个测试类来调用被AOP代理的`UserService`方法,观察日志记录是否按预期工作。 在压缩包`SpringAOPDemo1`中,很可能包含了整个Spring AOP的示例代码,包括`...

    spring - aop.zip

    在Spring AOP中,有以下几个核心概念: 1. 切面(Aspect):切面是关注点的模块化,它将相关的通知(Advice)和切入点(Join Point)组合在一起。在Spring AOP中,切面通常由一个或多个注解的类定义。 2. 通知...

Global site tag (gtag.js) - Google Analytics