Spring AOP--引入增强

上篇博客写到了Spring AOP,不管是前置增强,后置增强,引入增强都是对方法的增强,但是是否考虑过对类进行增强呢?!伟大的spring做到了,只是换了一种说法:Introduction(引入)

首先我们来说一下引入增强的目的:动态的让被增强的类实现一个接口;下面就写一下代码吧:

定义了一个新接口 Apology:

/**
 * 道歉接口
 * @author 陈丽娜
 * @version 2015年5月27日下午8:15:47
 */
public interface Apoloy {

	/**
	 * say sorry
	 * @author 陈丽娜
	 * @version 2015年5月27日下午8:16:30
	 * @param name  名称
	 */
	public void saySorry(String name);
}

定义一个增强类,需要继承:org.springframework.aop.support.DelegatingIntroductionInterceptor类并同时实现Apoloygy接口,需要实现Apploy的方法。

/**
 * 引入增强
 * @author 陈丽娜
 * @version 2015年5月30日下午7:56:35
 */
@Component
public class GreetingIntroAdvice extends DelegatingIntroductionInterceptor
		implements Apoloy {

	/**
	 * 实现saySorry方法
	 */
	@Override
	public void saySorry(String name) {
		System.out.println(name + "I am sorry !");
	}

	@Override
	public Object invoke(MethodInvocation mi) throws Throwable {
		// TODO Auto-generated method stub
		return super.invoke(mi);
	}
}

我们需要拿以上的类去丰富GreetingImpl类,那我们需要做什么呢?看看配置文件吧:

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/beans/aop
       http://www.springframework.org/schema/spring-aop.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

     <!-- 在指定的包中(com.tgb.*)扫描@componet注解的类 -->
      <context:component-scan base-package="com.tgb"></context:component-scan> 

     <bean id = "greetingImpl" class = "com.tgb.aop.service.impl.GreetingImpl">
         <property name="test">
              <value>你好你好你好呀</value>
         </property>
     </bean>
     <!-- 定义一个代理类 -->
     <bean id = "springProxy" class ="org.springframework.aop.framework.ProxyFactoryBean">
          <property name="interfaces" value="com.tgb.aop.service.Apoloy"/>  <!-- 需要动态实现的接口 -->
          <property name="target" ref= "greetingImpl"/> <!-- 目标类,打招呼的实现类 -->
          <property name="interceptorNames" value="greetingIntroAdvice"></property>  <!-- 引入增强类 -->
          <property name="proxyTargetClass" value= "true"></property>
     </bean>
  </beans>

测试代码:

/**
	 * 引用增强测试
	 * @author 陈丽娜
	 * @version 2015年5月27日下午8:49:38
	 */
	@Test
	public void SpringIntroductionTest(){
		//读取xml文件  AOP\src\META-INF
		ApplicationContext context = new ClassPathXmlApplicationContext("spring-introduction.xml");

		GreetingImpl greeting = (GreetingImpl) context.getBean("springProxy");

		greeting.sayHello("greetingImpl单纯的sayhello");

		Apoloy apoloyProxy = (Apoloy)greeting; // 把打招呼类 强制向上强转

		apoloyProxy.saySorry("引入增强效果");		

	}

运行效果:

其实个人感觉引入增强还是很神奇的,测试中说到一句:向上强转,这里就说一下转型吧:

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

那么向上转型:子类引用的对象转换为父类型称为向上转型,也就是说将子类对象转为父类对象(父类对象可以是接口)

这里的引用增强就是把GreetingImpl向上转型成了Apoloy接口。是不是很神奇呀?!

时间: 2024-10-25 12:30:45

Spring AOP--引入增强的相关文章

spring AOP之增强类型

> spring使用增强类定义横切逻辑,同时由于spring只支持方法连接点,增强还包括了在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,还包含部分连接点的信息. spring目前支持5种类型增强: 前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为spring只支持方法级的增强,所以MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的. 后

Spring学习(二十五)Spring AOP之增强介绍

课程概要: Spring AOP的基本概念 Spring AOP的增强类型 Spring AOP的前置增强 Spring AOP的后置增强 Spring AOP的环绕增强 Spring AOP的异常抛出增强 Spring AOP的引介增强 一.Spring AOP增强的基本概念 Spring当中的专业术语-advice,翻译成中文就是增强的意思. 所谓增强,其实就是向各个程序内部注入一些逻辑代码从而增强原有程序的功能. 二.Spring AOP的增强类型 首先先了解一下增强接口的继承关系 如上图

spring AOP 前置增强,后置增强小Demo

服务员接口 Waiter.java package com.paic.zhangqi.spring.aop; public interface Waiter { void greetTo(String name); void serveTo(String name); } 服务员接口实现类 NaiveWaiter.java package com.paic.zhangqi.spring.aop; public class NaiveWaiter implements Waiter { @Over

spring AOP 环绕增强小Demo

前面写了一个前置增强,后置增强的小demo,前置增强即在方法调用前对方法增强:后置增强即在方法调用后对方法增强.环绕增强允许在目标类方法调用前后织入横切逻辑,它综合了前置.后置增强两者的功能. 还继续沿用之前的代码,这里介绍环绕增强的实现类和测试类. 环绕增强类 GreetingAroundAdvice.java package com.paic.zhangqi.spring.aop; import org.aopalliance.intercept.MethodInterceptor; imp

Spring AOP 创建增强类

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强:  1)前置增强:org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的:  2)后置增强:org.springframework.aop.AfterReturning

Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置

AspectJ是一个面向切面的框架,它扩展了java语言,定义了AOP语法,能够在编译期提供代码的织入,所以它有一个专门的编译器用来生成遵守字节码字节编码规范的Class文件 确保使用jdk为5.0以上版本. 01.使用注解标注增强(AspectJ)  :取代了配置文件中的aop:pointcut节点的配置 添加jar和log4j的配置文件 aspectj-1.8.7.jar aspectjweaver.jar 添加头文件: xmlns:aop="http://www.springframewo

spring AOP 前后增强 实现的接口

执行前增强:org.springframework.aop.MethodBeforeAdvice,重写方法:public void before(Method args0,Object[] args1,Object args2); 执行后增强:org.springframework.aop.AfterReturningAdvice,重写方法:public void afterReturning(Object args0,Method args1,Object[] args2); 方法任意增强.前

Java面试--Spring技术要点--Spring AOP(面向切面编程)

33  Spring AOP的概念 面向切面的编程,是一种编程技术,是OOP(面向对象编程)的补充和完善.OOP的执行是一种从上往下的流程,并没有从左到右的关系.因此在OOP编程中,会有大量的重复代码.而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中.常见的应用有:权限管理.日志.事务管理等. 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行:二是采用静态织入的方式,引入特定的语法创建"方面"

Spring AOP 切面编程的方法

spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring aop 2.基于配置文件实现spring aop 3.增强的分类 4.切点表达式的构成 1.基于注解来实现的方法 基于注解并不意味着不需要配置文件,只不过是在配置文件中所需要的配置很少.切面编程,显然我们需要一个增强类,一个被增强的普通类. 配置文件中需要添加以下的内容 xmlns:aop="ht

关于Spring AOP

一.AOP: 1.什么是AOP: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码.