Java使用AOP和XML实现日志记录
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 业务代码
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private IUserService userService;
@PostMapping("/login")
@TokenIgnore
public Result<UserVO> login(@RequestBody User user){
return Result.success(userService.login(user));
}
@PostMapping("/createUser")
@TokenIgnore
public Result<User> createUser(@RequestBody User user){
return Result.success(userService.create(user));
}
}
- 日志处理类
public class LogAopHandler {
@Autowired
private LogMapper logMapper;
public void addLog(Result result){
Integer code = result.getCode();
Log log = new Log();
log.setType(code==200?"成功":"失败")
.setContent(result.getMessage());
logMapper.addLog(log);
}
/**
* 目标方法完成后切入
*/
public Result afterReturning(JoinPoint joinPoint,Result result) {
addLog(result);
return result;
}
}
public class UserAopHandler {
public Result createUser(JoinPoint joinPoint, Result result){
User user = (User) result.getData();
String username = user.getUsername();
result.setMessage(String.format("新建用户%s",username));
return result;
}
public Result aroundLogin(ProceedingJoinPoint joinPoint) throws Throwable {
User user = (User) joinPoint.getArgs()[0];
String username = user.getUsername();
Object obj = joinPoint.proceed();
Result result = ((Result)obj);
result.setMessage(String.format("%s登录",username));
return result;
}
}
- xml配置,log-aop.xml放在resources目录下
<?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 https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置切面的bean-->
<bean id="logAopHandler" class="com.liming.app.common.aspect.LogAopHandler"/>
<bean id="userAopHandler" class="com.liming.app.common.aspect.UserAopHandler"/>
<!--同一个切面的多个after-returning通知,写的靠前的后执行;如果设置order,order越小越后执行-->
<!--用户登录-->
<aop:config>
<aop:pointcut id="webLogin" expression="execution(* com.liming.app.controller.UserController.login(..))"/>
<aop:aspect ref="logAopHandler" order="1">
<aop:after-returning method="afterReturning" pointcut-ref="webLogin" returning="result"/>
</aop:aspect>
<aop:aspect ref="userAopHandler" order="2">
<aop:around method="aroundLogin" pointcut-ref="webLogin"/>
</aop:aspect>
</aop:config>
<!--用户新建-->
<aop:config>
<aop:pointcut id="createUser" expression="execution(* com.liming.app.controller.UserController.createUser(..))"/>
<aop:aspect ref="logAopHandler" order="1">
<aop:after-returning method="afterReturning" pointcut-ref="createUser" returning="result"/>
</aop:aspect>
<aop:aspect ref="userAopHandler" order="2">
<aop:after-returning method="createUser" pointcut-ref="createUser" returning="result"/>
</aop:aspect>
</aop:config>
</beans>
- 加载xml配置
一、启动类加载
@ImportResource(locations = {"classpath:log-aop.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
二、配置加载
- 在application.yml中增加配置
aop:
fileName: log-aop
- 在reources目录下增加配置文件spring-config.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"
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"
default-lazy-init="true">
<context:annotation-config/>
<import resource="classpath:${aop.fileName}.xml"/>
</beans>
@ImportResource(locations = {"classpath:spring-config.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}