spring顾问包装通知
生活随笔
收集整理的這篇文章主要介紹了
spring顾问包装通知
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前邊說到了顧問就是通知,沒有實踐,這里就實踐一下,證明一下。
雖然可以說顧問就是通知,但是他們還是有的一定的區別的,通知是將目標類中所有的方法都進行的增強,而顧問卻可以指定到特定的方法上,也就是說顧問的功能更加強大一些
而包裝的方式常用的有兩種,一種是基于名字的(方法),一種是基于正則的(方法),他們都是通過目標類的方法名進行的包裝。
創建增強類
1 /** 2 * 增強類 3 */ 4 public class Advice implements MethodBeforeAdvice, AfterReturningAdvice { 5 @Override 6 public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { 7 System.out.println("我是后置增強"); 8 } 9 10 @Override 11 public void before(Method method, Object[] objects, Object o) throws Throwable { 12 System.out.println("我是前置增強"); 13 } 14 }創建service接口
1 public interface DoSome { 2 void dosome(); 3 void say(); 4 }創建實現類
public class DoSomeImpl implements DoSome{public void dosome(){System.out.println("我是service層");}@Overridepublic void say() {System.out.println("你好,bdqn");} }由于兩種增強方式的service層和增強類都是一樣的這里我只寫一次
第一種根據方法名包裝
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 <!--創建service層的bean--> 6 <bean id="service" class="service.DoSomeImpl"></bean> 7 <!--創建通知的bean--> 8 <bean id="advice" class="advice.Advice"></bean> 9 <!--顧問包裝通知--> 10 <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 11 <property name="advice" ref="advice"></property> 12 <property name="mappedNames" value="say"></property> 13 </bean> 14 <!--創建代理工廠bean,并注入屬性--> 15 <bean id="factoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> 16 <!--注入service實現類的bean--> 17 <property name="target" ref="service"/> 18 <!--注入通知的bean,注意這里不使用ref注入,只能是value屬性,屬性為avcisor 的bean的id屬性--> 19 <property name="interceptorNames" value="advisor"/> 20 </bean> 21 </beans>創建測試類
public class Dome {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");DoSome proxyFactory = (DoSome) context.getBean("factoryBean");//這里注入的是ProxyFactoryBean的id屬性值 proxyFactory.say();System.out.println(">>>>>>>>>>>兩個方法的分割線>>>>>>>>>>>>");proxyFactory.dosome();} }第二種基于正則的方式
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 <!--創建service層的bean--> 6 <bean id="service" class="service.DoSomeImpl"></bean> 7 <!--創建通知的bean--> 8 <bean id="advice" class="advice.Advice"></bean> 9 <!--顧問包裝通知--> 10 <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 11 <property name="advice" ref="advice"></property> 12 <property name="pattern" value=".*say.*"/> 13 </bean> 14 <!--創建代理工廠bean,并注入屬性--> 15 <bean id="factoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> 16 <!--注入service實現類的bean--> 17 <property name="target" ref="service"/> 18 <!--注入通知的bean,注意這里不使用ref注入,只能是value屬性,屬性為通知類bean的id屬性--> 19 <property name="interceptorNames" value="advisor"/> 20 </bean> 21 </beans>測試類與第一種方式相同,結果自行驗證,需要的pom節點
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.0.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.1.0.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.1.0.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-expression --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.1.0.RELEASE</version></dependency><!--以上4個是spring的核心--><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.2</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.2</version></dependency>每次寫一個通知都需要手動去添加一個代理工廠也是很煩人的,那自然有簡單的方式,只需要配置一次即可以了
基于id名的代理生成器:
<?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"><!--創建service層的bean--><bean id="service" class="service.DoSomeImpl"></bean><!--創建通知的bean--><bean id="advice" class="advice.Advice"></bean><!--基于方法名的包裝--><bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"><property name="advice" ref="advice"></property><property name="mappedName" value="say"></property></bean><!--基于方法名的代理生成器--><bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><property name="beanNames" value="service"></property><property name="interceptorNames" value="advisor"/></bean> </beans>默認的代理生成器
<?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"><!--創建service層的bean--><bean id="service" class="service.DoSomeImpl"></bean><!--創建通知的bean--><bean id="advice" class="advice.Advice"></bean><!--顧問包裝通知--><bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><property name="advice" ref="advice"></property><property name="pattern" value=".*say.*"/></bean><!--基于方法名的代理生成器--><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"><property name="interceptorNames" value="service"/><property name="beanName" value="advisor"/></bean> </beans>由于代理工廠也被代理了,所以沒有了代理工廠的id這里測試類需要做一定的改變
public class Dome {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");DoSome proxyFactory = (DoSome) context.getBean("service");proxyFactory.say();System.out.println(">>>>>>>>>>>兩個方法的分割線>>>>>>>>>>>>");proxyFactory.dosome();} }自動代理生成器推薦使用第一種,第二種容易出bug,因為它默認會為xml文件中的所有bean節點創建工廠
?
轉載于:https://www.cnblogs.com/Tiandaochouqin1/p/10434379.html
總結
以上是生活随笔為你收集整理的spring顾问包装通知的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#生成PDF文件中时,设置边框为虚线和
- 下一篇: CSDN、博客园等6大技术博客平台的写作