Spring 3.0 实现IoC和AOP的入门程序
终于开始写博客啦,坚持原创!
话说这个程序折腾了我一个上午,我比较完美主义,所以要求程序达到最简洁,lib中的jar包数量最少,所以开始的时候有各别包没有导入,导致很奇怪的错误,结果浪费时间。后来一生气把所有的包都放进去,结果没有错误了,然后又一个包一个包的删除看看能不能运行,最终得到了最少的包列表,哈哈哈。
首先,最简洁包列表,共11个包,spring自带包6个和外部下载包5个:
?
其中使用的是spring 3.0.5,后面的六个包都是spring自带的包,其他包需要另外下载,都保持了最新版,并附上下载地址(都是官方下载哦):
?
?
ASM: http://forge.ow2.org/projects/asm/
Aopalliance: http://sourceforge.net/projects/aopalliance/files/aopalliance/
Cglib: http://sourceforge.net/projects/cglib/files/
Common-logging: http://commons.apache.org/logging/download_logging.cgi
Aspectj: http://www.eclipse.org/aspectj/downloads.php
?
然后,文件结构:
?
?
其中aspect类为切面方法,operation类为业务方法,main类为测试方法
?
下面是代码:operation类业务方法
?
?
package com.iteye.twincle.springAOPDemo.main;public class DisplayOperation {public void display() {System.out.println("Test Class DisplayOperation method display execute...");}}
?
aspect类切面方法,其中定义了一个logCalls()方法用于定义切入点,这样以后修改切入点的表达式只需要一次就可以了。aroundLogCalls方法中,使用joinPoint获取切入点上所执行方法的类路径和方法名,并输出
?
?
package com.iteye.twincle.springAOPDemo.main;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.annotation.Around;@Aspectpublic class LogAspect {@Pointcut("execution(* com.iteye.twincle.springAOPDemo.main.DisplayOperation.*(..))")public void logCalls() {}@Around("logCalls()")public void aroundLogCalls(ProceedingJoinPoint joinPoint)throws Throwable {String methodName = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() + "();";System.out.println("Before method runs: " + methodName);joinPoint.proceed();System.out.println("After method runs: " + methodName);}}
?
main类测试方法,可以发现,main中完全没有涉及到任何关于log的代码,只是很普通很简单的调用业务逻辑方法
?
?
package com.iteye.twincle.springAOPDemo.main;import org.springframework.context.support.ClassPathXmlApplicationContext;public class DisplayMain {public static void main(String[] args) {ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");DisplayOperation displayOperation = (DisplayOperation)factory.getBean("displayOperation");displayOperation.display();}}
?
运行结果如下:
?
2011-4-12 12:46:17 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@133f1d7: startup date [Tue Apr 12 12:46:17 CST 2011]; root of context hierarchy2011-4-12 12:46:17 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [applicationContext.xml]2011-4-12 12:46:17 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@fec107: defining beans [org.springframework.aop.config.internalAutoProxyCreator,displayOperation,logAspect]; root of factory hierarchyBefore method runs: com.iteye.twincle.springAOPDemo.main.DisplayOperation.display();Test Class DisplayOperation method display execute...After method runs: com.iteye.twincle.springAOPDemo.main.DisplayOperation.display();?
?
?
最后源代码下载,导入eclipse应该就可以直接运行了