AOP

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

主要功能

日志记录,性能统计,安全控制,事务处理,异常处理等等

主要意图

将日志记录,性能统计,安全控制,事务处理, 异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
实例之日志记录
定义一个简单接口实现类
public class HelloWorldServiceImpl implements HelloWorldService {

	@Override
	public void say(String msg) {
		System.out.println("say to world: "+msg);
//		System.out.println(1/0);
	}

}
测试类
public class TestAop {
	
	private ApplicationContext ac;
	
	@Before
	public void setUp() throws Exception {
		ac = new ClassPathXmlApplicationContext("beans.xml");
	}
	
	@Test
	public void test(){
		HelloWorldService hw = (HelloWorldService) ac.getBean("helloWorldService");
		hw.say("hello");
	}
}

日志输出类
public class HelloServiceAspect {

	//前置通知
	public void doBefore(JoinPoint jp){
		System.out.println("类名:"+ jp.getTarget().getClass().getName());
		System.out.println("方法名:"+ jp.getSignature().getName());
		System.out.println("内容: "+ jp.getArgs()[0]);
		System.out.println("开始说话");
	}
	
	//后置通知
	public void doAfter(JoinPoint jp){
		System.out.println("说话完成");
	}
	
	//环绕通知
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("环绕通知前");
		Object proceed = pjp.proceed();
		System.out.println("环绕通知后");
		return proceed;
	}
	
	//异常通知
	public void doAfterThrowing(JoinPoint jp, Throwable ex){
		System.out.println("异常通知");
		System.out.println("异常信息: "+ ex.getMessage());
	}
}

配置文件
<?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"
    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">
	
	<bean id="helloServiceAspect" class="spring.advice.HelloServiceAspect"></bean>
	
	<bean id="helloWorldService" class="spring.service.impl.HelloWorldServiceImpl"></bean>
	
	<aop:config>
		<aop:aspect id="helloServiceAspect" ref="helloServiceAspect">
			<aop:pointcut expression="execution(* spring.service.*.*(..))" id="businessService"/>
			<aop:before method="doBefore" pointcut-ref="businessService"/>
			<aop:after method="doAfter" pointcut-ref="businessService"/>
			<aop:around method="doAround" pointcut-ref="businessService"/>
			<aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/>
		</aop:aspect>
	</aop:config>
	
</beans>

正则表达式含义:第一个*表示返回值任意,第二个表示任意类,第三个表示任意方法,(..)表示传参任意
以上是四种常用得配置,前置通知、后置通知、环绕通知、异常通知




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值