领先一步
VMware提供培训和认证,以加速您的进步。
了解更多昨天,我和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();
}
}
<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()方法时,我们只会从日志记录器获得一行输出(它只被建议一次)。
<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里程碑版本。