Spring的AOP简单介绍和常用配置(2)

在1中我简单的介绍了基于AOP标签配置的一种形式,并没有将前,后Advice以及异常Advice等配置罗列出来。

还是重复唠叨一下,基础AOP标签配置的好处和坏处都是什么:

好处:自动代理,不需要自定义代理对象。配置简单。

坏处:不易理解。

下面是实例:

步骤:

1、业务接口定义 

package com.techbirds.spring.aop_two;

public interface ICar {
	public void go() throws Exception;
}

2、业务接口实现

package com.techbirds.spring.aop_two;

import java.util.logging.Logger;

public class Bus implements ICar {

	private Logger logger=Logger.getLogger(this.getClass().getName());
	@Override
	public void go() throws Exception {
		logger.info("the bus go...");
		throw new Exception();
	}

}

3、Adivce(插入代码)实现

package com.techbirds.spring.aop_two;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.aspectj.lang.JoinPoint;

public class LogAspectCar {
	private Logger logger=Logger.getLogger(this.getClass().getName());
	
	/**
	 * 执行后
	 * @param jp
	 */
	public void afterCar(JoinPoint jp){
		logger.info("do ... after the car "+jp.getSignature().getName());
	}
	/**
	 * 执行前
	 * @param jp
	 */
	public void beforeCar(JoinPoint jp){
		logger.info("do ... before the car "+jp.getSignature().getName());
	}
	/**
	 * 执行异常信息获取
	 * @param jp
	 * @param ta
	 */
	public void throwExceptionOfCar(JoinPoint jp,Throwable ta){
		logger.log(Level.WARNING,"log "+ta+" " +
				"Exception was thrown in "+jp.getSignature().getDeclaringTypeName()+"."+jp.getSignature().getName());
	}
}

4、spring对应配置

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
	
	<bean id="bus" class="com.techbirds.spring.aop_two.Bus"></bean>
	<bean id="logAspectCar" class="com.techbirds.spring.aop_two.LogAspectCar"></bean>
	
	<aop:config>  
	    <aop:aspect ref="logAspectCar"> 
	        <aop:before method="beforeCar" pointcut="execution (* com.techbirds.spring.aop_two.ICar.*(..))"/>
	        <aop:after-returning method="afterCar" pointcut="execution (* com.techbirds.spring.aop_two.ICar.*(..))" /> 
	        <aop:after-throwing method="throwExceptionOfCar" throwing="ta" pointcut="execution (* com.techbirds.spring.aop_two.ICar.*(..))" /> 
	    </aop:aspect>  
	</aop:config> 
	
	<!-- 
		这个配置跟上面的目的一样,比较方便一点
		<aop:config>  
		    <aop:aspect ref="logAspectCar">  
		   		<aop:pointcut id="car_pc" expression="execution (* com.techbirds.spring.aop_two.ICar.*(..))" />
		        <aop:before method="beforeCar" pointcut-ref="car_pc"/>
		        <aop:after-returning method="afterCar" pointcut-ref="car_pc"/> 
		    </aop:aspect>  
		</aop:config>
	 -->
	
	
</beans>


5、测试

package com.techbirds.spring.aop_two;


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

public class AopTest {
	//public Logger logger=Logger.getLogger(this.getClass().getName());
	
	public static void main(String[] args) {
//		ApplicationContext ctx
//		= new FileSystemXmlApplicationContext("resources/aop.xml");
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/resources/aop.xml");
		// 得到代理对象
		ICar car = (ICar) ctx.getBean("bus");
		// 执行方法
		try {
			car.go();
		} catch (Exception e) {
			System.out.println("go error...");
		}
	}
}

6、测试结果

2013-6-8 16:05:59 com.techbirds.spring.aop_two.LogAspectCar beforeCar
信息: do ... before the car go
2013-6-8 16:05:59 com.techbirds.spring.aop_two.Bus go
信息: the bus go...
2013-6-8 16:05:59 com.techbirds.spring.aop_two.LogAspectCar throwExceptionOfCar
警告: log java.lang.Exception Exception was thrown in com.techbirds.spring.aop_two.ICar.go
go error...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值