2007 年 6 月 13 日 NL-JUG 會議上演示的原始碼

工程 | Alef Arendsen | 2007 年 6 月 14 日 | ...

昨天,Joris和我一起在荷蘭Java使用者組做了一次技術分享。我們總共做了兩次分享,總共有大約250人參加。很多人詢問了我們在分享中演示的程式碼。附件中是AOP和依賴注入演示的程式碼。它展示了一個簡單的切面,在每次JDBC操作之前重新整理Hibernate會話(在生產程式碼中可能不夠健壯,但這是一個開始),並且還展示了CarPlant系統(之前在其他分享中演示過,並且之前也附加到過另一篇博文)如何使用Spring 2.1的各種方式進行依賴注入(例如,使用<bean>、@Bean和@Autowired)。

這是一個Maven2專案,所以你需要安裝Maven2。要準備一個包含所有庫的Eclipse專案,請在carplant目錄的命令列中執行mvn eclipse:eclipse。

原始碼:carplant.zip

在分享期間,有人提出了一個關於在一個應用程式上下文中存在多個<aop:config>塊的問題。聽眾中的那位朋友不確定是兩個或多個AOP配置塊是否會產生預期的結果(即被建議兩次)。我沒有他的電子郵件地址,所以我想在這裡稍作澄清。考慮以下程式碼。doIt()將被攔截。實際的攔截(為了簡單起見)保留在同一類中,就像引導ApplicationContext的主方法一樣。


public class Logger {

  public void doIt() {

  }

  public void log() {
    System.out.println("Log!");
  }

  public static void main(String args[]) {
    ApplicationContext context = 
      new ClassPathXmlApplicationContext(
        new String[] {"com/carplant/context1.xml", "com/carplant/context2.xml"});

    Logger logger = (Logger)context.getBean("logger");

    logger.doIt();
  }
}

配置 1:一個簡單的AOP配置塊

在這種情況下,context2.xml檔案是空的,而context1.xml包含以下程式碼:

<bean id="logger" class="Logger"/>

<aop:config>
	<aop:pointcut id="doItOperation" expression="execution(* doIt(..))"/>
	<aop:aspect ref="logger">
		<aop:before pointcut-ref="doItOperation" method="log"/>
	</aop:aspect>
</aop:config>

正如預期的那樣,在呼叫doIt()方法時,我們只會從日誌記錄器中得到一行輸出(它只被攔截了一次)。

配置 2:兩個不同檔案中的兩個AOP配置塊

context2.xml現在與上面例子中的context1.xml相同,唯一的區別是在context2.xml中我們沒有一個名為logger的bean。執行此場景時,我們將看到兩條Log!輸出條目。doIt()方法被攔截了兩次。

配置 3:同一個配置檔案中的兩個AOP配置塊

context2.xml再次為空。另一方面,context1.xml現在包含兩個<aop:config>塊。兩者之間的唯一區別是切入點識別符號(這是一個XML ID,因此在XML檔案中應該是唯一的)。

<bean id="logger" class="Logger"/>

<aop:config>
	<aop:pointcut id="doItOperation" expression="execution(* doIt(..))"/>
	<aop:aspect ref="logger">
		<aop:before pointcut-ref="doItOperation" method="log"/>
	</aop:aspect>
</aop:config>

<aop:config>
	<aop:pointcut id="doItOperation2" expression="execution(* doIt(..))"/>
	<aop:aspect ref="logger">
		<aop:before pointcut-ref="doItOperation2" method="log"/>
	</aop:aspect>
</aop:config>

執行此程式碼也會顯示該bean將被攔截兩次。

請注意,我在這裡使用的是2.1的里程碑版本。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有