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]
使用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]
相关文章推荐
- 记录java的学习之路
- Java的堆栈
- Java中关于时间的处理 Date SimpleDateFormat Calendar GegorianCalendar
- Java中快如闪电的线程间通讯
- Java枚举
- eclipse按住ctrl点布局文件只能跳转到R文件
- Ajax访问后台500 (Internal Server Error)问题
- Ajax访问后台500 (Internal Server Error)问题
- java定时器 schedule和scheduleAtFixedRate区别
- JAVA 大数值
- 修改窗体颜色,是的eclipse的背景色改变,保护开发者视力
- Eclipse快捷键10个最有用的快捷键
- eclipse spring4 ehache2.10 整合
- java常用设计模式
- java原理—反射机制
- struts2搭建项目的架包(1)
- 2.4线性表应用:计算任意两个表的简单自然连接-java
- Spring集成缓存
- Spring boot 设置500 404错误的java方法
- Java开源框架集(全)