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

查看全部