SpringAop日志管理

Spring AOP 

 

1.对AOP的理解 ——  分工来做各个部分,运行时候整合的思想

2.理解 面向过程,面向对象,面向切面 的思想

1)面向过程:房间装修时,准备装一个灯,就拉一根电线,连接灯。

2)面向对象:设计房间中哪些位置需要使用电线接口,然后在相应的位置设置电线接口,以备以后使用。

3)面向切面:装修房子,先设计需要在哪些地方装上电线接口,就将电线接口先设置好并且不打开接口,此处即为连接点,当此处电线切口确实需要使用时将接口打开插电器即为切入点。

方面:功能(登陆 日志)

目标:主要方面(登陆)

切面:切入点 植入 通知的综合体

连接点:可以插入副功能(日志)的地方

切入点:准备插入副功能的地方

通知:对副功能的封装对象

植入:将通知插入切入点

3.实现登陆和日志管理(使用Spring AOP)

1)LoginService   LogService   TestMain

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

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

4)将LogService封装为通知

5)将通知植入到切入点

6)客户端调用目标

  1. <aop:config>
  2. <aop:pointcut expression="execution(* cn.com.spring.service.impl.*.*(..))" id="myPointcut"/>
  3. <!--将哪个-->
  4. <aop:aspect id="dd" ref="logService">
  5. <aop:before method="log" pointcut-ref="myPointcut"/>
  6. </aop:aspect>
  7. </aop:config>

execution(* * cn.com.spring.service.impl.*.*(..))

1)* 所有的修饰符

2)* 所有的返回类型

3)* 所有的类名

4)* 所有的方法名

5)* ..所有的参数名

1.ILoginService.java

  1. package cn.com.spring.service;
  2. public interface ILoginService {
  3. public boolean login(String userName, String password);
  4. }

2.LoginServiceImpl.java

  1. package cn.com.spring.service.impl;
  2. import cn.com.spring.service.ILoginService;
  3. public class LoginServiceImpl implements ILoginService {
  4. public boolean login(String userName, String password) {
  5. System.out.println("login:" + userName + "," + password);
  6. return true;
  7. }
  8. }

3.ILogService.java

  1. package cn.com.spring.service;
  2. import org.aspectj.lang.JoinPoint;
  3. public interface ILogService {
  4. //无参的日志方法
  5. public void log();
  6. //有参的日志方法
  7. public void logArg(JoinPoint point);
  8. //有参有返回值的方法
  9. public void logArgAndReturn(JoinPoint point,Object returnObj);
  10. }

4.LogServiceImpl.java

  1. package cn.com.spring.service.impl;
  2. import org.aspectj.lang.JoinPoint;
  3. import cn.com.spring.service.ILogService;
  4. public class LogServiceImpl implements ILogService {
  5. @Override
  6. public void log() {
  7. System.out.println("*************Log*******************");
  8. }
  9. //有参无返回值的方法
  10. public void logArg(JoinPoint point) {
  11. //此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
  12. Object[] args = point.getArgs();
  13. System.out.println("目标参数列表:");
  14. if (args != null) {
  15. for (Object obj : args) {
  16. System.out.println(obj + ",");
  17. }
  18. System.out.println();
  19. }
  20. }
  21. //有参并有返回值的方法
  22. public void logArgAndReturn(JoinPoint point, Object returnObj) {
  23. //此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
  24. Object[] args = point.getArgs();
  25. System.out.println("目标参数列表:");
  26. if (args != null) {
  27. for (Object obj : args) {
  28. System.out.println(obj + ",");
  29. }
  30. System.out.println();
  31. System.out.println("执行结果是:" + returnObj);
  32. }
  33. }
  34. }

5.applicationContext.java

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/aop
  8. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  9. <bean id="logService" class="cn.com.spring.service.impl.LogServiceImpl"></bean>
  10. <bean id="loginService" class="cn.com.spring.service.impl.LoginServiceImpl"></bean>
  11. <aop:config>
  12. <!-- 切入点 -->
  13. <aop:pointcut
  14. expression="execution(* cn.com.spring.service.impl.LoginServiceImpl.*(..))"
  15. id="myPointcut" />
  16. <!-- 切面: 将哪个对象中的哪个方法,织入到哪个切入点 -->
  17. <aop:aspect id="dd" ref="logService">
  18. <!-- 前置通知
  19. <aop:before method="log" pointcut-ref="myPointcut" />
  20. <aop:after method="logArg" pointcut-ref="myPointcut">
  21. -->
  22. <aop:after-returning method="logArgAndReturn" returning="returnObj" pointcut-ref="myPointcut"/>
  23. </aop:aspect>
  24. </aop:config>
  25. </beans>

