1 简析
2 代码演练
2.1 环绕通知的综合应用
1 简析
2 代码演练
2.1 环绕通知的综合应用
测试类:
package com.imooc.test.aop; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; import com.imooc.aop.schema.advisors.service.InvokeService; import com.imooc.test.base.UnitTestBase; @RunWith(BlockJUnit4ClassRunner.class) public class TestAOPSchemaAdvisors extends UnitTestBase { public TestAOPSchemaAdvisors() { super("classpath:spring-aop-schema-advisors.xml"); } @Test /** * 1 这里问题的关键:在 ConcurrentOperationExecutor.java类中的try方法中 * 把正常的方法service.invoke() 和出现异常的方法service.invokeException() 进行对比 * * 2 从xml传值 <property name="maxRetries" value="3"/> */ public void testSave(){ InvokeService service = super.getbean("invokeService"); service.invoke(); System.out.println("==================================================================================================================="); service.invokeException(); } }
配置类:
<?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" xmlns:context="http://www.springframework.org/schema/context" 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-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <!-- 扫描包 --> <context:component-scan base-package="com.imooc.aop.schema"></context:component-scan> <!-- 配置aop --> <aop:config> <aop:aspect id="concurrentOperationRetry" ref="concurrentOperationExecutor"> <!-- 注意:此处有小空格 -->
<aop:pointcut id="idempotentOperation"
expression="execution(* com.imooc.aop.schema.advisors.service.*.*(..)) " />
<aop:around pointcut-ref="idempotentOperation" method="doConcurrentOperation"/>
</aop:aspect> </aop:config> <!-- 配置bean类 ,当下类作为通知类存在--> <bean id="concurrentOperationExecutor" class="com.imooc.aop.schema.advisors.ConcurrentOperationExecutor">
<property name="maxRetries" value="3"/>
<property name="order" value="100"/> </bean> </beans>
实体类:
package com.imooc.aop.schema.advisors.service; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.stereotype.Service; @Service public class InvokeService { public void invoke() { System.out.println("Invoke Service ...."); } public void invokeException(){ throw new PessimisticLockingFailureException(""); } }
通知类:
package com.imooc.aop.schema.advisors; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.core.Ordered; import org.springframework.dao.PessimisticLockingFailureException; public class ConcurrentOperationExecutor implements Ordered{ private static final int DEFAULT_MAX_RETRIES = 2; private int maxRetries = DEFAULT_MAX_RETRIES; private int order = 1; public int getMaxRetries() { return maxRetries; } public void setMaxRetries(int maxRetries) { this.maxRetries = maxRetries; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } /** * 通知对应的方法 * @param pjp * @return * @throws Throwable */ public Object doConcurrentOperation(ProceedingJoinPoint pjp) throws Throwable{ int numAttempts = 0; //次数 PessimisticLockingFailureException lockFailureException; do { numAttempts++; System.out.println("Try Times : "+numAttempts); try { return pjp.proceed(); } catch (PessimisticLockingFailureException e) { lockFailureException = e; } } while (numAttempts<=this.maxRetries);//次数递增,当小于常量(xml传入的次数)时 System.out.println("Try error:"+numAttempts); return lockFailureException; } }
打印日志:
四月 20, 2019 3:01:36 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@45a5049a: startup date [Sat Apr 20 15:01:36 CST 2019]; root of context hierarchy 四月 20, 2019 3:01:36 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [spring-aop-schema-advisors.xml] 四月 20, 2019 3:01:36 下午 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init> 信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring Try Times : 1 Invoke Service .... =================================================================================================================== Try Times : 1 Try Times : 2 Try Times : 3 Try Times :4 Try error:4 四月 20, 2019 3:01:37 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@45a5049a: startup date [Sat Apr 20 15:01:36 CST 2019]; root of context hierarchy