Sping(七)Sping四種增強和顧問
阿新 • • 發佈:2018-03-10
實體 urn oca lB 之前 log exc -- title
前置增強 後置增強 環繞增強 異常增強
先編寫接口和實體類 ISomeService和SomeServiceImpl
package demo10; /** * Created by mycom on 2018/3/8. */ public interface ISomeService { public void doSome(); }
package demo10; /** * Created by mycom on 2018/3/8. */ public class SomeServiceImpl implements ISomeService { public void doSome() { System.out.println("================="); } }
先來說第一個前置增強,直接用例子來說明
package demo10; import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; /** * Created by mycom on 2018/3/8. */ public class BeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("=========before"); } }
在配置文件中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="demo10.SomeServiceImpl"></bean> <bean id="beforeAdvice" class="demo10.BeforeAdvice"></bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="beforeAdvice"></property> </bean> </beans>
@Test public void t1(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextBefore.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); proxyService.doSome(); }
運行的結果是
2.後置增強和前置增強一樣,只是改一改配置文件裏的名稱就可以
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="demo11.SomeServiceImpl"></bean> <bean id="afterAdvice" class="demo11.AfterAdvice"></bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="afterAdvice"></property> </bean> </beans>
3.環繞增強
直接飲用上面的接口和實現類了
在創建另一個類 MethodAdvice
package demo12; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * Created by mycom on 2018/3/8. */ public class MethodAdvice implements MethodInterceptor { public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("前置增強"); Object result = methodInvocation.proceed(); System.out.println("後置增強"); return result; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="demo12.SomeServiceImpl"></bean> <bean id="methodAdvice" class="demo12.MethodAdvice"></bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="methodAdvice"></property> </bean> </beans>
4.異常增強
package demo13; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.ThrowsAdvice; /** * Created by mycom on 2018/3/8. */ public class MyThroesAdvice implements ThrowsAdvice { public void afterThrowing(Exception ex){ System.out.println("網絡出現錯誤"); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="demo13.SomeServiceImpl"></bean> <bean id="throwsAdvice" class="demo13.MyThroesAdvice"></bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="throwsAdvice"></property> </bean> </beans>
@Test public void t2(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextThrows.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); try{ proxyService.doSome(); }catch (Exception ex){ ex.printStackTrace(); }
5.advisor 是顧問的意思 正對某一個方法增強
還有一個詞是通知 advice 我自己的理解是 通知視同只所有人,顧問是針對某個人顧問,這樣方便記憶
現在在ISomeService接口中在添加一個方法doAny(),在實現類中重寫這個方法
那麽在配置文件中
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="demo14.SomeServiceImpl"></bean> <bean id="beforeAdvice" class="demo14.BeforeAdvice"></bean> <!--與其他不一樣的地方--> <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="beforeAdvice"></property> <property name="mappedNames" value="do*"></property> </bean> <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="service"></property> <property name="interceptorNames" value="advisor"></property> </bean> </beans>
這個配置文件可以對比著之前寫的配置文件看看有什麽不同之處
@Test public void t2(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextAdvisor.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); proxyService.doSome(); proxyService.doAny(); }
Sping(七)Sping四種增強和顧問