6.TestMain.java

  1. public class TestMain {
  2. public static void testSpringAOP(){
  3. ApplicationContext ctx = new ClassPathXmlApplicationContext("app*.xml");
  4. ILoginService loginService = (ILoginService)ctx.getBean("loginService");
  5. loginService.login("zhangsan", "12344");
  6. }
  7. public static void main(String[] args) {
  8. testSpringAOP();
  9. }
  10. }

7.输出结果:

  1. login:zhangsan,12344
  2. 目标参数列表:
  3. zhangsan,
  4. 12344,
  5. 执行结果是:true

解析:1.先调用了login()方法System.out.println("login:" + userName + "," + password);

2.再调用了logArgAndReturn()方法输出了日志,并且返回了login()方法是否成功

  1. System.out.println("目标参数列表:");
  2. if (args != null) {
  3. for (Object obj : args) {
  4. System.out.println(obj + ",");
  5. }
  6. System.out.println();
  7. System.out.println("执行结果是:" + returnObj);
  8. }
时间: 2024-11-03 20:46:26

SpringAop日志管理的相关文章

SpringAop进行日志管理。

在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用.然后进行日志记录.使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志.但是实现起来有点麻烦. 另外一种就是使用Spring的AOP了.这种方式实现起来非常简单,只要配置一下配置文件就可以了.可是这种方式会拦截下所有的对action的每个操作.使得效率比较低.不过想做详细日志

SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)

首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题.这个时候就马上打开CRT或者SSH连上服务器拿日子来分析.受网络的各种限制.于是我们就想为什么不能直接在管理后台查看报错的信息呢.于是日志管理就出现了. 其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器.都可以,在此我重点介绍我的实现方式. Aop有的人说拦截不到Controller.有的人说想拦AnnotationMethodHandlerAdapter截到Controller必须得拦截org.sprin

slf4j+logback搭建超实用的日志管理模块

文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们非常有必要记录下发生在服务器上的活动,这些日志将用于debug.统计等各种用途. slf4j+logback这种实现方式是很常见的,好处自然是方便!.在这篇文章中,你将看到如何使用logback搭建你自己的日志组件并将日志输出到文件.如何查看这些文件.如何为每个线程上的访问分配独有的一个日志id.

linux 学习 14 日志管理

第十四讲 日志管理 14.1 日志管理-简介 1.日志服务 ?在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其实都是和syslogd服务相兼容的,所以学习起来基本和syslogd服务一致. ?rsyslogd的新特点: ?基于TCP网络协议传输日志信息; ?更安全的网络传输方式: ?有日志消息的及时分析框架: ?后台数据库: ?配置文件中可以写简单的逻辑判断: ?与sysl

MySQl Study学习之--MySQl二进制日志管理

MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log):   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库(DML)的语句的执行时间信息    不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新    用于在主复制服务器上记录所有将发送

ABP日志管理

ABP日志管理 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由东莞-天道提供翻译 Server side(服务器端) ASP.NET Boilerplate使用Castl

java程序日志管理

初入软件开发这一行的人,可能对日志管理的概念并不是很明确,大概是由于经验所限,以至于根本还考虑不到这个问题. 而从某种意义上来说,日志管理实际上也不需要初入这一行的人来管,他们只需要负责实现自己的主要业务逻辑和功能就好了. 我当初刚入行的时候就有很长一段时间完全不用去关心日志,到后来偶尔涉及到的时候,也都是从其他地方采用cv大法直接搬用. 不过,随着工作时间的变化,随着手头上任务重要程度的变化,也随着接触到的项目数量的变化,让我越来越意识到日志的重要性,它在整个系统中发挥着至关重要的作用! 尤其

Linux的日志管理

Linux日志的管理 日志:记录了你几乎所有的操作记录,用于系统的审核,故障的排除.日志文件永久存放在日志目录中,系统日志保存在/var/log中 rsyslog 按照日志类型分类,把所有日志记录到/var/log目录下. /var/log/messages是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵. /var/log/secure 与安全相关的日志. /var/log/cron 与计划任务相关的日志. /var/log/boot.log与系统启动的相关日志,只保留本次系

Nginx日志管理和切割

一.日志分类 Nginx日志主要分为两种,访问日志和错误日志.两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式通过log_format命令来定义 1.访问日志 访问日志主要记录客户端访问Nginx的每一个请求 log_format用来设置日志格式,只能在http模块下设置 log_format name   name(格式名称)   type(格式样式) 下面是默认的nginx日志格式: log_format