您的位置:首页 > 编程语言 > Java开发

spring AOP 注解

2015-11-09 15:55 399 查看

使用Spring AOP 的@AspectJ记录日志

Spring AOP中的三个概念

advice,向程序内部注入的代码
pointcut,注入advice的位置,切入点
advisor,将advice注入预定位置的代码

@AspectJ是基于注解的,所以需要JDK5.0以上的支持

一、最简单的打印一些东西出来

步骤:

创建一个Aspect类
配置Spring的配置文件

Aspect类中内容如下:

[align=left]package com.demo.aop.log;[/align]

[align=left]import org.aspectj.lang.annotation.After;[/align]
[align=left]import org.aspectj.lang.annotation.Aspect;[/align]
[align=left]import org.aspectj.lang.annotation.Before;[/align]
[align=left]import org.springframework.stereotype.Component;[/align]

[align=left]@Component[/align]
[align=left]@Aspect[/align]
public class LogAspect
{
[align=left] [/align]
@Before(value
= "execution(public * com.demo.service..*.*(..))" )
public void beforeShow()
{
System. out.println("before
show." );
[align=left] }[/align]
[align=left] [/align]
@After(value
= "execution(public * com.demo.service..*.*(..))" )
public void afterShow()
{
System. out.println("after
show." );
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]

[align=left]解释:[/align]
[align=left] 在LogAspect的类声明上加上@Aspect注解[/align]
[align=left] 在LogAspect类中的方法上加上@Before注解,[/align]
(value = "execution(public
* com.demo.service..*.*(..))" )
[align=left] 上面括号指定了所监视的类中的方法,上面代码中监视了com.demo.service包中的所有类的所有方法[/align]

[align=left]application.xml中内容如下:[/align]

[align=left]<?xml version="1.0" encoding= "UTF-8"?>[/align]
[align=left]<beans xmlns="http://www.springframework.org/schema/beans"[/align]
[align=left] xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"[/align]
[align=left] xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"[/align]
[align=left] xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"[/align]
[align=left] xsi:schemaLocation="http://www.springframework.org/schema/aop[/align]
[align=left] http://www.springframework.org/schema/aop/spring-aop-3.0.xsd[/align] [align=left] http://www.springframework.org/schema/beans[/align] [align=left] http://www.springframework.org/schema/beans/spring-beans-3.0.xsd[/align] [align=left] http://www.springframework.org/schema/context[/align] [align=left] http://www.springframework.org/schema/context/spring-context-3.0.xsd[/align] [align=left] http://www.springframework.org/schema/mvc[/align] [align=left] http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd[/align] [align=left] http://www.springframework.org/schema/tx[/align] [align=left] http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" >[/align]
[align=left] [/align]
[align=left] <aop:aspectj-autoproxy />[/align]
[align=left] <bean class="com.demo.aop.log.LogAspect" />[/align]
[align=left] [/align]
[align=left]</beans>[/align]

[align=left]解释:[/align]
<bean
/> 节点指定了LogAspect.java的路径

二、将Pointcut和Advice分开,并将方法名和参数打印出来

步骤:

创建Pointcut
创建Advice
配置Spring的配置文件

LogPointcut.java中内容如下:

[align=left]package com.demo.aop.log;[/align]

[align=left]import org.aspectj.lang.annotation.Aspect;[/align]
[align=left]import org.aspectj.lang.annotation.Pointcut;[/align]

[align=left]@Aspect[/align]
[align=left]public class LogPointcut {[/align]
[align=left] [/align]
@Pointcut("execution(*
com.demo.service..*.*(..))" )
public void inServiceLayer()
{ }
[align=left] [/align]
[align=left]}[/align]

[align=left]解释:[/align]
[align=left] 加上@Aspect注解[/align]
[align=left] @Pointcut是切入点,指定需要注入代码的位置,如上面代码中指定在com.demo.service包下的所有类的所有方法中[/align]
[align=left] 下面只需要定义一个方法签名[/align]

[align=left]LogAdvice.java中的内容如下:[/align]

[align=left]package com.demo.aop.log;[/align]

[align=left]import org.aspectj.lang.JoinPoint;[/align]
[align=left]import org.aspectj.lang.annotation.After;[/align]
[align=left]import org.aspectj.lang.annotation.Aspect;[/align]
[align=left]import org.aspectj.lang.annotation.Before;[/align]

[align=left]@Aspect[/align]
[align=left]public class LogAdvice {[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 在方法开始前纪录[/align]
[align=left] * @param jp[/align]
[align=left] */[/align]
[align=left] @Before("com.demo.aop.log.LogPointcut.inServiceLayer()" )[/align]
public void logInfo(JoinPoint
jp) {
[align=left] String className = jp.getThis().toString();[/align]
[align=left] String methodName = jp.getSignature().getName(); //获得方法名[/align]
[align=left] System. out.println("=====================================" );[/align]
[align=left] System. out.println("====位于:" +className);[/align]
[align=left] System. out.println("====调用" +methodName+"方法-开始!");[/align]
[align=left] Object[] args = jp.getArgs(); //获得参数列表[/align]
[align=left] if(args.length <=0){[/align]
[align=left] System. out.println("====" +methodName+"方法没有参数");[/align]
[align=left] } else{[/align]
for(int i=0;
i<args.length; i++){
System. out.println("====参数
" +(i+1)+":"+args[i]);
[align=left] }[/align]
[align=left] }[/align]
[align=left] System. out.println("=====================================" );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 在方法结束后纪录[/align]
[align=left] * @param jp[/align]
[align=left] */[/align]
[align=left] @After("com.demo.aop.log.LogPointcut.inServiceLayer()" )[/align]
public void logInfoAfter(JoinPoint
jp) {
[align=left] System. out.println("=====================================" );[/align]
[align=left] System. out.println("====" +jp.getSignature().getName()+"方法-结束!");[/align]
[align=left] System. out.println("=====================================" );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]

解释:
@Before 使用Pointcut中的方法签名找到切入点

[align=left] 记录并打印日志[/align]

[align=left]application.xml配置文件中加入如下配置:[/align]

[align=left] <aop:aspectj-autoproxy />[/align]
[align=left] <bean class="com.demo.aop.log.LogAspect" />[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: