JavaEE開發之Spring中的依賴注入與AOP編程

來源:互聯網
上載者:User

標籤:開發

一、快速建立Mava管理的Spring工程

因為本篇部落格是討論關於Spring的東西,所以我們就不建立WebApp的工程了。我們使用Spring來快速的建立一個Maven管理的工程。如下所示找到File->New->Maven Project選項來建立一個新的Maven Project,具體如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313112219276-257957760.png" width="534" height="238" style="margin:0px;padding:0px;border:none;" />

 

下方我們選擇建立一個簡單的Maven工程,跳過模板的選擇。上篇部落格我們在建立Maven工程時,是沒有選擇下方這個選項的,然後我們選擇了一個WebApp的模板。而本篇部落格,我們不需要WebApp的模板,只需要一個簡單的Maven工程即可。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313112502276-1429670551.png" width="533" height="466" style="margin:0px;padding:0px;border:none;" />

 

接著輸入組織名和工程名,如下所示。點擊Finish即可完成Maven簡單工程的建立。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313112708260-1433992185.png" width="508" height="315" style="margin:0px;padding:0px;border:none;" />

 

下面就是我們建立好的Maven 工程的目錄結構,我們的工程代碼要放在src/main/java中,稍後會使用到。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313112803448-1415886774.png" width="404" height="216" style="margin:0px;padding:0px;border:none;" />

建立好上述工程後,我們要在pom.xml中引入我們的Spring依賴包。下方xml就是pom.xml中的內容。我們先引入了spring-context包,如下所示:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.zeluli</groupId>  <artifactId>SpringDemoWithMaven</artifactId>  <version>0.0.1-SNAPSHOT</version>      <properties>      <java.version>1.8</java.version>      <spring.version>4.3.6.RELEASE</spring.version>  </properties>    <dependencies>  <!-- Spring 核心包的引入 -->      <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-context</artifactId>          <version>${spring.version}</version>      </dependency>        </dependencies>    <build>      <plugins>          <plugin>              <groupId>org.apache.maven.plugins</groupId>              <artifactId>maven-complier-plugin</artifactId>              <version>3.3.9</version>              <configuration>                  <source>${java.version}</source>                  <target>${java.version}</target>              </configuration>          </plugin>      </plugins>  </build></project>

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

 

 

二、Spring中的依賴注入

接下來我們要來看一下Spring中的依賴注入的調用方式,該部分主要聊了兩種Spring中的依賴注入的方式。一種是註解方式,這種方式也是常用的,另一種就是Java配置類的方式。當然在早期Spring版本中是使用xml進行依賴注入的,因為xml配置的繁瑣以及不方便管理的一些特點,所以我們在工程中一般使用註解以及Java配置的形式。下方會給出註解以及Java配置的形式,並給出其使用情境。

 

1、使用註解實現依賴注入

本小部分,我們將使用註解來聲明Spring中的Bean。主要是使用@Service註解來聲明商務邏輯層(Service層)所使用的Bean,使用@Repository註解聲明資料訪問層(DAO層)使用的Bean,使用@Controller註解來聲明展現層的Bean,使用@Component來註解組件的Bean。當然這幾個註解其在底層的實現是大同小異的,其功能也是類似的,只是名稱不同。

我們可以使用Spring提供的@Autowired來聲明依賴注入的注入點,也可以使用JSR-330提供的@Inject或者JSR-250提供的@Resource註解聲明注入點。下面就來看一下這些註解的使用方式。

 

(1) @Repository

下方程式碼片段就是使用@Repository註解來聲明的Bean,在資料訪問層會使用該註解來聲明DAO層的Bean。稍後我們會使用到下方的RepositoryBean。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313141747807-1753802647.png" width="605" height="191" style="margin:0px;padding:0px;border:none;" />

 

(2) @Service

下方是我們使用@Service來聲明的Bean,在商務邏輯層,我們會使用到@Service註解進行Bean的聲明。在下方程式碼片段中,我們使用@Service聲明ServiceBean後,在該類中,我們注入了RepositoryBean的對象。當然使用的是@Autowired來註解的依賴對象的注入點。也就是說,在運行時,會動態給下方的repositoryBean分配一個RepositoryBean的對象。如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313142054323-458522212.png" width="550" height="209" style="margin:0px;padding:0px;border:none;" />

 

(3) @Component

@Component是用來聲明組件的,也就是說你封裝了一個組件,這個組件就是使用@Component來進行註解,使其可以被注入。下方就是使用了@Component註解聲明的組件。稍後我們會在Controller中進行調用。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313142951745-1575838236.png" width="404" height="113" style="margin:0px;padding:0px;border:none;" />

 

