Spring AOP日志管理

AOP的介绍

AOP(Aspect-OrientedProgramming,面向方面编程)

AOP的几个概念

1.切面(Aspect):切面就是一个关注点的模块化,如事务管理、日志管理、权限管理等;

2.连接点(Joinpoint):程序执行时的某个特定的点,在Spring中就是一个方法的执行;

3.通知(Advice):通知就是在切面的某个连接点上执行的操作,也就是事务管理、日志管理等;

4.切入点(Pointcut):切入点就是描述某一类选定的连接点,也就是指定某一类要织入通知的方法;

5.目标对象(Target):就是被AOP动态代理的目标对象;

这里使用登录功能做日志管理案例

概要

1)LoginService LogService TestMain

2)用Spring 管理 LoginService 和 LogService 的对象

3)确定哪些连接点是切入点,在配置文件中

4)将LogService封装为通知

5)将通知植入到切入

6)客户端调用目标点

Step1 新建登录业务接口以及实现类

package com.aaron.log;
/** 

 * @Author Aaron 

 * @Date创建时间:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description登录业务逻辑

* 

 */ 

public interface ILoginService {
public boolean login(String name, String password);
} 
package com.aaron.log;
/** 

 * @Author Aaron 

 * @Date创建时间:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description登录业务逻辑接口实现类

* 

 */ 

public class LoginServiceImpl implements ILoginService {
public boolean login(String userName, String password) {
 System.out.println("用户登录信息:" + userName + "," + password);
return true;
 }
}

Step2 新建日志管理接口以及实现类

package com.aaron.log;
import org.aspectj.lang.JoinPoint;
/** 

 * @Author Aaron 

 * @Date创建时间:2016-1-13 

 * @Version 1.0  

 * 

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

* @Function_Description日志接口

* 

 */ 

public interface ILogService { 

//无参的日志方法
public void beforeLog(); 

//有参的日志方法
public void Log(JoinPoint point); 

//有参有返回值的方法
public void afterLog(JoinPoint point,Object returnObj); 

} 
package com.aaron.log;
import org.aspectj.lang.JoinPoint;
/** 

 * @Author Aaron 

 * @Date创建时间:2016-1-13 

 * @Version 1.0 

 *  

 * @Project_Package_Description SpringQuartzDemo || com.aaron.log 

 * @Function_Description记录日志接口实现类

*  

 */ 

public class LogServiceImpl implements ILogService {
    // 无参方法
    public void beforeLog() {
        System.out.println("*************开始记录日志*******************");
    } 

    // 有参无返回值的方法
    public void Log(JoinPoint point) {
        // 此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();
        System.out.print("目标参数列表:");
        for (Object obj : args) {
            System.out.print(obj + ",");
        }
        System.out.println();
    }  

    // 有参并有返回值的方法

    public void afterLog(JoinPoint point, Object returnObj) {
        // 此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();
        System.out.print("目标参数列表:");
        for (Object obj : args) {
            System.out.print(obj + ",");
        }
        System.out.println();
        System.out.println("执行结果是:" + returnObj);
        System.out.println("*************结束记录日志*******************");
    }
} 

Step3 在applicationContext.xml文件中配置AOP

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

    xmlns:p="http://www.springframework.org/schema/p" 

    xsi:schemaLocation="http://www.springframework.org/schema/beans  

 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 

 http://www.springframework.org/schema/aop  

 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 

    <!-- 启动触发器的配置开始 --> 

    <bean name="startQuertz" lazy-init="false" autowire="no" 

        class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 

        <property name="triggers"> 

            <list> 

                <ref bean="myJobTrigger" /> 

            </list> 

        </property> 

    </bean> 

    <!-- 启动触发器的配置结束 --> 

    <!-- 调度的配置开始 --> 

    <!-- quartz-1.8以前的配置 <bean id="myJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  

        <property name="jobDetail"> <ref bean="myJobDetail" /> </property> <property  

        name="cronExpression"> <value>0/1 * * * * ?</value> </property> </bean> --> 

    <!-- quartz-2.x的配置 --> 

    <bean id="myJobTrigger" 

        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 

        <property name="jobDetail"> 

            <ref bean="myJobDetail" /> 

        </property> 

        <property name="cronExpression"> 

            <value>0 0/1 * * * ?</value> 

        </property> 

    </bean> 

    <!-- 调度的配置结束 --> 

    <!-- job的配置开始 --> 

    <bean id="myJobDetail" 

        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 

        <property name="targetObject"> 

            <ref bean="myJob" /> 

        </property> 

        <property name="targetMethod"> 

            <value>work</value> 

        </property> 

    </bean> 

    <!-- job的配置结束 --> 

    <!-- 工作的bean --> 

    <bean id="myJob" class="com.tgb.lk.demo.quartz.MyJob" /> 

    <bean id="logService" class="com.aaron.log.LogServiceImpl"></bean> 

    <bean id="loginService" class="com.aaron.log.LoginServiceImpl"></bean> 

    <aop:config> 

        <!-- 切入点 --> 

        <aop:pointcut expression="execution(* com.aaron.log.LoginServiceImpl.*(..))" 

            id="myPointcut" /> 

        <!-- 切面:将哪个对象中的哪个方法,织入到哪个切入点 -->

        <aop:aspect id="dd" ref="logService"> 

            <!-- 前置通知 --> 

            <aop:before method="beforeLog" pointcut-ref="myPointcut" /> 

            <aop:after method="Log" pointcut-ref="myPointcut"/> 

            <aop:after-returning method="afterLog" returning="returnObj" pointcut-ref="myPointcut" /> 

        </aop:aspect> 

    </aop:config> 

