带你了解Spring AOP的使用详解
目录
- springmvc.xml
- BankDao
- AdminCheck
- BankDaoImpl
- LogInfo
- Transmaction
- AdminCheckInterceptor
- LogInfoInceptor
- TransmactionInterceptor
- Test
- 总结
springmvc.xml
<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" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx https://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean id="adminCheck" class="cn.hp.impl.AdminCheck"></bean> <bean id="transmaction" class="cn.hp.impl.Transmaction"></bean> <bean id="bankDao" class="cn.hp.impl.BankDaoImpl"> <!-- <property name="adminCheck" ref="adminCheck"></property>--> <!-- <property name="transmaction" ref="transmaction"></property>--> </bean> <!-- <aop:config>--> <!--<!– 切入点,什么时候,执行什么切入进来–>--> <!-- <aop:pointcut id="savepoint" expression="execution(* cn.hp.impl.*.*(..))"/>--> <!--<!– 切面-用来做事情-执行业务逻辑之前-你要做或执行什么事情–>--> <!-- <aop:aspect id="adminincepter" ref="adminCheck">--> <!-- <aop:before method="check" pointcut-ref="savepoint"></aop:before>--> <!-- </aop:aspect>--> <!-- --> <!-- <aop:aspect id="transmactionincepter" ref="transmaction">--> <!-- <aop:around method="dointcepter" pointcut-ref="savepoint"></aop:around>--> <!-- </aop:aspect>--> <!-- </aop:config>--> <bean id="logInfo" class="cn.hp.impl.LogInfo"></bean> <bean id="adminCheckInterceptor" class="cn.hp.interceptor.AdminCheckInterceptor"> <property name="adminCheck" ref="adminCheck"></property> </bean> <bean id="logInfoInceptor" class="cn.hp.interceptor.LogInfoInceptor"> <property name="logInfo" ref="logInfo"></property> </bean> <bean id="transmactionInterceptor" class="cn.hp.interceptor.TransmactionInterceptor"> <property name="transmaction" ref="transmaction"></property> </bean> <!-- 注入代理类--> <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--代理对象是谁--> <property name="target" ref="bankDao"></property> <!-- 代理的接口--> <property name="proxyInterfaces" value="cn.hp.dao.BankDao"></property> <!-- 代理的通知组件--> <property name="interceptorNames"> <list> <value>adminCheckInterceptor</value> <value>logInfoInceptor</value> <value>transmactionInterceptor</value> </list> </property> </bean> </beans>
BankDao
package cn.hp.dao; public interface BankDao { /** * 存钱 */ public void remit(); /** * 取钱 */ public void withdrawMoney(); /** * 转账 */ public void transferAccounts(); }
AdminCheck
package cn.hp.impl; public class AdminCheck { public void check(){ System.out.println("正在验证账号信息"); } }
BankDaoImpl
package cn.hp.impl; import cn.hp.dao.BankDao; public class BankDaoImpl implements BankDao { @Override public void remit() { // adminCheck.check(); // transmaction.beginTransmaction(); System.out.println("存钱的业务逻辑"); // transmaction.closeTransmaction(); } @Override public void withdrawMoney() { // adminCheck.check(); // transmaction.beginTransmaction(); System.out.println("取钱的业务逻辑"); // transmaction.closeTransmaction(); } @Override public void transferAccounts() { System.out.println("转账的业务逻辑"); } }
LogInfo
package cn.hp.impl; public class LogInfo { public void write(){ System.out.println("写日志中"); } }
Transmaction
package cn.hp.impl; import org.aspectj.lang.ProceedingJoinPoint; public class Transmaction { public void beginTransmaction(){ System.out.println("开始事务"); } public void closeTransmaction(){ System.out.println("结束事务"); } public void dointcepter(ProceedingJoinPoint point) throws Throwable { beginTransmaction(); point.proceed(); closeTransmaction(); } }
AdminCheckInterceptor
package cn.hp.interceptor; import cn.hp.impl.AdminCheck; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; import java.util.Set; public class AdminCheckInterceptor implements MethodBeforeAdvice { private AdminCheck adminCheck; public AdminCheck getAdminCheck() { return adminCheck; } public void setAdminCheck(AdminCheck adminCheck) { this.adminCheck = adminCheck; } @Override public void before(Method method, Object[] objects, Object o) throws Throwable { adminCheck.check(); } }
LogInfoInceptor
package cn.hp.interceptor; import cn.hp.impl.LogInfo; import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class LogInfoInceptor implements AfterReturningAdvice { private LogInfo logInfo; public LogInfo getLogInfo() { return logInfo; } public void setLogInfo(LogInfo logInfo) { this.logInfo = logInfo; } @Override public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { logInfo.write(); } }
TransmactionInterceptor
package cn.hp.interceptor; import cn.hp.impl.Transmaction; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.apache.ibatis.transaction.Transaction; public class TransmactionInterceptor implements MethodInterceptor { private Transmaction transmaction; public Transmaction getTransmaction() { return transmaction; } public void setTransmaction(Transmaction transmaction) { this.transmaction = transmaction; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { transmaction.beginTransmaction(); Object obj = invocation.proceed(); transmaction.closeTransmaction(); return obj; } }
Test
package cn.hp.test; import cn.hp.dao.BankDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { //test1(); // test2(); test3(); } private static void test3() { ApplicationContext ac= new ClassPathXmlApplicationContext("springmvc.xml"); BankDao proxyFactory = ac.getBean("proxyFactory", BankDao.class); proxyFactory.remit(); } private static void test2() { ApplicationContext ac = new ClassPathXmlApplicationContext("springmvc.xml"); BankDao bd = ac.getBean("bankDao",BankDao.class); bd.transferAccounts(); } private static void test1() { ApplicationContext ac = new ClassPathXmlApplicationContext("springmvc.xml"); BankDao bd = ac.getBean("bankDao",BankDao.class); bd.withdrawMoney(); } }
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!
赞 (0)