Spring的IOC和AOP之深剖(5)

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接口

Spring的IOC和AOP之深剖

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接口

Spring的IOC和AOP之深剖

Spring的IOC和AOP之深剖

你注意看没有,都没有实现方法,怎么办呢?你别急,其实已经给我们规定了方法名称,而且必须是它才能。就是 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> -->

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d0a66771283e2103c6bdc01c098f5a37.html