spring框架详解(三)--AOP

来源:互联网 发布:域名注册ip查询 编辑:程序博客网 时间:2024/05/22 12:35

一.什么是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 blocke.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 blocke.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);

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

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

原创粉丝点击