浅聊spring AOP的最基本配置

本文介绍了Spring AOP的应用方式,包括使用ProxyFactoryBean和BeanNameAutoProxyCreator进行AOP配置的方法,展示了如何通过Advisor和Interceptor对目标对象进行增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 假设我们有一个Person接口和它的实现类PersonImpl,我们希望每次调用Person方法的时候,都能够额外做其他一些操作。这时我们配置如下:

 

 

<beanid="personTarget"class="com.mycompany.PersonImpl">

    <propertyname="name"value="Tony"/>

    <propertyname="age"value="51"/>

</bean>

 

<beanid="myAdvisor"class="com.mycompany.MyAdvisor">

    <propertyname="someProperty"value="Custom string property value"/>

</bean>

 

<beanid="debugInterceptor"class="org.springframework.aop.interceptor.DebugInterceptor">

</bean>

 

<bean id="person"

    class="org.springframework.aop.framework.ProxyFactoryBean">

    <propertyname="proxyInterfaces"value="com.mycompany.Person"/>

 

    <propertyname="target"ref="personTarget"/>

    <propertyname="interceptorNames">

        <list>

            <value>myAdvisor</value>

            <value>debugInterceptor</value>

        </list>

    </property>

</bean>

  

以上配置的含义是:定义一个AOP,用myAdvisordebugInterceptor去拦截personTarget的操作。对使用者而言,他们都只是拿到一个person(接口)类型的对象,并不知道它真正的实现类。它的真正使用类是经2advisor代理过的PersonImpl

    在实际应用中,这种一个对象需要被多个advisor拦截的情况不多,倒是一个advisor拦截多个接口居多,比如数据库的事务。示例配置如下:

 

<beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

        <propertyname="interceptorNames">

            <list>

                <value>transactionInterceptor</value>

            </list>

        </property>

        <propertyname="beanNames">

            <list>

                <value>productOverService</value>

                <value>ticketOverService</value>

            </list>

        </property>

        <propertyname="proxyTargetClass" value="true"/>

</bean>

 

本配置的意思是用transactionInterceptor去拦截productOverService和ticketOverService。

 

 

因为aop的原理一样,所以aop各元素之间的装配过程也类似。无论是哪种spring的配置,所不同的只是方便性而已。凡是spring的AOP,它的底层都是JDK动态代理(代理接口)或CGLIB(代理类)。以上配置中,ProxyFactoryBean实现FactoryBean接口,这是spring预定义的一个接口,所有实现该接口的bean。它在spring容器中存储的真正对象,并不是定义时候的那个类,比如这里的ProxyFactoryBean。而是它的getObject所返回的对象,也就是说初始化person这个bean的时候,它会调用它的getObject方法,spring在这个方法里创建AOP代理。对于第二种配置,BeanNameAutoProxyCreator实现了BeanPostProcessor接口,spring在这个接口里创建AOP代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值