1,定义Around处理
package cn.hunnu.aop.autoproxy; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * Around 处理 * @author 肖波 * */ public class ServiceDAOInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { String methodName = invocation.getMethod().getName(); System.out.println("before execute method:"+methodName); Object result = invocation.proceed(); System.out.println("after executed method:"+methodName); return result; } }
2,DAO、Service
package cn.hunnu.aop.autoproxy; public interface ITestDAO { public void query(); }
package cn.hunnu.aop.autoproxy; public interface ITestService { public void service(); }
package cn.hunnu.aop.autoproxy; public class TestDAO implements ITestDAO { @Override public void query() { System.out.println("query(): query data from database..."); } }
package cn.hunnu.aop.autoproxy; public class TestService implements ITestService { private ITestDAO dao; @Override public void service() { System.out.println("service(): call service to execute business logic..."); dao.query(); } public ITestDAO getDao() { return dao; } public void setDao(ITestDAO dao) { this.dao = dao; } }
3,上下文配置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: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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- BeanPostProcessor --> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- generate proxy dynamically for these beans which match the follow beanNames --> <property name="beanNames"> <!-- target bean will be wrapped --> <value>*DAO,*Service</value> </property> <property name="interceptorNames"> <value>ServiceDAOInterceptor</value> </property> </bean> <bean id="ServiceDAOInterceptor" class="cn.hunnu.aop.autoproxy.ServiceDAOInterceptor"> </bean> <bean id="TestDAO" class="cn.hunnu.aop.autoproxy.TestDAO"></bean> <bean id="TestService" class="cn.hunnu.aop.autoproxy.TestService"> <property name="dao"> <ref local="TestDAO"/> </property> </bean> </beans>
4,测试类
package cn.hunnu.aop.autoproxy; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String args[]) { //ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml"); ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ITestDAO dao = (ITestDAO)ctx.getBean("TestDAO"); ITestService service = (ITestService)ctx.getBean("TestService"); dao.query(); service.service(); } }
5,运行结果
before execute method:query query(): query data from database... after executed method:query before execute method:service service(): call service to execute business logic... before execute method:query query(): query data from database... after executed method:query after executed method:service