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 社区所有即将举行的活动。

查看所有