ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取到biz对象,即业务逻辑层对象
IUserBiz biz=(IUserBiz)ctx.getBean("serviceProxy");
User user=new User();
/**
* 执行这个方法时,先走前置增强,before(),然后走中间的方法,最后走后置增强
*/
biz.save2(user);
System.out.println("success!");
}
这个简单的例子就很好的体现出了Spring AOP的力量
顺便我们一起来看看其他增强类型
环绕增强:可以把前置增强和后置增强结合起来,spring吧目标的方法的控制权全部交给了它。我们要实现MethodInterceptor接口
aop:
public class AroundLog implements MethodInterceptor {
private static final Logger log = Logger.getLogger(AroundLog.class);
public Object invoke(MethodInvocation arg0) throws Throwable {
/*Object target = arg0.getThis(); // 获取被代理对象
Method method = arg0.getMethod(); // 获取被代理方法
Object[] args = arg0.getArguments(); // 获取方法参数
log.info("调用 " + target + " 的 " + method.getName() + " 方法。方法入参:"
+ Arrays.toString(args));
try { Object result = arg0.proceed(); // 调用目标方法,获取目标方法返回值
log.info("调用 " + target + " 的 " + method.getName() + " 方法。 "
+ "方法返回值:" + result);
return result;
} catch (Throwable e) {
log.error(method.getName() + " 方法发生异常:" + e); throw e;
}*/
//环绕增强
System.out.println("===before=====");
//调用目标对象的方法
Object result = arg0.proceed();
System.out.println("===after=====");
return result;
}
applicationContext.xml:
<bean/>
<!--环绕增强 -->
<bean/>
<!-- 方式一 -->
<!-- <aop:config>
切点
<aop:pointcut expression="execution(public void delete())"/>
异常抛出增强
<aop:advisor advice-ref="around" pointcut-ref="pointcut"/>
</aop:config> -->
<!--方式二 -->
<!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
<bean>
<property ref="service"></property>
<property value="around"></property>
</bean>
</beans>
异常增强,我们要实现ThrowsAdvice接口
你注意看没有,都没有实现方法,怎么办呢?你别急,其实已经给我们规定了方法名称,而且必须是它才能。就是 void AfterThrowing()它提供了一个参数,三个参数的。
aop:
public class ErrorLog implements ThrowsAdvice {
private static final Logger log=Logger.getLogger(ErrorLog.class);
@SuppressWarnings("unused")
private void AfterThrowing(Method method, Object[] args, Object target,
RuntimeException e) {
log.error(method.getName()+"方法发生异常"+e);
}
service
public class UserService {
public void delete() {
int result=5/0;
System.out.println(result);
}
}
applicationContext.xml
<bean/>
<bean/>
<!--方式二 -->
<!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
<bean>
<property ref="service"></property>
<property value="error"></property>
</bean>
<!-- <aop:config>
<aop:pointcut expression="execution(public void delete())"/>
异常抛出增强
<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>
</aop:config> -->