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");
}
}