文档章节

Spring中AOP使用——配置xml方式

HoiCai
 HoiCai
发布于 2017/03/20 00:19
字数 379
阅读 32
收藏 0

1.确认目标(bean)

<!-- 目标target -->
<bean id="customerService" class="cn.itcast.spring.a_proxy.CustomerServiceImpl"></bean>
<bean id="productService" class="cn.itcast.spring.a_proxy.ProductService"></bean>

2.编写通知(通知实现一个接口)

<!-- 通知增强advice -->
<bean id="myAspect" class="cn.itcast.spring.c_aopaspectj.MyAspect"></bean>

通知方法

前置通知

public void before(JoinPoint joinPoint){
	//判断某用户可执行的方法中,是否存在要运行的方法
	if("method1".equals(joinPoint.getSignature().getName())){
		throw new RuntimeException("没有权限执行该方法");
	}
}

后置通知

public void afterReturing(JoinPoint joinPoint, Object returnVal){
	//增强
}

环绕通知

public Object around(ProceedingJoinPoint proceedJoinPoint) throws Throwable{
	//目标方法的执行
	Object object = proceedJoinPoint.proceed();
	return object;	
}

环绕通知-终极版

public Object around(ProceedingJoinPoint proceedingJoinPoint){
	try{
		//前置通知
		Object result = proceedingJoinPoint.proceed();
		//后置通知
	}catch(Exception e){
		//抛出通知
	}finally{
		//最终通知
		return Object
	}
}

抛出通知

public void afterThrowing(JoinPoint joinPoint, Throwable ex){
	System.out.println(joinPoint.getTarget().getClass().getSimpleName()+" : "+joinPoint.getSignature().getName()+"  : "+ex.getMessage());
}

最终通知

public void after(JoinPoint joinPoint){
	System.out.println(joinPoint.toLongString());
}

##3. 配置切点切面 ##

applicationContext-aspectj.xml

<!-- 配置切入点和切面 -->
<aop:config>
	<!-- 切面 -->
	<aop:aspect ref="myAspect">
		<!-- 切入点 -->
		<aop:pointcut expression="within(cn.itcast.spring..*)" id="myPointcut" />
		<!-- 前置通知 -->
		<aop:before method="before" pointcut-ref="myPointcut" />
		<!-- 后置通知 -->
		<aop:after-returning method="afterReturning" pointcut-ref="myPointcut" returning="returnVal" /> 
		<!-- 环绕通知 -->
		<aop:around method="around" pointcut-ref="myPointcut"/>
		<!-- 抛出通知 -->
		<aop:after-throwing method="afterThrowing" pointcut-ref="myPointcut" throwing="ex" />
		<!-- 最终通知 -->
		<aop:after method="after" pointcut-ref="myPointcut"/>	
	</aop:aspect>
</aop:config>

切入点可直接写入通知中

<aop:before method="before" pointcut="bean(*Service)" />

异常

java.lang.ClassCastException:com.sun.proxy.$Proxy17 cannot be cast to xxxServiceImpl

原因:使用了jdk动态代理,目标对象是接口,无法转换为子类

解决方法: 使用类代理(cglib动态代理)

注解:

<aop:aspect-autoproxy proxy-target-class="true" />

xml

<aop:config proxy-target-class="true">

© 著作权归作者所有

HoiCai
粉丝 4
博文 30
码字总数 19923
作品 0
深圳
程序员
私信 提问
Spring中的AOP(七)——基于XML配置文件方式的AOP

除了前面介绍的基于JDK1.5的注解方式来定义切面,切入点和增强处理外,Spring AOP也允许直接使用XML配置文件来管理它们。在JDK1.5之前,只能使用配置文件的方式来管理,在Spring2.X后提供了一...

摆渡者
2014/03/24
4.4K
0
Spring学习总结——Spring实现AOP的多种方式

Spring学习总结——Spring实现AOP的多种方式 AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术。AOP是OOP的补充...

the_flying_pig
2017/11/06
0
0
说说在 Spring 中如何基于 Java 类进行配置

JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。 1 定义 Bean 普通的 POJO 只要标注...

deniro
2018/05/11
0
0
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
2018/08/14
0
0
Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 然而...

长平狐
2012/11/12
136
0

没有更多内容

加载失败,请刷新页面

加载更多

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
20分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
28分钟前
4
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
28分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
39分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部