spring框架详解(三)--AOP

本文深入浅出地介绍了面向切面编程(AOP)的基本概念,包括切面、切点和通知等核心要素,并通过示例详细展示了如何在Spring框架中应用AOP进行编程。

一.什么是AOP

       

为了更好的对AOP的理解,可以这么抽象:
现实中你是一个大老板,你为了赚钱接了一个很大的工程,这些工程就是我们所编写的项目.但是这么大工程除了你的手下工人之外,当然最需要的是一个助理,这个助理就相当于AOP,它会随时向你报告工程情况,帮你工程监管,将你吩咐的事情全力做到.所以这个是很关键的.




二.切面 切点 通知

切面是横向的,就像之前举的例子,老板与助理的关系.一项工程要完成,需要一段时间才能完成,切面可以比喻助理每天要完成的任务,切点就更细化了就是每天完成任务的其中一项精确任务.通知就是在某个精确任务的时候所执行的动作.接到老板的通知.

使用AOP必须导入的包:
spring 实现AOP不仅仅需要自己的jar包,还需要第三方的jar,分别是
aspectjrt.jar,
aspectjweaver.jar,
aopalliance-1.0.jar,
将这三个jar包放入项目中就可以spring的aop编程了
结合切面 切点 通知xml配置

<bean id="aopAspect" class="com.eduask.chp.aop.AopAspect"></bean>//aop切面
<bean id="project" class="com.eduask.chp.aop.Project"/>//项目类
<aop:config>
 <aop:aspect id="aopAspect" ref="aopAspect">
 <aop:pointcut expression="execution(* com.eduask.chp.aop.*.*(..))" id="pointCutAop"/>//配置切点
 <aop:before method="before" pointcut-ref="pointCutAop"/>//方法开始执行
 <aop:after-returning method="afterReturning" pointcut-ref="pointCutAop"/>//返回结果后所执行
 <aop:after-throwing method="afterThrowing" pointcut-ref="pointCutAop"/>//抛出异常所执行
 <aop:after method="after" pointcut-ref="pointCutAop"/>//方法结束执行
 </aop:aspect>
</aop:config>
public class AopAspect {
public void before() {
	System.out.println("方法开始前");
}
public void afterReturning() {
	System.out.println("返回之后");
}
public void afterThrowing() {
	System.out.println("抛出异常");
}
public void after() {
	System.out.println("方法执行后");
}}

环绕通知
1.有参数
<aop:config>
 <aop:aspect id="aopAspect" ref="aopAspect">
 <aop:pointcut expression="execution(* com.eduask.chp.aop.AopAspect.aroundInit(String,int)) and args(name,times)" id="pointCutAop"/>
 <aop:around method="around" pointcut-ref="pointCutAop"/>
 <aop:around method="aroundInit" pointcut-ref="pointCutAop"/>
 </aop:aspect>
</aop:config>


public Object aroundInit(ProceedingJoinPoint pjp,String name,int times) {
	System.out.println(name+"  "+times);
	Object object=null;
	try {
		System.out.println("around1");
		object = pjp.proceed();
		System.out.println("around2");
	} catch (Throwable e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return object;
}

2.无参数
<aop:config>
 <aop:aspect id="aopAspect" ref="aopAspect">
 <aop:pointcut expression="execution(* com.eduask.chp.aop.*.*(..))" id="pointCutAop"/>
 <aop:around method="around" pointcut-ref="pointCutAop"/>
 </aop:aspect>
</aop:config>

public Object around(ProceedingJoinPoint pjp)	{
	try {
		System.out.println("around1");
		Object object = pjp.proceed();
		System.out.println("around2");
	} catch (Throwable e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return pjp;
}

三.introductions


<bean id="aopAspect" class="com.eduask.chp.aop.AopAspect"></bean>
<bean id="project" class="com.eduask.chp.aop.Project"/>
<aop:config>
 <aop:aspect id="aopAspect" ref="aopAspect">
 <aop:declare-parents types-matching="com.eduask.chp.aop.*(+)" 
 implement-interface="com.eduask.chp.aop.Fit" default-impl="com.eduask.chp.aop.FitImp"/>
 </aop:aspect>
</aop:config>

解释说明:
types-matching中匹配到的对象,相当于会给此类添加一个父类,其中的该父类的接口为implement-interface,实现类为default-impl,这样得到bean的对象后强转为该接口对象

 测试:Fit fit= (Fit) app.getBean(Project.class);

作用: 允许一个切面声明一个实现指定接口的通知对象,并且提供一个实现类代表这些对象

就像之前所说的助理可能需要一些帮手,这样才能更完整的完成项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值