(4) @Controller

接下來我們就使用@Controller來聲明我們的控制器,下方的ControllerBean就是我們的控制器類,當然此處我們使用@Controller進行的註解。然後在該控制器類中,我們使用了@Autowired註解來注入ServiceBean和ComponentBean的對象,然後在下方相應的方法中進行了使用。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313143118635-1543400755.png" width="446" height="367" style="margin:0px;padding:0px;border:none;" />

 

(5)、建立Spring的設定檔

接下來我們將建立Spring的設定檔,因為Spring可以通過此設定檔讀取一些內容相關的資訊。當然,Spring的設定檔其實就是一個Java類,然後我們使用@Configuration進行修飾即可。而@ComponentScan("包名")負責指定組件所在的包,也就是說設定完該項後,Spring會自動掃描該包下的@Component、@Service、@Repository、@Controller這些註解。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313143509151-563852319.png" width="530" height="110" style="margin:0px;padding:0px;border:none;" />

 

(6)、建立Main函數進行測試

上面一些列的Bean已經建立完畢,接下來,我們要建立我們測試用的Main函數了。首先我們使用註解配置上下文AnnotationConfigApplicationContext對象來從Java的設定檔中擷取Spring的上下文。然後擷取Controller Bean,下方是調用Controller Bean的相應的方法。最後再將調用的資源關閉掉即可。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313143930104-1333876973.png" width="735" height="314" style="margin:0px;padding:0px;border:none;" />

 

(7)、運行結果

上述實現完Main方法後,接下來我們就可以對其運行並看起運行效果了。具體運行結果如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313144352213-1023697855.png" width="426" height="83" style="margin:0px;padding:0px;border:none;" />

 

 

2、Java配置

上面一部分是使用Spring中提供的相關註解來聲明的各種類型的Bean。接下來我們就在Spring的設定檔來聲明相關的Bean,當然在Java設定檔中聲明的Bean一般是全域的,也就是說一些Bean要定義成全域的對象的話,我們就在Java配置中來進行Bean的聲明。例如一些公用的組件的Bean,我們就可以將其放入到Java的設定檔中。接下來我們就來看一下Spring設定檔中是如何來聲明Bean的。

 

(1)、建立Java配置使用的類

首先我們來建立一個類,此處我們命名為JavaConfigBean。然後我們要在Spring的設定檔中將其聲明為Bean。我們可以看出,下方類就是一個普通的Java類,該類中並沒有使用任何的註解進行修飾。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313145216229-1083180332.png" width="576" height="121" style="margin:0px;padding:0px;border:none;" />

 

(2)、在Spring設定檔中聲明Bean

接下來我們將會在Spring的設定檔中使用@Bean註解將上述的JavaConfigBean聲明為Bean對象。下方程式碼片段就是Spring設定檔中的內容,其中的createJavaConfigBean()方法負責產生上述類的對象。其中我們使用@Bean註解聲明該方法,該方法會返回JavaConfigBean類的對象。在使用JavaConfigBean的對象時,會將下方產生的對象注入到相應的點上。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313145459541-56203348.png" width="419" height="152" style="margin:0px;padding:0px;border:none;" />

 

(3)、建立依賴JavaConfigBean的Controller

接下來我們就來建立一個Controller類,在該類中我們來使用JavaConfigBean的對象。下方就是我們建立的ControllerBean的類中的具體內容,其中使用了@Autowired註解來聲明的注入點,如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313145837588-317116139.png" width="510" height="250" style="margin:0px;padding:0px;border:none;" />

 

(4)、建立Main函數以及測試結果

接下來我們就該建立一個Main函數來進行測試了。在Main函數中依然是調用了ControllerBean的相關方法,如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313150240057-158242593.png" width="699" height="391" style="margin:0px;padding:0px;border:none;" />

 

 

 

三、面向切面編程--(Aspect Oriented Programming)

在前段時間發布的部落格中,我們已經使用了ObjC的Runtime來示範了AOP編程的實現原理。在Java中利用了Java的“反射機制”來實現的。其實在運行時,我們通過方法體的交換就可以實現AOP編程。Spring中的AOP編程也不例外,也是通過方法交換來實現的,本篇部落格,我們就來看一下Spring架構中是如何使用AOP編程的。本部分給出了Spring架構中兩種AOP編程的調用方案,一種是基於註解式的攔截方式,另一種是基於方法式的攔截。