</beans> 

applicationContext.xml

Step4 测试方法

package com.aaron.log;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**

* @Author Aaron

* @Date 创建时间:2016-1-13

* @Version 1.0

*

* @Project_Package_Description SpringQuartzDemo || com.aaron.log

* @Function_Description 测试

*

*/

public class TestMain {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:config/spring/applicationContext.xml");
        ILoginService loginService = (ILoginService) ctx.getBean("loginService");
        loginService.login("aaron", "123456");
    }
}

Step5 运行,看后台

PS:使用注解可以参考别人写的这篇博客 http://blog.csdn.net/oathevil/article/details/7288867

时间: 2024-11-08 19:24:50

Spring AOP日志管理的相关文章

spring aop 日志 注解

前提:接上篇:spring aop 日志 一:无新增依赖包 二:修改切面类(aop.Log4jHandlerAOP.java) 三:修改applicationContext.xml 1:扫描注入容器新增aop(base-package="dao,service,aop") 2:支持AOP注解(<aop:aspectj-autoproxy/>) 3:去除传统AOP的配置以及切面类的注入 ps: 1:applicationContext.xml <?xml version

Spring Boot 日志管理

Spring Boot 日志管理 网址 Spring Boot 日志管理 http://blog.didispace.com/springbootlog/ Spring Boot快速入门(四)--日志系统 https://leibnizhu.gitlab.io/2016/11/26/Spring-Boot%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%EF%BC%88%E5%9B%9B%EF%BC%89%E2%80%94%E2%80%94%E6%97%A5%E5%BF%

SpringBoot整合aop日志管理

1. 开发前准备 1.1 前置知识 java基础自定义注解.反射 Spring aop SpringBoot简单基础知识即可 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lombok.mybatisplus.Spring aop SpringBoot版本:2.1.4 1.3 涉及知识点 自定义注解. 反射 spring aop 环绕通知 2. aop日志实现 AOP(Aspect Oriented Programming)是一个大话题,这

四、spring boot 日志管理

spring boot日志默认采用logback进行输出,你可以对logback进行定制化,方法如下: 在resources文件夹下建立logback.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- base.xml in the spring-boot jar, --> <include resource="org/sprin

Spring的日志管理

一.spring的日志依赖 Logging是spring中唯一强制的外部依赖,spring中默认使用的日志是commons-logging,简称JCL,这里说的强制性,是因为在spring-core这个模块中引入了该依赖.不过,引入了该依赖,也无需做任何其他的配置,它是日志门面,它内部会有自己的算法去找日志门面的实现类,比如log4j,如果说没有引入其他日志依赖,它默认就会去找JDK自带的java.util.logging简称jul作为其日志实现类,所以说用起来还是赏心悦目的! 二.使用log4

spring boot aop日志管理(MongoDB)

aop拦截的是controller层请求,正常的请求用@Before来拦截, 异常的请求用@AfterThrowing来拦截 1.引用aop jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.0.3.RELEASE</version>

Spring Boot日志管理

Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 格式化日志 默认的日志输出如下: 1 2016-04-13 08:23:50.120 INFO 37397 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {4.3

Spring Aop 日志拦截应用

近期,一个小伙伴遇到了此需求.要解决的问题就是: 记录用户在系统的操作,通过注解来灵活控制.  注解可以对方法进行修饰,描述.  后面会将注解上描述以及方法被调用时入参记录到数据库. 同时还需要对不同的操作进行分类(插入,修改,查看,下载/上传文件之类的),记录用户,时间以及IP,客户端User-agent . 我在这里将部分实现写了出来,实际在项目中可以直接参照进行修改就可以满足以上功能. 开发环境:W7 + Tomcat7 + jdk1.7 + Mysql5 框架:spring,spring

spring aop 日志

前提:已经部署spring(接上篇:spring 注解 容器的注入注出) 一:新增依赖包 1:log4j-1.2.9.jar(日志包) 2:spring-aspects-4.1.6.RELEASE.jar(spring包中存在) 3:aopalliance-1.0.jar(不在spring包中) 4:aspectjweaver-1.7.3.jar(不在spring包中) 二:新增切面类(aop.Log4jHandlerAOP) 三:新增log4j.properties(放入scr目录下) 四:修