项目结构:

Aop:切面类
applicationContext.xml:配置文件
架包:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.12</version></dependency>//使用log4j前需先应用此架包<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></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
