Spring框架中使用AOP进行日志管理,xml式和注解式

xml式
spring配置文件:

 <!-- AOP通知   这是基于xml的,还有一种注解式的-->       
      <!-- 配置切面bean --> 
      <bean id="myAspect" class="com.news.aspect.MyAspect"></bean>
      <!-- 切面 -->
      <!-- aop配置 -->
      <aop:config>
          <!-- 配置切面,即用来增强的方法类 -->
          <aop:aspect id="aspect" ref="myAspect">
          <!-- 配置切入点,即需要增强的方法 -->
          <aop:pointcut expression="execution(* com.news.serviceimpl.UserServiceImpl.findUser(..))" id="myPointCut"></aop:pointcut>
          <!-- 配置通知 -->
             <!-- 前置通知 -->
             <aop:before method="myBefore" pointcut-ref="myPointCut"></aop:before>
             <!-- 后置通知 -->
             <!--   <aop:after method="myAfter" pointcut-ref="myPointCut" ></aop:after> -->
             <!-- 如果想要在后置通知方法中获得返回值,用下面的,不然上面 -->
             <aop:after-returning method="myAfter" pointcut-ref="myPointCut" returning="returnVal"></aop:after-returning>
          </aop:aspect>
      </aop:config>

切面类:

package com.news.aspect;

import java.util.Date;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;

import com.news.pojo.User;

public class MyAspect {
    //前置通知
	public void myBefore(JoinPoint joinPoint) {	
		//得到登陆用户信息
		User user=(User)joinPoint.getArgs()[0];		
		Logger logger=Logger.getLogger(MyAspect.class);
		logger.info(user.getLoginName()+"在"+new Date().toLocaleString()+"尝试进行登陆");
		logger.info("调用的方法为"+joinPoint.getSignature().getName());		
	     // for (int i = 0; i < joinPoint.getArgs().length; i++) {
		 // System.out.println(joinPoint.getArgs()[i]); }		 				
	}
	//后置通知
	public void myAfter(JoinPoint joinPoint,Object returnVal) {
		User user=(User)returnVal;
		Logger logger=Logger.getLogger(MyAspect.class);		
		//System.out.println(joinPoint.getArgs().length);
		if(returnVal!=null) {
			logger.info(user.getLoginName()+"姓名为"+user.getUserName()+"的用户在"+new Date().toLocaleString()+"登陆成功");
		}else {
			logger.info(user.getUserName()+"在"+new Date().toLocaleString()+"登陆失败");
		}		                    		
	}
	
}

被增强的方法(serviceimpl):

//根据用户账号和密码查找单个用户。用于登陆
	@Override
	public User findUser(User user) {	
		return userMapper.findUser(user);
	}

在切面类中,JoinPoint joinPoint是用来获得传入方法的参数值的,只需要在形参声明一下即可用,Object returnVal是用来获得方法返回值的,需要在xml里配置以后才可以使用,即上面后置通知的写法。

注解式
spring配置文件

<!-- 指定需要扫描的包,使注解生效 ,MyAspect2--> 
      <context:component-scan base-package="com.news.aspect"></context:component-scan>
      <!-- 启用注解的声明式AspectJ支持 -->    
      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

切面类

@Aspect
@Component
public class MyAspect2 {
        //定义切入点
	    @Pointcut("execution(* com.news.serviceimpl.UserServiceImpl.findUser(..))")
	    //命名切入点,返回值为void的空方法
	    public void myPointCut() {}
	    
	    //前置通知
	    @Before("myPointCut()")
	    public void myBefore(JoinPoint joinPoint) {	
			//得到登陆用户信息
			User user=(User)joinPoint.getArgs()[0];		
			Logger logger=Logger.getLogger(MyAspect.class);
			logger.info(user.getLoginName()+"在"+new Date().toLocaleString()+"尝试进行登陆注解式aop");
			logger.info("调用的方法为"+joinPoint.getSignature().getName());		
		     // for (int i = 0; i < joinPoint.getArgs().length; i++) {
			 // System.out.println(joinPoint.getArgs()[i]); }		 				
		}
	    
	    //后置通知
	    @AfterReturning(value="myPointCut()",returning ="returnVal")
	    public void myAfter(JoinPoint joinPoint,Object returnVal) {
			User user=(User)returnVal;
			Logger logger=Logger.getLogger(MyAspect.class);		
			//System.out.println(joinPoint.getArgs().length);
			if(returnVal!=null) {
				logger.info(user.getLoginName()+"姓名为"+user.getUserName()+"的用户在"+new Date().toLocaleString()+"登陆成功注解式aop");
			}else {
				logger.info(user.getUserName()+"在"+new Date().toLocaleString()+"登陆失败注解式aop");
			}		                    		
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值