XML的配置文件:缺点:配置的工作量依旧很大,容易出错, 可阅读性比较差
解决方案:注解
切面 :@Aspect
切入点 :@Pointcut(“execution(* com.oupeng.service.UserService.*(…))”)
具体的增强处理注解
前置增强:@Before("pointcut()")
后置增强:@AfterReturning(pointcut="pointcut()",returning="result")
环绕增强:@Around("execution(* com.oupeng.service.UserService.*(..))")
异常处理增强: @AfterThrowing(pointcut="pointcut()",throwing="e")
最终增强:@After("execution (* com.oupeng.service.impl.UserServiceImpl.addNewUser(..))")
<!-- 增强处理类的配置 -->
<bean class="com.oupeng.aop.ArroundLogger"></bean>
<bean class="com.oupeng.aop.AfterLogger"></bean>
<bean class="com.oupeng.aop.ErrorLogger"></bean>
<bean class="com.oupeng.aop.UserServiceLogger" ></bean>
<!--启用注解的支持 -->
<aop:aspectj-autoproxy/>
环绕增强
<bean class="com.oupeng.aop.ArroundLogger"></bean>
package com.oupeng.aop;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
public class ArroundLogger {
private Logger log=Logger.getLogger(ArroundLogger.class);
//定义环绕增强方法
@Around("execution(* com.oupeng.service.UserService.*(..))")
public Object arroundLogger(ProceedingJoinPoint jp){
log.info("调用环绕增强开始了..."+jp.getSignature().getName()+"方法被调用,方法参数:"+Arrays.toString(jp.getArgs()));
Object object=null;
try {
//目标方法执行
object=jp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
log.info("调用环绕增强结束了..."+jp.getSignature().getName()+"方法被调用,方法返回值:"+object);
return object;
}
}
最终增强
<bean class=" com.oupeng.aop.AfterLogger"></bean>
package com.oupeng.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AfterLogger {
private Logger log=Logger.getLogger(AfterLogger.class);
//定义最终增强方法
@After("execution (* com.oupeng.service.impl.UserServiceImpl.addNewUser(..))")
public void afterLogger(JoinPoint jp){
System.out.println("出纳开始准备数据....");
System.out.println("开始打印每周财务报表....");
System.out.println("开始打印每月的财务报表.....");
}
}
异常增强
<bean class="com.oupeng.aop.ErrorLogger"></bean>
package com.oupeng.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class ErrorLogger {
private Logger log=Logger.getLogger(ErrorLogger.class);
@Pointcut("execution(* com.oupeng.service.UserService.*(..))")
public void pointcut(){
}
//定义增强方法
@AfterThrowing(pointcut="pointcut()",throwing="e")
public void afterThrowing(JoinPoint jp,RuntimeException e){
log.error(jp.getSignature().getName()+"方法发生了异常"+e.getMessage());
}
}
前置和后置
<bean class="com.oupeng.aop.UserServiceLogger" ></bean>
package com.oupeng.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.oupeng.pojo.User;
import com.oupeng.service.UserService;
public class TestService {
@Test
public void testService() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService ud=(UserService) context.getBean("userService");
/*User user=new User();
user.setUserName("曹操");
user.setPassword("565566");
user.setEmail("256@163.com");
user.setId(001);*/
User user= (User) context.getBean("user");
ud.addNewUser(user);
}
@Test
public void testException(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService ud=(UserService)context.getBean("userService");
User user=(User)context.getBean("user");
ud.addNewUser(user);
}
@Test
public void testArroundLogger(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService ud=(UserService)context.getBean("userService");
User user=(User)context.getBean("user");
ud.addNewUser(user);
}
}