第一,注解:
@Before – 目标方法执行前执行
@After – 目标方法执行后执行
@AfterReturning – 目标方法返回后执行,如果发生异常不执行
@AfterThrowing – 异常时执行
@Around – 在执行上面其他操作的同时也执行这个方法
第二,SpringMVC如果要使用AOP注解,必须将放在spring-servlet.xml(配置MVC的XML)中
<
aop:aspectj-autoproxy
proxy-target-class
=
"true"
/>
|
项目截图
首先是Maven依赖
<
properties
>
<
springframework
>4.0.5.RELEASE
|
spring-context.xml配置,基本无内容
<
context:component-scan
base-package
=
"org.xdemo.example.springaop"
>
<
context:exclude-filter
type
=
"annotation"
expression
=
"org.springframework.stereotype.Controller"
/>
|
spring-mvc.xml配置
<
aop:aspectj-autoproxy
proxy-target-class
=
"true"
/>
<
mvc:annotation-driven
/>
<
context:component-scan
base-package
=
"org.xdemo.example.springaop"
>
<
context:include-filter
type
=
"annotation"
expression
=
"org.springframework.stereotype.Controller"
/>
|
Web.xml配置
|
注解Log
package
org.xdemo.example.springaop.annotation;
import
java.lang.annotation.ElementType;
import
java.lang.annotation.Retention;
import
java.lang.annotation.RetentionPolicy;
import
java.lang.annotation.Target;
@Retention
(RetentionPolicy.RUNTIME)
@Target
({ ElementType.METHOD })
public
@interface
Log {
String name()
default
""
;
}
|
日志AOP,写法一LogAop_1
package
org.xdemo.example.springaop.aop;
import
java.lang.reflect.Method;
import
java.util.UUID;
import
org.aspectj.lang.JoinPoint;
import
org.aspectj.lang.ProceedingJoinPoint;
import
org.aspectj.lang.annotation.After;
import
org.aspectj.lang.annotation.Around;
import
org.aspectj.lang.annotation.Aspect;
import
org.aspectj.lang.annotation.Before;
import
org.aspectj.lang.reflect.MethodSignature;
import
org.springframework.stereotype.Component;
import
org.xdemo.example.springaop.annotation.Log;
@Aspect
@Component
public
class
LogAop_1 {
ThreadLocal
new
ThreadLocal
ThreadLocal
new
ThreadLocal
/**
* 在所有标注@Log的地方切入
* @param joinPoint
*/
@Before
(
"@annotation(org.xdemo.example.springaop.annotation.Log)"
)
public
void
beforeExec(JoinPoint joinPoint){
time.set(System.currentTimeMillis());
tag.set(UUID.randomUUID().toString());
info(joinPoint);
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
System.out.println(method.getAnnotation(Log.
class
).name()+
"标记"
+tag.get());
}
@After
(
"@annotation(org.xdemo.example.springaop.annotation.Log)"
)
public
void
afterExec(JoinPoint joinPoint){
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
System.out.println(
"标记为"
+tag.get()+
"的方法"
+method.getName()+
"运行消耗"
+(System.currentTimeMillis()-time.get())+
"ms"
);
}
@Around
(
"@annotation(org.xdemo.example.springaop.annotation.Log)"
)
public
void
aroundExec(ProceedingJoinPoint pjp)
throws
Throwable{
System.out.println(
"我是Around,来打酱油的"
);
pjp.proceed();
}
private
void
info(JoinPoint joinPoint){
System.out.println(
"--------------------------------------------------"
);
System.out.println(
"King:\t"
+joinPoint.getKind());
System.out.println(
"Target:\t"
+joinPoint.getTarget().toString());
Object[] os=joinPoint.getArgs();
System.out.println(
"Args:"
);
for
(
int
i=
0
;i
|
日志AOP,写法二LogAop_2
package
org.xdemo.example.springaop.aop;
import
java.lang.reflect.Method;
import
java.util.UUID;
import
org.aspectj.lang.JoinPoint;
import
org.aspectj.lang.ProceedingJoinPoint;
import
org.aspectj.lang.annotation.After;
import
org.aspectj.lang.annotation.Around;
import
org.aspectj.lang.annotation.Aspect;
import
org.aspectj.lang.annotation.Before;
import
org.aspectj.lang.annotation.Pointcut;
import
org.aspectj.lang.reflect.MethodSignature;
import
org.springframework.stereotype.Component;
import
org.xdemo.example.springaop.annotation.Log;
@Aspect
@Component
public
class
LogAop_2 {
ThreadLocal
new
ThreadLocal
ThreadLocal
new
ThreadLocal
@Pointcut
(
"@annotation(org.xdemo.example.springaop.annotation.Log)"
)
public
void
log(){
System.out.println(
"我是一个切入点"
);
}
/**
* 在所有标注@Log的地方切入
* @param joinPoint
*/
@Before
(
"log()"
)
public
void
beforeExec(JoinPoint joinPoint){
time.set(System.currentTimeMillis());
tag.set(UUID.randomUUID().toString());
info(joinPoint);
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
System.out.println(method.getAnnotation(Log.
class
).name()+
"标记"
+tag.get());
}
@After
(
"log()"
)
public
void
afterExec(JoinPoint joinPoint){
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
System.out.println(
"标记为"
+tag.get()+
"的方法"
+method.getName()+
"运行消耗"
+(System.currentTimeMillis()-time.get())+
"ms"
);
}
@Around
(
"log()"
)
public
void
aroundExec(ProceedingJoinPoint pjp)
throws
Throwable{
System.out.println(
"我是Around,来打酱油的"
);
pjp.proceed();
}
private
void
info(JoinPoint joinPoint){
System.out.println(
"--------------------------------------------------"
);
System.out.println(
"King:\t"
+joinPoint.getKind());
System.out.println(
"Target:\t"
+joinPoint.getTarget().toString());
Object[] os=joinPoint.getArgs();
System.out.println(
"Args:"
);
for
(
int
i=
0
;i
|
用到的一个用户类User
package
org.xdemo.example.springaop.bean;
public
class
User {
private
String name;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
一个测试的Controller
package
org.xdemo.example.springaop.controller;
import
javax.annotation.Resource;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.ResponseBody;
import
org.xdemo.example.springaop.annotation.Log;
import
org.xdemo.example.springaop.bean.User;
import
org.xdemo.example.springaop.service.IUserService;
@Controller
@RequestMapping
(
"/aop"
)
public
class
SpringController {
@Resource
IUserService userService;
@Log
(name=
"您访问了aop1方法"
)
@ResponseBody
@RequestMapping
(value=
"aop1"
)
public
String aop1(){
return
"AOP"
;
}
@Log
(name=
"您访问了aop2方法"
)
@ResponseBody
@RequestMapping
(value=
"aop2"
)
public
String aop2(String string)
throws
InterruptedException{
Thread.sleep(1000L);
User user=
new
User();
user.setName(string);
userService.save(user);
return
string;
}
}
|
一个测试的接口实现类(接口类略)
package
org.xdemo.example.springaop.service;
import
org.springframework.stereotype.Service;
import
org.xdemo.example.springaop.annotation.Log;
import
org.xdemo.example.springaop.bean.User;
@Service
public
class
UserServiceImpl
implements
IUserService {
@Log
(name =
"您访问了保存用户信息"
)
public
void
save(User user) {
System.out.println(user.getName());
}
}
|