AspectJ的XML方式AOP开发
注解方式与XML方式在非常类似,为什么会有两种方式呢?-->用注解方式开发比较便捷,在维护的时候可能需要修改源代码这时候注解方式就显得不够灵活。用XML方式开发在维护的时候不需要修改源代码,XML集中了配置,直接在XML中直接操作,缺点配置繁多
XML方式开发AOP
- 导包(XML方式开发AOP所需的jar包与注解方式是一样的)
//增强目标
public class CustomerDaoImpl implements CustomerDao {
public void save() {System.out.println("保存客户...");}
public void delete() {System.out.println("删除客户...");}
public String update() {
System.out.println("修改客户...");
return "spring";
}
public void findOne() {
System.out.println("查询一个客户...");
// int a = 1/ 0;
}
public void findAll() {
System.out.println("查询多个客户...");
// int b = 1/0;
}
}
//配置切面
public class MyAspectXml {
// 前置通知
public void before(JoinPoint joinPoint){
System.out.println("XML方式的前置通知=============="+joinPoint);
}
// 后置通知
public void afterReturing(Object result){
System.out.println("XML方式的后置通知=============="+result);
}
// 环绕通知
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("XML方式的环绕前通知==============");
Object obj = joinPoint.proceed();
System.out.println("XML方式的环绕后通知==============");
return obj;
}
// 异常抛出通知
public void afterThrowing(Throwable e){
System.out.println("XML方式的异常抛出通知============="+e.getMessage());
}
// 最终通知
public void after(){
System.out.println("XML方式的最终通知=================");
}
}
//XML
1.引入约束
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
<!--配置目标类-->
<bean id="customerDao" class="cn.akwangl.aspectJXMl.CustomerDaoImpl"/>
<!--配置切面类-->
<bean id="myAspectXml" class="cn.akwangl.aspectJXMl.MyAspectXml"/>
<!--aop的相关配置-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pointcut1" expression="execution(* cn.akwangl.aspectJXMl.CustomerDao.save(..))"/>
<aop:pointcut id="pointcut2" expression="execution(* cn.akwangl.aspectJXMl.CustomerDao.update(..))"/>
<aop:pointcut id="pointcut3" expression="execution(* cn.akwangl.aspectJXMl.CustomerDao.delete(..))"/>
<aop:pointcut id="pointcut4" expression="execution(* cn.akwangl.aspectJXMl.CustomerDao.findOne(..))"/>
<aop:pointcut id="pointcut5" expression="execution(* cn.akwangl.aspectJXMl.CustomerDao.findAll(..))"/>
<!--配置AOP的切面-->
<aop:aspect ref="myAspectXml">
<!--配置前置通知-->
<aop:before method="before" pointcut-ref="pointcut1"/>
<!--配置后置通知-->
<aop:after-returning method="afterReturing" pointcut-ref="pointcut2" returning="result"/>
<!--配置环绕通知-->
<aop:around method="around" pointcut-ref="pointcut3"/>
<!--配置异常抛出通知-->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="e"/>
<!--配置最终通知-->
<aop:after method="after" pointcut-ref="pointcut5"/>
</aop:aspect>
</aop:config>