Spring aop--几种不同的使用方式

最近听老师讲关于AOP关于容器的课,突然觉得之前对aop的理解都不是很到位,先不说理解就是应用都很少,最近也写了几篇关于AOP的博客,都是一些简单的demo,今天在这里再说一下关于Spring
AOP的几种实现方式。

我们经常会用到的有如下几种

1、基于代理的AOP

2、纯简单java对象切面

3、@Aspect注解形式的

4、注入形式的Aspcet切面

下面我们就一个一个来应用吧.

下面先写一下几个基本的类。

接口类:

/**
 * 定义一个接口
 * @author 陈丽娜
 * @version 2015年5月31日上午9:16:50
 */
public interface Sleepable {

	/**
	 * 睡觉方法
	 * @author 陈丽娜
	 * @version 2015年5月31日上午9:17:14
	 */
	void sleep();
}

实现类:

/**
 * 陈丽娜 本人实现睡觉接口
 * @author 陈丽娜
 * @version 2015年5月31日下午4:51:43
 */
public class ChenLliNa implements Sleepable {

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
        System.out.println("乖,该睡觉了!");
	}
}

增强类:

/**
 * 定义一个睡眠的增强 同时实现前置 和后置
 * @author 陈丽娜
 * @version 2015年5月31日上午9:24:43
 */
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {

	@Override
	public void afterReturning(Object returnValue, Method method,
			Object[] args, Object target) throws Throwable {
		 System.out.println("睡觉前要敷面膜");
	}

	@Override
	public void before(Method method, Object[] args, Object target)
			throws Throwable {
		System.out.println("睡觉后要做美梦");
	}

}

一、基于代理的AOP

   <!-- 创建一个增强 advice -->
       <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>

       <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
       <!-- 定义切点   匹配所有的sleep方法-->
       <bean id ="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
              <property name="pattern" value=".*sleep"></property>
       </bean>

       <!-- 切面    增强+切点结合 -->
       <bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
            <property name="advice" ref="sleepHelper"/>
            <property name="pointcut" ref="sleepPointcut"/>
       </bean>

       <!-- 定义代理对象 -->
       <bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
               <property name="target" ref="lina"/>
               <property name="interceptorNames" value="sleepHelperAdvisor"/>
               <!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->
       </bean>

如配置文件中:

pattern属性指定了正则表达式,他匹配所有的sleep方法

使用org.springframework.aop.support.DefaultPointcutAdvisor的目的是为了使切点和增强结合起来形成一个完整的切面

最后配置完后通过org.springframework.aop.framework.ProxyFactoryBean产生一个最终的代理对象。

二、纯简单java对象切面

纯简单java对象切面这话怎么说呢,在我看来就是相对于第一种配置,不需要使用代理,,而是通过spring的内部机制去自动扫描,这时候我们的配置文件就该如下修改:

       <!-- 创建一个增强 advice -->
       <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
       <!-- 目标类 -->
       <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>

       <!--  配置切点和通知-->
       <bean id ="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice" ref="sleepHelper"></property>
            <property name="pattern" value=".*sleep"/>
       </bean>

       <!-- 自动代理配置 -->
       <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

是不是相对于第一种简单了许多,不用再去配置代理了。

三、@Aspect注解形式

根据我们的经验也知道,注解的形式相对于配置文件是简单一些的,这时候需要在已有的方法或类上家注解:

/**
 * 通过注解的方式 添加增强
 * @author 陈丽娜
 * @version 2015年5月31日上午10:26:13
 */
@Aspect
@Component
public class SleepHelper03 {	

	/*@Pointcut("execution(* com.tgb.springaop.service.impl..*(..))")*/
	@Pointcut("execution(* *.sleep(..))")
	public void sleeppoint(){}

	@Before("sleeppoint()")
	public void beforeSleep(){
		System.out.println("睡觉前要敷面膜");
	}

	@AfterReturning("sleeppoint()")
	public void afterSleep(){
		System.out.println("睡觉后要做美梦");
	}

配置文件中只需写:

  <!--扫描包 -->
       <context:component-scan base-package="com.tgb" annotation-config="true"/>
       <!-- ASPECTJ注解 -->
       <aop:aspectj-autoproxy  proxy-target-class="true" />  

       <!-- 目标类 -->
        <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>

四、注入形式的Aspcet切面

个人感觉这个是最简单的也是最常用的,也是最灵活的。配置文件如下:

   <!-- 目标类 -->
       <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
       <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper02"/>

       <aop:config>
           <aop:aspect ref="sleepHelper">
                <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
                <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
           </aop:aspect>
       </aop:config>

配置文件中提到的SleepHelper02类如下:

/**
 * 通过注解的方式 添加增强
 * @author 陈丽娜
 * @version 2015年5月31日上午10:26:13
 */

public class SleepHelper02 {
	public void beforeSleep(){
		System.out.println("睡觉前要敷面膜");
	}
	public void afterSleep(){
		System.out.println("睡觉后要做美梦");
	}
}

是不是看上去都很简单呀,这样是不是大家都会使用spring aop了?!

关于如何调用,这里写了几个测试类,可以看一下,基本都一样:

