Spring AOP的日志记录
2014-07-30 15:29
447 查看
现在的项目是Spring+MyBatis,前段时间项目经理让我干了一个活,就是给所有的controller里的所有方法加上日志记录的代码,其实没有多少,也就300来个方法,也没有抱怨什么,一边打着瞌睡一边就干了,干的活如下:
举例:
像这样重复的代码,我竟然干了300多次。
我想,项目进行到最后才加的日志记录一定是因为有某种原因才使用这种日志记录的方法吧,但是当初使用Spring的时候,他的一大亮点不就是因为AOP实现的日志管理功能吗?所以一定要尝试一次,理解AOP怎么通过动态代理完成日志管理的。
下面是一个简单的例子:
备注:这个例子是在博客:Spring和MyBatis环境整合 的例子的基础上做,暂时以方法调用前的日志通知为例。
1、model----User.java
2、Dao 接口----UserDao.java
3、Dao----UserDao.xml
4、业务---UserBiz.java
业务实现---UserBizImpl.java
5、Advice类
6、log4j.properties
7、mybatis-config.xml
8、ApplicationContext.xml
9、测试结果:
日志:
通过这样的方式,我们只需要定义一个Advice类,实现Spring里的4中Advice接口(环绕Advice、Before Advice、After advice、Throws Advice),再在配置里配置好就可以了。哪里用写300次呢?我们有动态代理可以为我们做这些事情,就不必亲自动手啦。
举例:
private static Log log = LogFactory.getLog(UserController.class); @RequestMapping("/sys/user/query.do") public String sysUserQuery(HttpServletRequest request, ModelMap map) throws Exception { String thisMethodName = Thread.currentThread().getStackTrace()[1].getMethodName(); log.info(thisMethodName+":start");//开始日止记录 log.info(thisMethodName+":end");//结束日止记录 return "sys/user/sysUserQuery"; }
像这样重复的代码,我竟然干了300多次。
我想,项目进行到最后才加的日志记录一定是因为有某种原因才使用这种日志记录的方法吧,但是当初使用Spring的时候,他的一大亮点不就是因为AOP实现的日志管理功能吗?所以一定要尝试一次,理解AOP怎么通过动态代理完成日志管理的。
下面是一个简单的例子:
备注:这个例子是在博客:Spring和MyBatis环境整合 的例子的基础上做,暂时以方法调用前的日志通知为例。
1、model----User.java
package com.springMyBatis.system.model; public class User { private int id; private String username; private String password; public User(){} public int getId() { return id; } public void setId(int 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 toString(){ return "User[id="+id+" , username="+username+" , password="+password+"]"; } }
2、Dao 接口----UserDao.java
package com.springMyBatis.system.dao; import com.springMyBatis.system.model.User; public interface UserDao { public User getUser(User user); public void addUser(User user); public void updateUser(User user); public void deleteUser(int UserId); }
3、Dao----UserDao.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.springMyBatis.system.dao.UserDao"> <select id="getUser" parameterType="com.springMyBatis.system.model.User" resultType="com.springMyBatis.system.model.User"> SELECT * FROM user WHERE username=#{username} AND password=#{password} </select> <insert id="addUser" parameterType="com.springMyBatis.system.model.User" flushCache="true"> INSERT INTO user (id,username,password) VALUES (#{id},#{username},#{password}) </insert> <update id="updateUser" parameterType="com.springMyBatis.system.model.User"> UPDATE user SET password=#{password} WHERE id=#{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> </mapper>
4、业务---UserBiz.java
package com.springMyBatis.system.biz; import com.springMyBatis.system.model.User; public interface UserBiz { //添加用户 public void addUser(User user); //删除用户 public void delUser(int id); }
业务实现---UserBizImpl.java
package com.springMyBatis.system.biz; import com.springMyBatis.system.dao.UserDao; import com.springMyBatis.system.model.User; public class UserBizImpl implements UserBiz { UserDao userdao; public UserDao getUserdao() { return userdao; } public void setUserdao(UserDao userdao) { this.userdao = userdao; } public void addUser(User user) { userdao.addUser(user); } public void delUser(int id) { // TODO Auto-generated method stub userdao.deleteUser(id); } }
5、Advice类
package com.springMyBatis.aop; import java.lang.reflect.Method; import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice; public class LoggerAdvice implements MethodBeforeAdvice{ private Logger logger = Logger.getLogger(LoggerAdvice.class); @Override public void before(Method method, Object[] args, Object target) throws Throwable { //类名 String targetClassName=target.getClass().getName(); //获取被调用的方法名 String targetMethodName=method.getName(); //显示日志的格式字符串 String loginInfoText="前置通知"+targetClassName+"类的"+targetMethodName+"方法开始执行"; logger.info(loginInfoText); } }
6、log4j.properties
log4j.rootLogger=info,stdout,info,debug,error log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.logger.info=info log4j.appender.info=org.apache.log4j.DailyRollingFileAppender log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n log4j.appender.info.datePattern='.'yyyy-MM-dd log4j.appender.info.Threshold = INFO log4j.appender.info.append=true log4j.appender.info.File=D:/info.log
7、mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <mappers> <mapper resource="com/springMyBatis/system/dao/UserDao.xml"/> </mappers> </configuration>
8、ApplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 配置数据源--> <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>org.gjt.mm.mysql.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/springmybaitis?useUnicode=true&characterEncoding=UTF-8</value> <!--springmybaitis是我的数据库 --> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>123456</value> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="jdbcDataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml"></property> </bean> <bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.springMyBatis.system.dao.UserDao"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <!-- 配置创建UserBizImpl的实例 --> <bean id="userBiz" class="com.springMyBatis.system.biz.UserBizImpl"> <!-- 依赖注入数据访问层组件 --> <property name="userdao" ref="userDao" /> </bean> <!-- 定义前置通知 --> <bean id="logAdvice" class="com.springMyBatis.aop.LoggerAdvice"></bean> <!-- 定义代理类 --> <bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <!-- <value>com.springMyBatis.system.dao.UserDao</value> --> <value>com.springMyBatis.system.biz.UserBiz</value> </property> <property name="interceptorNames"> <list> <value>logAdvice</value> </list> </property> <property name="target" ref="userBiz"></property> </bean> </beans>
9、测试结果:
package com.springMyBatis.system.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.springMyBatis.system.biz.UserBiz; import com.springMyBatis.system.dao.UserDao; import com.springMyBatis.system.model.User; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //装配UserbIZimpl事例化 UserBiz userbiz = (UserBiz) context.getBean("ub"); User user=new User(); user.setId(1); user.setPassword("123"); user.setUsername("Jessica"); userbiz.addUser(user); user.setId(2); user.setPassword("123"); user.setUsername("Jessica2"); userbiz.addUser(user); user.setId(3); user.setPassword("123"); user.setUsername("Jessica3"); userbiz.addUser(user); user.setId(4); user.setPassword("123"); user.setUsername("Jessica4"); userbiz.addUser(user); userbiz.delUser(1); } }
日志:
[INFO ] [15:21:32] org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a78d3: startup date [Wed Jul 30 15:21:32 CST 2014]; root of context hierarchy [INFO ] [15:21:32] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml] [INFO ] [15:21:32] org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2a15cd: defining beans [jdbcDataSource,sqlSessionFactory,userDao,userBiz,logAdvice,ub]; root of factory hierarchy [INFO ] [15:21:32] org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: org.gjt.mm.mysql.Driver [INFO ] [15:21:33] com.springMyBatis.aop.LoggerAdvice - 前置通知com.springMyBatis.system.biz.UserBizImpl类的addUser方法开始执行 [INFO ] [15:21:34] com.springMyBatis.aop.LoggerAdvice - 前置通知com.springMyBatis.system.biz.UserBizImpl类的addUser方法开始执行 [INFO ] [15:21:34] com.springMyBatis.aop.LoggerAdvice - 前置通知com.springMyBatis.system.biz.UserBizImpl类的addUser方法开始执行 [INFO ] [15:21:34] com.springMyBatis.aop.LoggerAdvice - 前置通知com.springMyBatis.system.biz.UserBizImpl类的addUser方法开始执行 [INFO ] [15:21:34] com.springMyBatis.aop.LoggerAdvice - 前置通知com.springMyBatis.system.biz.UserBizImpl类的delUser方法开始执行
通过这样的方式,我们只需要定义一个Advice类,实现Spring里的4中Advice接口(环绕Advice、Before Advice、After advice、Throws Advice),再在配置里配置好就可以了。哪里用写300次呢?我们有动态代理可以为我们做这些事情,就不必亲自动手啦。
相关文章推荐
- Spring AOP 实现业务和异常日志记录实战
- spring Aop 之用户操作日志以及异常处理日志记录
- Spring AOP 实现业务日志记录
- spring aop 6 环绕通知记录应用的日志
- Spring AOP运用---记录方法调用与结果日志
- Spring AOP 完成日志记录
- spring Aop 之用户操作日志以及异常处理日志记录
- Spring AOP进行日志记录,管理
- Spring AOP 完成日志记录
- Spring AOP进行日志记录
- Spring AOP实现日志记录
- Spring AOP 日志 记录 面向切面编程
- spring AOP 日志记录失效问题
- Spring AOP进行日志记录,管理
- Spring AOP进行日志记录,管理
- JavaWeb记录用户操作日志:spring AOP
- Spring AOP实现系统日志记录
- spring aop 实现用户操作日志记录功能(转)
- Spring AOP对日志记录、Exception日志记录等等
- spring AOP记录日志