您的位置:首页 > 编程语言 > Java开发

spring框架详解(三)--AOP

2017-09-12 17:22 441 查看

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

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

就像之前所说的助理可能需要一些帮手,这样才能更完整的完成项目
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  aop