Spring boot aop切面(6)

来源:互联网 发布:常见端口列表 编辑:程序博客网 时间:2024/06/07 00:24

SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍;


AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器;


@Aspect注解是切面注解类


@Pointcut切点定义


@Before是方法执行前调用


@After是方法执行后调用


@AfterReturning方法执行返回值调用


Service层本身就可以切入事务,所以我们这类搞个常用的 切controller层方法

每个执行controller层的方法 都记录下请求Url,访问者IP 执行类方法参数等信息;

       1、@Service用于标注业务层组件 
       2、@Controller用于标注控制层组件(如struts中的action) 
       3、@Repository用于标注数据访问组件,即DAO组件. 
       4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注

AspectJ中的切入点匹配的执行点称作连接的(Join Point),在通知方法中可以声明一个JoinPoint类型的参数。通过JoinPoint可以访问连接点的细节。下面简要介绍JponPoint的方法:1.java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 2.Signature getSignature() :获取连接点的方法签名对象; 3.java.lang.Object getTarget() :获取连接点所在的目标对象; 4.java.lang.Object getThis() :获取代理对象本身; ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法: 5.java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法; 6.java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法,不过使用新的参数替换原来的参数。 

RequestContextHolder顾名思义,持有上下文的Request容器

package com.java1234.aspect;import javax.servlet.http.HttpServletRequest;import org.apache.log4j.Logger;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;@Aspect@Componentpublic class RequestAspect {private Logger logger=Logger.getLogger(RequestAspect.class);@Pointcut("execution(public * com.java1234.controller.*.*(..))")public void log() {}@Before("log()")public void deoBefore(JoinPoint joinpoint) {logger.info("方法执行前");ServletRequestAttributes rch=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest p =rch.getRequest();logger.info("URL:"+p.getRequestURI());logger.info("IP:"+p.getRemoteHost());logger.info("method:"+p.getMethod());logger.info("class_method:"+joinpoint.getSignature().getDeclaringTypeName()+"."+joinpoint.getSignature().getName());logger.info("args:"+joinpoint.getArgs());}@After("log()")    public void doAfter(JoinPoint joinPoint){        logger.info("方法执行后...");    }@AfterReturning(returning="result",pointcut="log()")    public void doAfterReturning(Object result){        logger.info("执行返回值:"+result);    }}

2017-11-07 11:42:40.942  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : 方法执行前
2017-11-07 11:42:40.943  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : URL:/aonncunt/sav
2017-11-07 11:42:40.943  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : IP:127.0.0.1
2017-11-07 11:42:40.943  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : method:POST
2017-11-07 11:42:40.944  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : class_method:com.java1234.controller.accountcontroller.addstudent
2017-11-07 11:42:40.944  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : args:[Ljava.lang.Object;@1cb583d
Hibernate: insert into student (age, name) values (?, ?)
2017-11-07 11:42:40.985  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : 方法执行后...
2017-11-07 11:42:40.985  INFO 8384 --- [p-nio-80-exec-2] com.java1234.aspect.RequestAspect        : 执行返回值:添加成功!
2017-11-07 11:43:45.896  INFO 8384 --- [on(2)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
2017-11-07 11:43:45.897  INFO 8384 --- [on(2)-127.0.0.1] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@13d0772: startup date [Tue Nov 07 11:42:15 CST 2017]; root of context hierarchy
2017-11-07 11:43:45.898  INFO 8384 --- [on(2)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2017-11-07 11:43:45.898  INFO 8384 --- [on(2)-127.0.0.1] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'