日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring顾问包装通知

發布時間:2024/4/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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顾问包装通知的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。