国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

實例說明spring實現aop的2種方式(注解和xml配置)

2019-11-14 15:28:10
字體:
來源:轉載
供稿:網友

  本文說到sPRing的配置,常見的有兩種:注解方式和xml文件配置方式。(直接上實例,所以細節方面不會提及)

本人用的是maven項目,下面附上maven pom文件的依賴jar:

 1 <dependencies> 2     <dependency> 3       <groupId>junit</groupId> 4       <artifactId>junit</artifactId> 5       <version>3.8.1</version> 6       <scope>test</scope> 7     </dependency> 8     <dependency> 9         <groupId>org.springframework</groupId>10         <artifactId>spring-context</artifactId>11         <version>4.2.1.RELEASE</version>12     </dependency>13     <dependency>14         <groupId>commons-logging</groupId>15         <artifactId>commons-logging</artifactId>16         <version>1.2</version>17     </dependency>18     <dependency>19         <groupId>org.jdom</groupId>20         <artifactId>jdom</artifactId>21         <version>1.1.3</version>22     </dependency>23     <dependency>24         <groupId>cglib</groupId>25         <artifactId>cglib-nodep</artifactId>26         <version>2.1_3</version>27     </dependency>28     <dependency>29         <groupId>org.aspectj</groupId>30         <artifactId>aspectjrt</artifactId>31         <version>1.6.11</version>32      </dependency>33      <dependency>34         <groupId>org.aspectj</groupId>35         <artifactId>aspectjweaver</artifactId>36         <version>1.6.11</version>37      </dependency>38   </dependencies>
maven pom.xml

 

下面圖文說明我們src下的包結構:

 

上圖所示 就是我們的包文件以及需要的幾個類:

首先, 建立model類UserManager,代碼如下:

 1 package com.wangku.spring.model; 2  3 public class UserManager { 4  5     private int id; 6     private String name; 7     private String passWord; 8      9     public int getId() {10         return id;11     }12     public void setId(int id) {13         this.id = id;14     }15     public String getName() {16         return name;17     }18     public void setName(String name) {19         this.name = name;20     }21     public String getPassword() {22         return password;23     }24     public void setPassword(String password) {25         this.password = password;26     }27 28 }
UserManagerr

 

然后, 建立一個測試service接口IUserManagerService類,代碼如下:

 1 package com.wangku.spring.service; 2  3 import com.wangku.spring.model.UserManager; 4  5 public interface IUserManagerService { 6  7     public void addUser(String userName, String password); 8      9     public void updateUser(int userId, String userName, String password);10     11     public void deleteUser(int userId);12     13     public UserManager findUser(int userId);14 }
IUserManagerService

 

接著寫一個實現類UserManagerServiceImpl并實現上面的接口,代碼如下:

 1 package com.wangku.spring.service.impl; 2  3 import org.springframework.stereotype.Service; 4  5 import com.wangku.spring.model.UserManager; 6 import com.wangku.spring.service.IUserManagerService; 7  8 @Service("manager") 9 public class UserManagerServiceImpl implements IUserManagerService{10 11     public void addUser(String userName, String password) {12         System.out.println("--------------UserManager addUser-------------");13     }14 15     public void updateUser(int userId, String userName, String password) {16         System.out.println("--------------UserManager updateUser-------------");17     }18 19     public void deleteUser(int userId) {20         System.out.println("--------------UserManger deleteUser-------------");21     }22 23     public UserManager findUser(int userId) {24         UserManager userManager = new UserManager();25         System.out.println("--------------UserManager findUser-------------");26         return userManager;27     }28 }
UserManagerServiceImpl

 

此時在spring的配置文件添加UserManagerServiceImpl的bean,代碼如下:

 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" xmlns:aop="http://www.springframework.org/schema/aop" 4     xmlns:context="http://www.springframework.org/schema/context" 5     xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" 6     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 7     xsi:schemaLocation=" 8         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 9         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd10         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd11         http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd12         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd13         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">14         15         <bean id="userManager" class="com.wangku.spring.service.impl.UserManagerServiceImpl" />16 17 </beans>
