该AOP开发入门案例采用XML文件方式配置开发(非注解方式)共包含一个xml文件和4个Java类,创建好web工程后引入相应jar包(文末会给出),建好包(若自定义包名注意更改类中的包名),将xml文件和Java类复制到包中即可通过测试类进行测试。
Spring的applicationContext.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置目标对象:被增强的对象 -->
<bean id="customerDao" class="cn.muc.spring.demo3.CustomerDaoImpl"></bean>
<!-- 将切面类交给Spring管理 -->
<bean id="myAspect" class="cn.muc.spring.demo3.MyAspectXML"></bean>
<!-- 通过AOP配置完成对目标类产生代理 -->
<aop:config>
<!-- 配置表达式:哪些类的哪些方法需要进行增强 -->
<aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.save(..))" id="pointcut1"/>
<aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.delete(..))" id="pointcut2"/>
<aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.update(..))" id="pointcut3"/>
<aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.find(..))" id="pointcut4"/>
<!-- 配置切面(通知) -->
<aop:aspect ref="myAspect">
<!-- 前置通知 -->
<aop:before method="checkPri" pointcut-ref="pointcut1"/>
<!-- 后置通知,returning中自定义的字符串表示切入点(原方法)返回值的名字-->
<aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
<!-- 环绕通知 -->
<aop:around method="watch" pointcut-ref="pointcut3"/>
<!-- 异常抛出通知 -->
<aop:after-throwing method="afterTrowing" pointcut-ref="pointcut4" throwing="ex"/>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="pointcut4"/>
</aop:aspect>
</aop:config>
</beans>
Dao接口代码:
package cn.muc.spring.demo3;
public interface CustomerDao {
public void save();
public String delete();
public void update();
public void find();
}
Dao实现类代码:
package cn.muc.spring.demo3;
public class CustomerDaoImpl implements CustomerDao {
@Override
public void save() {
System.out.println("保存方法被调用了。。。");
}
@Override
public String delete() {
System.out.println("删除方法被调用了。。。");
return "后置通知获得方法返回值";
}
@Override
public void update() {
System.out.println("更新方法被调用了。。。");
}
@Override
public void find() {
System.out.println("查找方法被调用了。。。");
int a = 1 / 0;
}
}
切面类代码:
package cn.muc.spring.demo3;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 切面类
* @author xufaye
*
*/
public class MyAspectXML {
/**
* 前置通知
*/
public void checkPri() {
System.out.println("权限校验==================");
}
/**
* 后置通知:可以获得方法返回值(通过传入对象类型的参数)
*/
public void writeLog(Object result) {
System.out.println("日志记录===============" + result);
}
/**
* 环绕通知:比如可以用于性能监控
* @throws Throwable
*/
public Object watch(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前通知=========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知=========");
return obj;
}
/**
* 异常抛出通知
*/
public void afterTrowing(Throwable ex) {
System.out.println("异常抛出通知=========并获得异常信息:" + ex.getMessage());
}
/**
* 最终通知:无论有没有异常都会执行,相当于finally代码块中的内容
*/
public void after() {
System.out.println("最终通知===========");
}
}
测试类代码:
package cn.muc.spring.demo3;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* AOP入门
* @author xufaye
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo3 {
@Resource(name="customerDao")
private CustomerDao customerDao;
@Test
public void demo1() {
customerDao.save();
customerDao.delete();
customerDao.update();
customerDao.find();
}
}
Java中AOP开发配置入门案例开发所需引入的jar包
com.springsource.org.aopalliance-1.0.0.jar【AOP联盟】
com.springsource.org.apache.commons.logging-1.1.1.jar【日志包】
com.springsource.org.apache.log4j-1.2.15.jar【日志包】
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar【aspectj】
spring-aop-4.2.4.RELEASE.jar【spring整合AOP包】
spring-aspects-4.2.4.RELEASE.jar【spring整合aspectj包】
spring-beans-4.2.4.RELEASE.jar【spring基础包】
spring-context-4.2.4.RELEASE.jar【spring基础包】
spring-core-4.2.4.RELEASE.jar【spring基础包】
spring-expression-4.2.4.RELEASE.jar【spring基础包】
spring-test-4.2.4.RELEASE.jar【spring整合Junit包】