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 的 main 方法一樣。


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 社群中所有即將舉行的活動。

檢視全部