`
阿尔萨斯
  • 浏览: 4333151 次
社区版块
存档分类
最新评论

浅谈spring——增强接口(六)

 
阅读更多

AOP支持5种类型的增强。


增强接口关系图:


1)前置增强:BeforeAdvice,表示在目标方法执行前实施增强。

2)后置增强:AfterReturningAdvice,表示在目标方法执行后实施增强。

3)环绕增强:MethodInterceptor,表示在目标方法执行前后实施增强

4)异常增强:ThrowsAdvice,表示在目标方法抛出异常后实施增强

5)引介增强:IntroductionInterceptor,表示在目标类中添加一些新的属性和方法


xml配置:

	<bean id="greetingBefore" class="com.baobaotao.advice.GreetingBeforeAdvice" />
	<bean id="target" class="com.baobaotao.advice.NaiveWaiter" />
	<bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
		p:proxyInterfaces="com.baobaotao.advice.Waiter"   ##代理接口
		p:target-ref="target"  ##指定对哪个bean增强
		p:interceptorNames="greetingBefore"/>    ##指定的增强

代码实例

1)前置增强:

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class GreetingBeforeAdvice implements MethodBeforeAdvice {
	public void before(Method method, Object[] args, Object obj) throws Throwable {
		String clientName = (String)args[0];
		System.out.println("How are you!Mr."+clientName+".");
	}
}

method:目标类的方法

args:目标类方法的入参

obj:目标类实例


2)后置增强:

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;

public class GreetingAfterAdvice implements AfterReturningAdvice {

	public void afterReturning(Object returnObj, Method method, Object[] args,
			Object obj) throws Throwable {
		System.out.println("Please enjoy yourself!");
	}
}
returnObj:目标实例方法返回的结果

method:目标类方法

args:目标实例方法的入参

obj:目标类实例


3)环绕增强

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class GreetingInterceptor implements MethodInterceptor {

	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object[] args = invocation.getArguments();//获取入参
		String clientName = (String)args[0];
		System.out.println("How are you!Mr."+clientName+".");
		
		Object obj = invocation.proceed();//反射机制调用目标方法
		
		System.out.println("Please enjoy yourself!");
		
		return obj;
	}
}
MethodInvocation不但封装了目标方法及其入参数组,还封装了目标方法所在的实例对象


4)抛出异常的增强

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class TransactionManager implements ThrowsAdvice {
	public void afterThrowing(Method method, Object[] args, Object target,
			Exception ex) throws Throwable {
		System.out.println("-----------");
		System.out.println("method:" + method.getName());
		System.out.println("抛出异常:" + ex.getMessage());
		System.out.println("成功回滚事务。");
	}
}
ThrowAdvice异常抛出增强接口没有定义任何方法,它是一个标识接口,在运行时由spring使用反射机制自行判断。

method:目标类方法

args:目标实例方法的入参

target:目标类实例

ex:要捕获的异常

其中前三个参数可以缺省。afterThrowing方法,可以定义多个,当目标方法抛出异常时,spring会自动找出最匹配的增强方法。


5)引介增强:比较特殊,不是在目标方法周围织入增强,而是为目标类增加新的方法和属性,属于类级别而非方法级别。

接口

public interface Monitorable {
   void setMonitorActive(boolean active);
}


增强代码

import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
public class ControllablePerformaceMonitor extends
			DelegatingIntroductionInterceptor implements Monitorable{
			
	private ThreadLocal<Boolean> MonitorStatusMap = new ThreadLocal<Boolean>();
	public void setMonitorActive(boolean active) {
		MonitorStatusMap.set(active);
	}
	public Object invoke(MethodInvocation mi) throws Throwable {
		Object obj = null;
		if (MonitorStatusMap.get() != null && MonitorStatusMap.get()) {
			PerformanceMonitor.begin(mi.getClass().getName() + "."
					+ mi.getMethod().getName());
			obj = super.invoke(mi);
			PerformanceMonitor.end();
		} else {
			obj = super.invoke(mi);
		}
		return obj;
	}

}

xml配置

	<bean id="pmonitor" class="com.baobaotao.introduce.ControllablePerformaceMonitor" />
	<bean id="forumServiceTarget" class="com.baobaotao.introduce.ForumService" />
	<bean id="forumService" class="org.springframework.aop.framework.ProxyFactoryBean"
		p:interfaces="com.baobaotao.introduce.Monitorable" 
		p:target-ref="forumServiceTarget"
		p:interceptorNames="pmonitor" 
		p:proxyTargetClass="true" />
</beans>

调用代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestIntroduce {
	public static void main(String[] args) {
		String configPath = "com/baobaotao/introduce/beans.xml";
		ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
        ForumService forumService = (ForumService)ctx.getBean("forumService");
        forumService.removeForum(10);
        forumService.removeTopic(1022);
		
        Monitorable moniterable = (Monitorable)forumService;   //监控开启
        moniterable.setMonitorActive(true);
        forumService.removeForum(10);
        forumService.removeTopic(1022); 
	}
}

引介增强与之前的四类增强有较大区别,首先需要指定引介增强所实现的接口Monitorable;其次只能通过为目标类创建子类的方式生成代理,必须将p:proxyTargetClass设置成"true"

可以直观理解为下图:





分享到:
评论

相关推荐

    Spring————面试题库

    Spring是一个开源的Java平台,它是Java应用程序开发的一个综合和广泛的基础支持平台。Spring框架的目的是帮助Java开发者解决在开发应用程序时遇到的基础性问题,让开发者能够专注于业务逻辑的开发,而不必担心底层...

    ProSpring——Spring专业开发指南

    《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...

    spring——第十四节素材.rar

    标题中的“spring——第十四节素材.rar”表明这是一个关于Spring框架的教程材料,可能是课程的第14节内容。Spring是Java开发中最广泛使用的轻量级框架,它提供了丰富的功能来简化企业级应用的开发,包括依赖注入、...

    Spring——jar详解

    4. **spring-context.jar**:此jar扩展了Spring核心功能,提供ApplicationContext接口,用于加载和管理bean。它还支持JNDI、模板引擎集成(如Velocity、FreeMarker)、验证等。 5. **spring-dao.jar**:包含用于...

    Spring——jar包详解

    例如,`org.springframework.context.ApplicationContext`接口定义了获取bean和发布事件的方法,而`org.springframework.web.servlet.DispatcherServlet`则是Spring MVC的核心组件,负责处理HTTP请求。 总的来说,...

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

    Demo——使用Spring的Validator接口进行数据验证

    这个Demo示范了怎么通过Spring的Validator接口来进行数据验证,包括Validator的复用、jsp错误信息的展示等。可参考本人博客: http://blog.csdn.net/oLanMoMo/article/details/50530352

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    浅谈Spring Data如何简化数据操作的方法

    这样,Spring会在指定的基包路径下寻找并创建所有继承自Repository或其子接口的接口的代理对象,这些代理对象作为Spring Beans被管理,可以直接在业务层使用。 Repository是一个空接口,但Spring Data提供了一系列...

    Spring特性——Aware感知特性

    在Spring框架中,Aware接口系列是其核心特性之一,它为Spring容器提供了向bean注入上下文信息的能力。这些接口让bean能够感知到Spring容器的存在,从而获取必要的服务或配置信息。下面我们将深入探讨Spring的Aware...

    Spring开发指南——中文版

    《Spring开发指南——中文版》是由夏昕编著的一本针对Spring框架的中文教程,旨在帮助开发者更好地理解和应用Spring框架。Spring是Java平台上的一个核心框架,广泛应用于企业级应用开发,提供了一种全面的编程和配置...

    五、Spring源码分析——Spring Aop

    JDK动态代理基于接口实现,如果目标类实现了接口,Spring会选择JDK动态代理;如果没有实现接口,Spring则会使用CGLIB代理,通过字节码技术创建一个目标类的子类来实现。 1. **通知(Advises)**: - 前置通知...

    Spring系列——MVC框架整合.md

    Spring系列——MVC框架整合.md

    浅谈Spring Boot 开发REST接口最佳实践

    浅谈Spring Boot 开发REST接口最佳实践 本文主要介绍了浅谈Spring Boot 开发REST接口最佳实践,涵盖了RESTful API的设计原则、HTTP动词与SQL命令对应、URL中的约定、版本控制、查询字符串、分页信息、响应结果、...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    Spring Mvc——第一个应用程序

    **Spring MVC —— 第一个应用程序** Spring MVC 是 Spring 框架的一个模块,主要用于构建 Web 应用程序。它提供了一种模型-视图-控制器(MVC)架构,简化了开发过程,使得开发者可以专注于业务逻辑而不必过于关心...

    SpringCloud——声明性REST客户端(Feign)

    【SpringCloud——声明性REST客户端(Feign)】 在分布式微服务架构中,服务之间的通信是至关重要的。Spring Cloud提供了一种优雅的方式,通过Feign客户端来实现这一目标。Feign是一个声明式的Web服务客户端,它...

    SpringCloud——服务注册(consul)

    Spring Cloud作为微服务解决方案的一部分,提供了多种服务发现工具,其中Consul是其中一个流行的选择。本文将深入探讨Spring Cloud如何整合Consul实现服务注册。 Consul是由HashiCorp公司开发的一款分布式系统服务...

    Spring特性——事件驱动模型

    本篇文章将深入探讨Spring框架的一个重要特性——事件驱动模型。通过理解这一特性,开发者可以更好地利用Spring来实现应用间的通信和协调,提高系统的灵活性和可扩展性。 事件驱动模型是一种设计模式,它基于发布/...

Global site tag (gtag.js) - Google Analytics