项目结构:

image.png
Aop:切面类
applicationContext.xml:配置文件
架包:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.3.12</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-aspects</artifactId>
  9. <version>5.3.12</version>
  10. </dependency>
  11. //使用log4j前需先应用此架包
  12. <dependency>
  13. <groupId>log4j</groupId>
  14. <artifactId>log4j</artifactId>
  15. <version>1.2.17</version>
  16. </dependency>

Aop类

package aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author Huang_X 2021/11/5 10:32
 * @version v1.0
 */
@Component
@Aspect//代表这是一个切面类
public class LogAop {
    /*
    * service后面的两个点:表示service包及其下面子包,所以要用两个点
    *  *.* :表示所有类下面的所有方法
    * 总体: service包及其子包下面的所有类的所有方法
    * */
    @Pointcut("execution(* service..*.*(..))")
    public  void pointcut(){}

    //前置增强
    /*jp:连接点我们可以从该对象里面获取目标方法的信息*/
    @Before("pointcut()")
    public void before(JoinPoint jp){
        String name = jp.getSignature().getName();//获取目标方法名
        Object[] args = jp.getArgs();//获取方法参数
        System.out.println("这是前置增强,目标方法是"+name+",参数是:"+ Arrays.toString(args));
    }
    //后置增强
    /*result: 目标方法的返回值
     * 发生移异常不执行*/
    @AfterReturning(pointcut = "pointcut()",returning = "result")
    public void  afterReturing(JoinPoint jp, Object result){
        String name = jp.getSignature().getName();
        System.out.println("这是后置增强,目标方法是"+name+",方法的 返回值是:"+result);
    }
    //最终增强
    /*result: 目标方法的返回值
     * 一定会增强,类似于finally*/
    @After("pointcut()")
    public void  after(JoinPoint jp){
        String name = jp.getSignature().getName();
        System.out.println("最终增强:"+name+"方法执行完毕!");
    }
    //异常增强
   @AfterThrowing(pointcut = "pointcut()",throwing = "e")
    public void  afterTrowing(JoinPoint jp ,Exception e){
        String name = jp.getSignature().getName();
        System.out.println("异常增强"+name+"产生了异常:"+e.getMessage());
    }
    //环绕增强
     @Around("pointcut()")
    public  Object  around(ProceedingJoinPoint jp){
        String name = jp.getSignature().getName();//获取目标方法名
        Object[] args = jp.getArgs();//获取方法参数
        System.out.println("这是环绕增强,目标方法是"+name+",参数是:"+ Arrays.toString(args));
        Object reult=null;
        try {
            reult= jp.proceed(args);//执行目标方法
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return  reult;
    }
}

dao类

package dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/**
 * @author Huang_X 2021/11/5 10:16
 * @version v1.0
 */
@Repository("userdao")
public class UserDao {
}

service类

package service;

import dao.UserDao;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

/**
 * @author Huang_X 2021/11/5 10:17
 * @version v1.0
 */
@Repository("userservice")
public class UserService {


    //创建日志对象
Logger logger=Logger.getLogger(UserService.class);

    @Autowired//自动装配
    @Qualifier("userdao")//指定名称
    UserDao userDao;

    public void  show(){
        System.out.println(userDao);
        try {
            int i=10/0;
        } catch (Exception e) {
            logger.info("算术异常!");
        }
//手动定义的异常是为了测试log4j的打印的
    }
}

test测试类

package tset;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;

/**
 * @author Huang_X 2021/11/5 10:17
 * @version v1.0
 */
public class test {
    public static void main(String[] args) {
       ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userservice = ctx.getBean("userservice", UserService.class);
        userservice.show();

    }
}

applicationContext.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:context="http://www.springframework.org/schema/context"
       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/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--包扫描-->
    <context:component-scan base-package="service,dao,aop"/>
    <!--开启注解aop-->
    <aop:aspectj-autoproxy/>
</beans>

log4j配置文件

log4j.rootLogger=DEBUG,CONSOLE,FILE
##for console
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MM-dd-HH:mm:ss}][%c-%L][%t] - %m%n
## for file
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.encoding=utf-8
log4j.appender.FILE.file=F:/Logs/log4j-
log4j.appender.FILE.DatePattern=yyyy-MM-dd'.log'
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d{MM-dd-HH:mm:ss}][%c-%L][%t]  - %m%n