Spring 2.0
中
AOP
的编程:
方式一:
public
class
User {
public
void
method () {
System.
out
.println(
"in method1"
);
}
}
public
class
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
public
class
LogAspect {
@Pointcut
(
"execution(public * *(..))"
)
public
void
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
/>
很简单。
出现的问题解决:
问题
1
:
Exception 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
问题
2
:
Exception 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
问题
3
:
Exception 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
问题
4
:
xception 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