用spring aop 代替jdk动态代理模式,对目标接口的方法进行切入业务
- 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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<context:component-scan base-package="com.ss" />
<aop:aspectj-autoproxy />
<!-- 注册需要被横切的类 -->
<bean id="dao" class="com.ss.dao.Dao" />
<!-- 注册切面类 -->
<bean id="daoAspect" class="com.ss.spring.DaoAspect" />
<!-- 配置aop -->
<aop:config>
<!-- 配置具体切面,调用切面类 -->
<aop:aspect id="theAspect" ref="daoAspect">
<!-- 对哪些方法进行切入,进行增强 -->
<aop:pointcut id="myPointcut" expression="execution(public * com.ss.dao..*.*(..))" />
<!-- 切入方法 -->
<aop:before pointcut-ref="myPointcut" method="beforeMe" />
<aop:after pointcut-ref="myPointcut" method="afterMe" />
<aop:after-throwing method="thr" pointcut-ref="myPointcut" throwing="ex"/>
<aop:after-returning method="rt"/>
</aop:aspect>
</aop:config>
</beans>
- 切面类
package com.ss.spring;
/**
* 切面类
* @author Administrator
*
*/
public class DaoAspect {
/**
* 切面方法。注意方法名对应
*/
public void beforeMe(){
System.out.println("before");
}
public void afterMe(){
System.out.println("after");
}
public void thr(){
System.out.println("thr");
}
}
- 被切入的目标
package com.ss.dao;
import org.junit.Test;
import com.ss.pojo.User;
/**
* 被切入的类
* @author Administrator
*
*/
public class Dao implements IDao{
@Test
public void test(){
// System.out.println(1/0);
System.out.println("daotest");
}
}
- 调用测试
package com.ss.service;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ss.dao.Dao;
import com.ss.dao.IDao;
public class Service {
@Test
public void test(){
// 初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("container.xml");
// 从容器中获取对象
IDao dao = (IDao)ctx.getBean("dao");
// 调用方法
dao.test();
}
}
控制台输出