Spring的AOP实现
实现方式一:配置文件实现(xml)
配置文件:
ioc配置需要装配的对象(包括切面类):
<bean id="userService" class="com.sgl.service.UserServiceImpl"></bean>
<bean id="pointCut" class="com.sgl.diy.PointCut"></bean>
配置文件实现aop:
<aop:config>
<aop:aspect id="userService" ref="pointCut">
<aop:before method="before" pointcut="execution(* com.sgl.service.*.*(..))"></aop:before>
<aop:after method="after" pointcut="execution(* com.sgl.service.*.*(..))"></aop:after>
</aop:aspect>
</aop:config>
简单切面类:
public class PointCut{
public void before(){
System.out.println("方法执行前");
}
public void after(){
System.out.println("方法执行后");
}
}
业务类实现:
public class UserServiceImpl implements UserService{
public void add(){
System.out.println("执行了add方法");
}
}
测试:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = (UserService) ac.getBean("userService");
userService.add();
测试结果:
实现方式二:注解实现
配置文件:
ioc配置需要装配的对象(包括切面类):
<bean id="userService" class="com.sgl.service.UserServiceImpl"></bean>
<bean id="pointCut" class="com.sgl.diy.PointCut"></bean>
配置注解:
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:component-scan base-package="com.sgl.*"></context:component-scan>
业务类实现与上相同
切面类使用环绕通知:
@Around("execution(* com.sgl.service.*.*(..))")
public void around(ProceedingJoinPoint pjp){
System.out.println("环绕方法执行前");
try {
pjp.proceed();
int i=9/0;
} catch (Throwable throwable) {
System.out.println("抛异常");
}
System.out.println("环绕方法执行后");
}
测试结果: