Spring 2.0中 AOP的编程

来源:互联网 发布:zabbix监控windows 编辑:程序博客网 时间:2024/06/11 21:52

Spring 2.0中 AOP的编程

 
Spring 2.0 AOP的编程:
方式一:
publicclass User {
    publicvoid method() {
        System.out.println("in method1");
    }
}
publicclass LogBean {
    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("before invoke method:"
                     + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        System.out.println("after invoke method:"
                     + joinPoint.getSignature().getName());
        return object;
    }
 
}
采用在xml配置aop:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注意上面的四个地址用空格分开 -->
<aop:config>
       <!-- expression 表示要执行的匹配表达式,这里匹配所有的public方法,但是去除logger类的所有方法,防止无限调用-->
 
       <aop:pointcut id="loggableCalls"
           expression="execution(public * *(..)) "/>
 
 
       <aop:aspect id="logAspect" ref="logBean">
           <aop:around pointcut-ref="loggableCalls"
              method="aroundLogCalls" />
       </aop:aspect>
 
    </aop:config>
    <bean id="logBean" class="LogBean" />
    <bean id="user" class="User" />
方式二:
采用标注:
@Aspect
publicclass LogAspect {
 
    @Pointcut("execution(public * *(..))")
    publicvoid publicMethods() {
    }
    @Around("publicMethods()")
    public Object aroundLogCalls(ProceedingJoinPoint joinPoint)
           throws Throwable {
       System.out.println("before invoke method:"
              + joinPoint.getSignature().getName());
       Object object = joinPoint.proceed();
       System.out.println("after invoke method:"
              + joinPoint.getSignature().getName());
       return object;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注意上面的四个地址用空格分开 -->
 
    <aop:aspectj-autoproxy />
 
    <!-- 或者使用以下定义
             
       <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
      
    -->
    <bean id="logAspect" class="LogAspect" />
    <bean id="user" class="User" />
 
</beans>
这样配置文件就就只有一个<aop:aspectj-autoproxy />很简单。
出现的问题解决:
问题1Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.springframework.util.ClassUtils.<clinit>(ClassUtils.java:67)   at org.springframework.core.io.DefaultResourceLoader.<init>(DefaultResourceLoader.java:52) at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:184) at org.springframework.context.support.AbstractRefreshableApplicationContext.<init>(AbstractRefreshableApplicationContext.java:80) at org.springframework.context.support.AbstractXmlApplicationContext.<init>(AbstractXmlApplicationContext.java:58)   at
需要加上:commons-logging.jar log4j-1.2.11.jar
 
问题2Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [text.xml]; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at java.lang.Class.forName0(Native Method)
 
需要加上:aspectjweaver.jar
 
问题3Exception in thread "main" org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'logBean' defined in class path resource[text.xml]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
需要加上:cglib-2.1.3.jar
 
 
问题4xception in thread "main" org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'logBean' defined in class path resource[text.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:180)
需要加上:asm.jar