一、在Spring容器中详细配置(增强)
首先导入以下jar包
接着写好Dao层和Service层,最后写Aop实体类以及在Spring容器中的配置(以下详细描述四种增强)
第一种:Throws异常增强(当目标方法抛出异常时调用)
Aop实体类:
/**
* @param joinPoint 所有动态代理的类的信息
*/
public void afterError(JoinPoint joinPoint,RuntimeException e){
System.out.println(joinPoint.getSignature().getName()+"这个方法的异常信息"+e.getMessage());
}
Spring容器中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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">
<bean id="userDao" class="com.offcn.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.offcn.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="aopp" class="com.offcn.aop.Aop"></bean>
<!--配置切面-->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="pointcut" expression="execution(* com.offcn.service.UserService.*(..))" />
<!-- 引用包含增强方法的Bean -->
<aop:aspect ref="aopp">
<!-- 将afterThrowing()方法定义为异常抛出增强并引用pointcut切入点 -->
<!-- 通过throwing属性指定为名为e的参数注入异常实例
<aop:after-throwing method="afterError"
pointcut-ref="pointcut" throwing="e"
</aop:aspect>
</aop:config>
</beans>
第二种:After后置增强(在目标方法调用后调用)
Aop实体类
public void afterInfo(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName());
}
因为在Throws异常增强已经完成了以下三步:
1.配置切面
2.设置切点
3.切面与增强bean进行关联
所以在Spring容器中只需要配置增强,也就是在aop:aspect标签内增加aop标签,如下:
<aop:after method="afterInfo" pointcut-ref="pointcut"></aop:after>
</aop:aspect>
第三种:Before前置增强(在目标方法调用前调用)
具体步骤同After后置增强类似,区别只是将aop:after配置标签换为aop:before
运行结果:
第四种:Around环绕增强(拦截对目标方法调用,需要手动执行目标方法)
Aop实体类
/**
* @param joinPoint JoinPoint的子类(只适用于环绕增强)
*/
public void aroundLogger(ProceedingJoinPoint joinPoint){
System.out.println(joinPoint.getTarget()+Arrays.toString(joinPoint.getArgs()));
//执行目标对象相应的方法
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println(joinPoint.getSignature().getName());
}
Spring容器中配置
<aop:around method="aroundLogger" pointcut-ref="pointcut"></aop:around>
</aop:aspect>
二、还可以通过注解(增强)
配置.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<context:component-scan base-package="com.offcn.service,com.offcn.dao" />
<bean class="com.offcn.aop.AopError"></bean>
<!--开启spring注解-->
<aop:aspectj-autoproxy/>
</beans>
在Aop实体类写注解
@Aspect
public class Aop {
}
分别在各个在方法名上写注解
@AfterThrowing(pointcut = "execution(* com.offcn.service.UserService.*(..))",throwing = "e")
@After("execution(* com.offcn.service.UserService.*(..))")
@Before("execution(* com.offcn.service.UserService.*(..))")
@Around("execution(* com.offcn.service.UserService.*(..))")