下方將會分別給出這兩種AOP編程實現的兩種方式。在基於註解式的攔截方式中,我們需要為切點方法添加註解,而方法式攔截則不需要在切點方法上做任何操作。

 

1、引入Spring的AOP依賴包和AspectJ依賴包

下方的XML內容就是我們要在pom.xml添加的相關依賴配置,下方我們添加了spring-aop以及aspectj的依賴。aspectj也是一個Java的面向切面編程的依賴包。我們要做的東西也依賴於aspectj。具體的依賴包的引入如下所示:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

       <!-- spring aop支援 -->      <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-aop</artifactId>          <version>4.3.6.RELEASE</version>      </dependency>      <!-- aspectj支援 -->      <dependency>          <groupId>org.aspectj</groupId>          <artifactId>aspectjrt</artifactId>          <version>1.8.9</version>      </dependency>

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

 

 

2、基於註解的AOP

接下來我們將實現基於註解式的AOP實現,下方我們將建立AOP使用的註解,切面類、被切面的Controller、Spring設定檔以及測試用的Main函數。下方是基於註解的AOP的具體實現。

(1)、建立AOP使用的註解

首先我們先建立一個註解,該註解會在切入點中進行使用。選擇我們相應的package,然後按右鍵->New->Annotation來建立一個註解。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313160543713-1604847268.png" width="382" height="86" style="margin:0px;padding:0px;border:none;" />

該註解中的內容比較簡單,具體內容如下所示:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

package com.zeluli.aop.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Action {}

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

 

(2)、建立切面切入的Controller

接下來我們就來建立一個切面切入的Controller,此處我們將該類命名為AnnotationController。在該Controller中相應方法上,我們使用上述我們建立的@Action註解來進行聲明,將其聲明為我們切面的切入點。具體如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313161208385-145063336.png" width="509" height="117" style="margin:0px;padding:0px;border:none;" />

 

(3)、編寫切面類

定義好聲明切點的註解@Action以及被切入的Controller後,接下來,我們就該建立切面類了。下方建立的LogAspect類就是用來切入AnnotationController類的切面類。具體內容如下所示。

我們使用@Aspect註解將LogAspect類聲明為切面,然後使用@Component註解將其聲明為組件。之所以將其聲明為組件,是因為我們可以將該切面切入到好多類中。然後我們使用@Pointcut註解來指定切入點,@Pointcut參數就是我們上面建立的註解@Action。也就是說使用@Action修飾的方法就是我們的切入點。使用@Before註解來聲明在切點之前執行的方法,使用@After註解來聲明在切點之後執行的方法。下方就是LogAspect類的具體內容。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170313161839291-2029015270.png" width="761" height="343" style="margin:0px;padding:0px;border:none;" />

 

(4)、建立Spring的設定檔

接著我們要建立配置類,在配置類中我們要開啟AspectJ的自動代理,如下所示。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170314094411385-720177003.png" width="552" height="185" style="margin:0px;padding:0px;border:none;" />

 

(5)、建立Main函數進行測試

接下來,我們就開始測試了。Main方法比較簡單,與上面的Main方法大同小異。主要是調用AnnotationConfigApplicationContext來從設定檔中載入上下文,然後根據上下文擷取AnnotationController的對象,然後調用testMethod()方法,最後將上下文進行關閉即可。

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

public class Main {    public static void main(String[] args) {        AnnotationConfigApplicationContext aopContext = new AnnotationConfigApplicationContext(AopConfig.class);        AnnotationController controller = aopContext.getBean(AnnotationController.class);        controller.testMethod();        aopContext.close();    }}

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

 

下方就是上述Main方法的運行結果,可見,在testMethod()方法調用之前會執行切片的@Before方法,testMethod()方法執行之後會執行@After方法。具體結果如下所示:

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170314095053916-2020784921.png" width="494" height="94" style="margin:0px;padding:0px;border:none;" />

 

3、基於方法的AOP

上面我們聊了基於註解攔截的切面,接下來我們就來看一下基於方法的切面。也就是說在該部分,我們不會建立註解。直接建立LogAspect切面即可。下方這個LogAspect切面就是基於方法的切面。其中在@Before或者@After註解後邊跟著一串字串,該字串就是切入點所在類。如下所示。

  650) this.width=650;" src="http://images2015.cnblogs.com/blog/545446/201703/545446-20170314095556401-1972053678.png" width="730" height="264" style="margin:0px;padding:0px;border:none;" />


JavaEE開發之Spring中的依賴注入與AOP編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.