applicationContext.xml

配置好bean之后,我們建立一個測試類寫測試用例測試我們的model,代碼如下:

 1 import org.junit.Test; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4  5 import com.wangku.spring.service.IUserManagerService; 6  7 public class TestUserManager { 8  9     @Test10     @SuppressWarnings("resource")11     public void testUserManager() {12         13         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");14         IUserManagerService userBean = (IUserManagerService) ctx.getBean("userManager");15         userBean.addUser("zhaolibin", "buzhidao");16     }17 }
TestUserManager

 

Junit運行實例后,打印如下結果:

--------------UserManager addUser-------------

 

 

一: XML配置AOP:

 

現在我們首先用xml文件配置方式來實現aop,spring aop中有好多切面、通知之類的理論知識在此不多說了,直接來實例,寫一個切面類,在類中寫上常見幾個通知的方法,代碼如下:

 1 package com.wangku.spring.util; 2  3 import org.aspectj.lang.ProceedingJoinPoint; 4  5 public class InterceptorAop { 6  7     public void doBefore() { 8         System.out.println("========執行前置通知=========="); 9     }10     11     public void doAferReturning() {12         System.out.println("=========執行后置通知================");13     }14     15     public void doAfter() {16         System.out.println("========執行最終通知==========");17     }18     19     public void doAferThrowing() {20         System.out.println("=============執行意外通知================");21     }22     23     public Object doAround(ProceedingJoinPoint pjp) throws Throwable {24         25         System.out.println("=========進入判斷方法===========");26         Object result = pjp.proceed();27         System.out.println("==========進入退出方法==========");28         return result;29     }30 }
InterceptorAop

 

然后我們需要在spring的xml文件里配置切點類以及對應的方法,代碼如下:

		<bean id="aspetBean" class="com.wangku.spring.util.InterceptorAop"/> 				<aop:config>			<aop:aspect id="aspet" ref="aspetBean">				 <aop:pointcut expression="execution (* com.wangku.spring.service.impl..*.*(..))" id="cut"/>   					 				 <aop:before pointcut-ref="cut" method="doBefore"/>				 <aop:after-returning pointcut-ref="cut" method="doAferReturning"/>				 <aop:after pointcut-ref="cut" method="doAfter"/>				 <aop:after-throwing pointcut-ref="cut" method="doAferThrowing"/>				 <aop:around pointcut-ref="cut" method="doAround"/>			</aop:aspect>		</aop:config> 

在此大概說下上面的切入點表達式:

1 execution (* com.wangku.spring.service.impl..*.*(..))2 execution : 表示執行3 第一個*號 : 表示返回值類型, *可以是任意類型4 com.wangku.spring.service.impl : 代表掃描的包5 .. : 代表其底下的子包也進行攔截  6 第二個*號 : 代表對哪個類進行攔截,*代表所有類  7 第三個*號 : 代表方法  *代表任意方法8 (..) : 代表方法的參數有無都可以

 




 此時配置已經起作用了,再次運行測試用例可以發下打印如下結果:

========執行前置通知===================進入判斷方法===========--------------UserManager addUser-------------==========進入退出方法==================執行最終通知===================執行后置通知================

 

細心的同學可以觀察下不同的通知執行的時機。

上面就是xml配置的情況,但通常情況下 xml配置略顯繁瑣,所以我們來看看注解配置如何進行。

二:注解配置AOP

 

使用注解使一切都變得簡單,首先spring配置文件中加入注解和支持注釋的配置,代碼如下:

        <aop:aspectj-autoproxy/> 
        <context:annotation-config />
        <context:component-scan base-package="com.wangku.spring" />

 

最下面的一行配置是指我們要掃描的包。此時有人可能注意到了我們之前寫的serviceImpl中的一句注解:@Service("manager")

此時我們的xml是支持掃描的,所以我們在spring配置文件中去掉bean的配置,值保持上面的這幾行配置文件,然后在Junit里執行下面代碼:

    @Test    @SuppressWarnings("resource")    public void testUserManager() {                ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        IUserManagerService userBean = (IUserManagerService) ctx.getBean("manager");        userBean.addUser("zhaolibin", "buzhidao");    }    

 

打印出了我們意料中的結果,然后我們開始用注解的方式配置aop切面類,具體代碼如下:

 1 package com.wangku.spring.util; 2  3 import org.aspectj.lang.annotation.After; 4 import org.aspectj.lang.annotation.Aspect; 5 import org.aspectj.lang.annotation.Before; 6 import org.aspectj.lang.annotation.Pointcut; 7  8 @Aspect 9 public class Interceptor {10     11     @Pointcut("execution (* com.wangku.spring.service.impl..*.*(..))")12     private void anyMethod() {13         System.out.println("============進入anyMethod方法==============");14     }15     16     @Pointcut("execution (* com.wangku.spring.service.test..*.*(..))")17     private void someMethod() {18         System.out.println("============進入someMethod方法==============");19     }20     21     @Before("anyMethod()")22     public void doBefore() {23         System.out.println("==========執行前置通知===============");24     }25     26     @After("someMethod()")27     public void doAfter() {28         System.out.println("===========執行最終通知==============");29     }30 }
Interceptor

 

因為是切面類,所以使用@Aspect注解此類,然后用@Pointcut來指定切面表達式,此處我定義了2個切面表達式。

在spring配置文件中加入切面類的bean,如下

<bean id="interceptor" class="com.wangku.spring.util.Interceptor"/>

 

此時再次運行上面的Junit,會發現打印如下結果:

==========執行前置通知===============--------------UserManager addUser-------------

 

注解已經執行了。接著在service下面再建立另一個test包,下面新建一個UserTestServiceImpl類進行多切面表達式的測試, 代碼如下

 1 package com.wangku.spring.service.test; 2  3 import org.springframework.stereotype.Service; 4  5 import com.wangku.spring.model.UserManager; 6 import com.wangku.spring.service.IUserManagerService; 7  8 @Service("tester") 9 public class UserTestServiceImpl implements IUserManagerService{10 11     public void addUser(String userName, String password) {12         System.out.println("--------------UserTestServiceImpl addUser-------------");13     }14 15     public void updateUser(int userId, String userName, String password) {16         System.out.println("--------------UserTestServiceImpl updateUser-------------");17     }18 19     public void deleteUser(int userId) {20         System.out.println("--------------UserTestServiceImpl deleteUser-------------");21     }22 23     public UserManager findUser(int userId) {24         System.out.println("--------------UserTestServiceImpl findUser-------------");25         return null;26     }27 }
UserTestServiceImpl

 

此時利用execution (* com.wangku.spring.service.test..*.*(..))切面表達式來掃描我們新建的測試類,在Junit測試用例中執行以下代碼:

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");        IUserManagerService userBean = (IUserManagerService) ctx.getBean("tester");        userBean.addUser("zhaolibin", "buzhidao");

 

執行結果如下:

--------------UserTestServiceImpl addUser-------------===========執行最終通知==============

 

由此可見,我們可以配置不同的切面表達式針對不同的類進行切面處理,當然通常情況下多用于權限等的控制。

 

spring aop的xml文件配置還有其他不同的形式,例如通過

        <aop:config>            <aop:advisor advice-ref=""/>        </aop:config>

 

這種形式,不過殊途同歸,只要了解其中的原理就好。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 田林县| 永平县| 灵璧县| 贵港市| 二连浩特市| 孟村| 卓资县| 滁州市| 旬邑县| 平果县| 阜新| 江城| 灌云县| 阳西县| 鲜城| 石家庄市| 翁源县| 麻栗坡县| 合阳县| 北海市| 若尔盖县| 铁岭市| 鲁甸县| 华容县| 肇源县| 怀来县| 兴文县| 新巴尔虎右旗| 思南县| 滨州市| 元谋县| 桑日县| 贵州省| 东宁县| 海门市| 阳西县| 抚顺县| 四会市| 新竹市| 婺源县| 长宁区|