AOP-基于xml的实现
我们在上几篇文章中实现了关于AOP基于注解的实现,在本文中,我们基于xml配置文件进行实现
首先我们补充一个知识点,下文能用到,Pointcut,定义和管理切入点。
@Pointcut(value ="execution(* com.yuyi.serviec.SomeserviceImpl.doSome())")
private void myexe(){
//无需代码
}
我们定义一个方法,不用实现,在方法上方加入@Pointcut,写入切入点执行位置。
@After(value = "myexe()")
public void myThrowing() {
System.out.println("我是最终通知,可以做资源的回收,内存的释放!");
}
在切入方法的上方的切入点位置,我们就可以直接使用定义的方法名作为属性!方便我们管理切入点。
好,言归正传我们学习在xml中实现AOP功能。
新建目标类
public class SomeserviceImpl implements Someservice {
@Override
public void doSome() {
System.out.println("someservice的doSome方法!");
}
}
新建切面类及方法
public class MyAspect {
public void myAfter() {
System.out.println("我是前置通知!!!");
}
}
我们并不是使用注解作为AOP的实现,所以,我们不用加注解,读者可以和我之前讲的对比。
现在我们以前置通知为例,配置xml文件,步骤如下
1.声明目标类
<!-- 声明目标类-->
<bean id="someservice" class="com.yuyi.serviec.SomeserviceImpl"/>
声明切面类
<!-- 声明切面类-->
<bean id="myaspect" class="com.yuyi.aspect.MyAspect"/>
2.配置AOP标签
<!--配置aop,把通知和切入点的内容放入配置文件中,使用标签和属性来完成-->
<aop:config >
<!-- 声明切入点表达式-->
<aop:pointcut id="somepoint" expression="execution(* com.yuyi.serviec.SomeserviceImpl.doSome())"/>
<aop:aspect ref="myaspect">
<aop:before method="myAfter" pointcut-ref="somepoint"></aop:before>
</aop:aspect>
</aop:config>
</beans>
我们知道,切面类的执行需要两个要素:执行时间和执行位置。
我们使用 <aop:config >标签,在他的子标签中使用aop:pointcut 配置切入点表达式。
给它起个别名,作为id的值,expression 是赋值切入点的位置。
我们使用aop:aspect 标签,来声明切面类。
ref属性是切面类的id,aop:before 来表明通知的类型,method属性表明切入方法,pointcut-ref即上方切入点的id。
这样我们就配置成功了一个基于XML的aop实现。
我们运行测试类
与我们用标签实现的前置通知一模一样。
对比我们的基于注解的实现,我们不需要在类和方法上使用标签,也不需要使用代理生成器。
我们在后期会使用这种方法来配置事务,修改起来十分方便!