Spring框架如何实现AOP添加日志记录功能

小编给大家分享一下Spring框架如何实现AOP添加日志记录功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

需求,在调用业务方法的时候,在被调用的业务方法的前面和后面添加上日志记录功能

整体架构:

Spring框架如何实现AOP添加日志记录功能

日志处理类:

packageaop;

importjava.util.Arrays;

importorg.apache.log4j.Logger;
importorg.aspectj.lang.JoinPoint;

//日志处理类增强处理类-日志
publicclassUserServiceLogger{
privateLoggerlogger=Logger.getLogger(UserServiceLogger.class);

//前置增强
publicvoidbefore(JoinPointjoinPoint){
logger.info("调用"+joinPoint.getTarget()+"的"
+joinPoint.getSignature()+"方法,方法参数是:"
+Arrays.toString(joinPoint.getArgs()));
}

//后置增强
publicvoidafterReturning(JoinPointjoinPoint,Objectresult){
logger.info("调用"+joinPoint.getTarget()+"的"
+joinPoint.getSignature()+"方法,方法的返回值是:"
+result);
}
}
下面是一个三层架构模式:
packagedao;

importentity.User;

/**
*增加DAO接口,定义了所需的持久化方法
*/
publicinterfaceUserDao{
publicvoidsave(Useruser);
}
packagedao.impl;

importdao.UserDao;
importentity.User;

/**
*用户DAO类,实现IDao接口,负责User类的持久化操作
*/
publicclassUserDaoImplimplementsUserDao{

publicvoidsave(Useruser){
//这里并未实现完整的数据库操作,仅为说明问题
System.out.println("保存用户信息到数据库");
}
}
packageentity;

/**
*用户实体类
*/
publicclassUserimplementsjava.io.Serializable{
privateIntegerid;//用户ID
privateStringusername;//用户名
privateStringpassword;//密码
privateStringemail;//电子邮件

//getter&setter
publicIntegergetId(){
returnid;
}

publicvoidsetId(Integerid){
this.id=id;
}

publicStringgetUsername(){
returnusername;
}

publicvoidsetUsername(Stringusername){
this.username=username;
}

publicStringgetPassword(){
returnpassword;
}

publicvoidsetPassword(Stringpassword){
this.password=password;
}

publicStringgetEmail(){
returnemail;
}

publicvoidsetEmail(Stringemail){
this.email=email;
}

}
packageservice;

importentity.User;

/**
*用户业务接口,定义了所需的业务方法
*/
publicinterfaceUserService{
publicvoidaddNewUser(Useruser);
}
packageservice.impl;

importservice.UserService;
importdao.UserDao;
importentity.User;

/**
*用户业务类,实现对User功能的业务管理
*/
publicclassUserServiceImplimplementsUserService{

//声明接口类型的引用,和具体实现类解耦合
privateUserDaodao;

//dao属性的setter访问器,会被Spring调用,实现设值注入
publicvoidsetDao(UserDaodao){
this.dao=dao;
}

publicvoidaddNewUser(Useruser){
//调用用户DAO的方法保存用户信息
dao.save(user);
}
}
编写单元测试方法:
packagetest;

importorg.junit.Test;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;

importservice.UserService;
importservice.impl.UserServiceImpl;

importentity.User;


publicclassAopTest{

@Test
publicvoidaopTest(){
ApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");
UserServiceservice=(UserService)ctx.getBean("service");

Useruser=newUser();
user.setId(1);
user.setUsername("test");
user.setPassword("123456");
user.setEmail("test@xxx.com");

service.addNewUser(user);
}

}

applicationContext.xml核心配置文件:

<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<beanid="dao"class="dao.impl.UserDaoImpl"></bean>
<beanid="service"class="service.impl.UserServiceImpl">
<propertyname="dao"ref="dao"></property>
</bean>
<!--声明增强方法所在的Bean-->
<beanid="theLogger"class="aop.UserServiceLogger"></bean>
<!--配置切面-->
<aop:config>
<!--定义切入点-->
<aop:pointcutid="pointcut"
expression="execution(publicvoidaddNewUser(entity.User))"/>
<!--引用包含增强方法的Bean-->
<aop:aspectref="theLogger">
<!--将before()方法定义为前置增强并引用pointcut切入点-->
<aop:beforemethod="before"pointcut-ref="pointcut"></aop:before>
<!--将afterReturning()方法定义为后置增强并引用pointcut切入点-->
<!--通过returning属性指定为名为result的参数注入返回值-->
<aop:after-returningmethod="afterReturning"

pointcut-ref="pointcut"returning="result"/>
</aop:aspect>
</aop:config>
</beans>

运行结果:

12-2915:13:06[INFO]org.springframework.context.support.ClassPathXmlApplicationContext
-Refreshingorg.springframework.context.support.ClassPathXmlApplicationContext@2db0f6b2:startupdate[SunDec2915:13:06CST2019];rootofcontexthierarchy
12-2915:13:06[INFO]org.springframework.beans.factory.xml.XmlBeanDefinitionReader
-LoadingXMLbeandefinitionsfromclasspathresource[applicationContext.xml]
12-2915:13:06[INFO]org.springframework.beans.factory.support.DefaultListableBeanFactory
-Pre-instantiatingsingletonsinorg.springframework.beans.factory.support.DefaultListableBeanFactory@3701eaf6:definingbeans[userDao,service,theLogger,org.springframework.aop.config.internalAutoProxyCreator,pointcut,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0,org.springframework.aop.aspectj.AspectJPointcutAdvisor#1];rootoffactoryhierarchy
12-2915:13:06[INFO]aop.UserServiceLogger
-调用service.impl.UserServiceImpl@3c130745的voidservice.UserService.addNewUser(User)方法,方法参数是:[entity.User@2e4b8173]
保存用户信息到数据库
12-2915:13:06[INFO]aop.UserServiceLogger
-调用service.impl.UserServiceImpl@3c130745的voidservice.UserService.addNewUser(User)方法,方法的返回值是:null

以上是“Spring框架如何实现AOP添加日志记录功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-05-30 14:06:58
收藏
分享
海报
0 条评论
169
上一篇:Java中怎么实现带GUI界面的猜数字游戏 下一篇:PHP如何配合fiddler抓包抓取微信指数小程序数据
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码