美文网首页
六、AOP实现自动的系统日志功能

六、AOP实现自动的系统日志功能

作者: lifeline张 | 来源:发表于2018-08-28 17:17 被阅读0次

    一、本课目标

    • 掌握SpringAOP的配置

    二、使用SpringAOP实现日志输出

    在下面的这个示例中,通过SpringAOP在业务方法执行前后成功添加了日志功能。


    image.png

    该案例的实现步骤:
    1、在线项目中添加SpringAOP的jar文件
    2、编写前置增强和后置增强实现日志功能
    3、编写Spring配置文件,对业务方法进行增强处理
    4、编写代码获取带有增强处理的业务对象

    2.1示例介绍

    1、前置增强和后置增强的文件:


    image.png

    2、定义切入点:


    image.png
    3、织入增强处理
    织入:在切入点插入增强处理
    image.png

    2.2示例代码

    实体类代码:

    package entity;
    
    /**
     * 用户实体类
     */
    public class User implements java.io.Serializable {
        private Integer id; // 用户ID
        private String username; // 用户名
        private String password; // 密码
        private String email; // 电子邮件
    
        // getter & setter
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
    }
    

    dao层接口:

    package dao;
    
    import entity.User;
    
    /**
     * 增加DAO接口,定义了所需的持久化方法
     */
    public interface UserDao {
        public void save(User user);
    }
    

    dao层实现类

    package dao.impl;
    
    import dao.UserDao;
    import entity.User;
    
    /**
     * 用户DAO类,实现IDao接口,负责User类的持久化操作
     */
    public class UserDaoImpl implements UserDao {
    
        public void save(User user) {
            // 这里并未实现完整的数据库操作,仅为说明问题
            System.out.println("保存用户信息到数据库");
        }
    }
    

    service层接口:

    package service;
    
    import entity.User;
    
    /**
     * 用户业务接口,定义了所需的业务方法
     */
    public interface UserService {
        public void addNewUser(User user);
    }
    

    service层实现类(这个地方采用控制反转的方式注入UserDao对象):

    package service.impl;
    
    import service.UserService;
    import dao.UserDao;
    import entity.User;
    
    /**
     * 用户业务类,实现对User功能的业务管理
     */
    public class UserServiceImpl implements UserService {
    
        // 声明接口类型的引用,和具体实现类解耦合
        private UserDao dao;
    
        // dao 属性的setter访问器,会被Spring调用,实现设值注入
        public void setDao(UserDao dao) {
            this.dao = dao;
        }
    
        public void addNewUser(User user) {
            // 调用用户DAO的方法保存用户信息
            dao.save(user);
        }
    }
    

    日志增强处理类;

    package aop;
    
    import java.util.Arrays;
    
    import org.apache.log4j.Logger;
    import org.aspectj.lang.JoinPoint;
    /**
     * 增强处理类
     * @author Administrator
     *
     */
    public class UserServiceLogger {
        private static Logger log = Logger.getLogger(UserServiceLogger.class);
        
        public void before(JoinPoint jp) {
            log.info("调用" + jp.getTarget() + "的" + 
                    jp.getSignature() + "方法,方法参数" +
                    Arrays.toString(jp.getArgs()));
        }
    
        public void afterReturning(JoinPoint jp, Object result) {
            log.info("调用" + jp.getTarget() + "的" + 
                    jp.getSignature() + "方法,方法返回值" +
                    result);
        }
    }
    

    编写配置文件:
    配置文件的表头的找法跟之前的控制反转的表头的找法相同:在解压下载下来的spring包中——docs——spring-framework-reference——htmlsingle——用谷歌打开index.html——使用ctrl+f查找“spring-aop”,复制找到的xml文件的头信息即可。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:aop="http://www.springframework.org/schema/aop"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/aop
             http://www.springframework.org/schema/aop/spring-aop.xsd">
        <bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
        <bean id="userService" class="service.impl.UserServiceImpl">
            <property name="dao" ref="userDao"></property>
        </bean>
        
        <!-- 声明增强处理类的bean元素 -->
        <bean id="theLogger" class="aop.UserServiceLogger"></bean>
        
        <aop:config>
            <!-- 定义切入点 -->
            <aop:pointcut id="pointCut" expression="execution(public void addNewUser(entity.User))"/>
            <!-- 织入增强处理 -->
            <aop:aspect ref="theLogger">
                <!-- 前置增强,引入切入点 -->
                <aop:before method="before" pointcut-ref="pointCut"/>
                <!-- 后置增强,引入切入点 ,注入目标方法的返回值result-->
                <aop:after-returning method="afterReturning" pointcut-ref="pointCut" returning="result"/>
            </aop:aspect>
        </aop:config>
    
    </beans>
    

    单元测试代码:

    package test;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import entity.User;
    
    import service.UserService;
    
    public class AopTest {
    
        @Test
        public void test() {
            ApplicationContext context = 
                    new ClassPathXmlApplicationContext("ApplicationContext.xml");
            UserService userService = (UserService) context.getBean("userService");
            User user = new User();
            user.setId(1);
            user.setUsername("test");
            user.setPassword("123456");
            user.setEmail("test.@163.com");
            userService.addNewUser(user);
        }
    
    }
    

    三、小结

    image.png

    相关文章

      网友评论

          本文标题:六、AOP实现自动的系统日志功能

          本文链接:https://www.haomeiwen.com/subject/hcyqwftx.html