	/**
	 * 配置文件 spring_aop.xml  通过代理
	 * @author 陈丽娜
	 * @version 2015年5月31日上午10:09:10
	 */
	@Test
	public void test(){
		ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop.xml");

		Sleepable sleeper =(Sleepable) ct.getBean("linaProxy");

		sleeper.sleep();
	}

	/**
	 * 配置文件 spring_aop_01.xml   简答的java对象
	 * @author 陈丽娜
	 * @version 2015年5月31日上午10:09:37
	 */
	@Test
	public void test01(){
		ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_01.xml");

		Sleepable sleeper = (Sleepable)ct.getBean("lina");

		sleeper.sleep();
	}

	/**
	 * 配置文件 spring_aop_03.xml  通过aspect注解
	 * @author 陈丽娜
	 * @version 2015年5月31日上午10:09:37
	 */
	@Test
	public void test03(){
		ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_03.xml");

        Sleepable sleeper = (Sleepable)ct.getBean("lina");

		sleeper.sleep();
	}
	/**
	 * 配置文件 spring_aop_02.xml  通过apsect配置文件
	 * @author 陈丽娜
	 * @version 2015年5月31日上午10:09:37
	 */
	@Test
	public void test02(){
		ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_02.xml");

		Sleepable sleeper = (Sleepable)ct.getBean("lina");

		sleeper.sleep();
	}

通过测试类可以看出,不管以什么样的方式来实现aop他们的使用都是没有差别的,这几个测试类的结果都是一样的:

时间: 2024-10-06 14:53:05

Spring aop--几种不同的使用方式的相关文章

Spring AOP基于注解的“零配置”方式

Spring AOP基于注解的“零配置”方式: Spring的beans.xml中 <!-- 指定自动搜索Bean组件.自动搜索切面类 --> <context:component-scan base-package="org.crazyit.app.service,org.crazyit.app.aspect"> <context:include-filter type="annotation" expression="or

spring aop两种配置方式(1)

第一种:注解配置AOP注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 2. 开发需要被拦截的类. 3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式.这样的话,那就交由Spring AoP容器管理. 另外需要引用 aspectJ 的 jar 包: a

Spring AOP四种实现方式Demo详解与相关知识探究

一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~. 我亲手实现了一遍,重新整理,加上了一些不易关注到的细节.漏掉的知识,以及自己对AOP的一些理解,写成这篇博客. 二.AOP相关概念 (1)AOP是什么?AOP与拦截器的区别? 太抽象的不说,如果你知道Struts2的拦截器,拦截器就是应用的AOP的思想,它用于拦截Action以进行一些预处理或结果处理.而

java框架篇---spring aop两种配置方式

第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 2. 开发需要被拦截的类. 3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式.这样的话,那就交由Spring AoP容器管理. 另外需要引用 aspectJ 的 jar 包:

Spring AOP两种实现方式

一. AOP 概念: Spring AOP 即Aspect Oriented Programming(面向切面编程), 实现方式分为两种: 1. 注解(Annotation) 2. 配置(Configure) 二. 应用场景: 1. 权限管理: 2. 表单验证: 3. 事务管理: 4. 信息过滤: 5. 拦截器: 6. 过滤器: 7. 日志等等: 三. AOP实现: 1. 基于Annotation的实现 package com.myframework.xj.security.service; i

Spring AOP 5种通知与java动态代理

1 public interface ArithmeticCalculator { 2 3 int add(int i, int j); 4 int sub(int i, int j); 5 6 int mul(int i, int j); 7 int div(int i, int j); 8 9 } 接口,要求为每个方法前后添加日志 1 @Component("arithmeticCalculator") 2 public class ArithmeticCalculatorImpl

Spring AOP基于注解的“零配置”方式实现

为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar.除此之外,Spring AOP还需要依赖一个aopalliance.jar包 定义一个类似ServiceAspect.java这样的切面bean: 1 package com.hyq.aop; 2 3 import org.apache.commons.logging.Log; 4 import org.apache.commons.loggi

Spring的几种注入bean的方式

在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的setter方法注入 首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性.例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置setter方法.,用于进行依赖注

Spring框架几种创建bean的方式

Spring框架下,Bean的创建和装配非常的灵活,提供了三种主要的方式,并且相互见可以互相看见,也就是你可以随意地采用你喜欢且合适的方式创建Bean,而不用担心他们之间的兼容问题. 一.使用XML显示配置Bean 在Spring框架最初的是,XML是最主要的配置方式.在XML中创建Bean需要使用<bean>元素,例如 <bean class= "man.BigMan" /> 这是一个最简单的XML方式的Bean声明,仅指定了该Bean属于的类,那么它的名称是

Spring AOP基于注解的“零配置”方式---org.springframework.beans.factory.BeanNotOfRequiredTypeException

具体异常信息如下: 1 Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'hello' must be of type [com.hyq.chapter08_04_3.HelloImpl], but was actually of type [com.sun.proxy.$Proxy13] 2 at org.springfram