最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring動(dòng)態(tài)注冊(cè)bean?AOP失效原理解析

 更新時(shí)間:2023年07月23日 09:29:26   作者:linyb極客之路  
這篇文章主要為大家介紹了spring動(dòng)態(tài)注冊(cè)bean使AOP失效原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

本文的素材來(lái)自讀者的一個(gè)問(wèn)題,他看過(guò)我之前寫(xiě)的一篇博文聊聊如何把第三方服務(wù)注冊(cè)到我們項(xiàng)目的spring容器中。剛好他項(xiàng)目中也有類(lèi)似這樣的一個(gè)需求,他就采用我文中介紹的第三種方法

調(diào)用beanFactory.registerSingleton()

一開(kāi)始項(xiàng)目運(yùn)行得還可以,后面他在這個(gè)第三方服務(wù)中使用AOP,發(fā)現(xiàn)AOP始終沒(méi)有生效。于是他就給我留言了。今天就來(lái)聊一下這個(gè)話(huà)題,為什么使用registerSingleton()注冊(cè)的bean,無(wú)法使AOP生效

問(wèn)題根源

registerSingleton()這個(gè)方法直接將bean存放到單例池里面了。

如果對(duì)bean的生命周期有了解的朋友,應(yīng)該會(huì)知道,bean可能會(huì)經(jīng)過(guò)一系列的后置處理器后,再存放到單例池里面。因此這個(gè)bean可能是會(huì)被增強(qiáng)的,其中當(dāng)然包括經(jīng)過(guò)AOP增強(qiáng)

而使用registerSingleton()相當(dāng)于是直接走捷徑,不經(jīng)過(guò)后置處理器,一步到位直接存放到單例池中。如果第三方服務(wù)是直接通過(guò)new出來(lái)的,就是一個(gè)普通的對(duì)象,因此注入到IOC容器后,也只是一個(gè)普通的bean,并沒(méi)有任何增強(qiáng)

問(wèn)題修復(fù)

方案一、不使用registerSingleton()

而是使用BeanDefinition注冊(cè)方式

這種方式本質(zhì)是讓這個(gè)對(duì)象完整經(jīng)歷了bean的生命周期

示例:

@Configuration
public class HelloServiceConfiguration implements BeanFactoryPostProcessor {


    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        beanDefinition.setBeanClass(HelloService.class);
        HelloServiceProperties properties = new HelloServiceProperties();
        properties.setBeanName("helloService");
        beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0,properties);
        defaultListableBeanFactory.registerBeanDefinition(properties.getBeanName(),beanDefinition);

    }
}

方案二、使用registerSingleton()

但注入的對(duì)象不是用new出來(lái)的,而是直接注入AOP代理對(duì)象

主要利用AOP的代理api:AnnotationAwareAspectJAutoProxyCreator

示例

@Configuration
public class HelloServiceWithProxyConfiguration implements BeanFactoryAware, InitializingBean {
    private BeanFactory beanFactory;
    @Autowired
    private AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)beanFactory;
        HelloServiceProperties properties = new HelloServiceProperties();
        properties.setBeanName("helloService");
        HelloService helloServicePrxoy = (HelloService) annotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization(new HelloService(properties), "helloService$$Prxoy");
        defaultListableBeanFactory.registerSingleton(properties.getBeanName(),helloServicePrxoy);
    }
}

總結(jié)

以上兩種方案,建議使用方案一。因?yàn)榉桨敢煌暾?jīng)歷過(guò)bean的生命周期,這就意味著可以獲取spring提供的各種增強(qiáng)功能。方案二反而更像是硬編碼進(jìn)去,如果后面要使用spring的其他增強(qiáng)的功能,就還必須調(diào)用其他API。不過(guò)如果可以確定業(yè)務(wù)不會(huì)使用spring提供的各種擴(kuò)展功能。方案二也是可以的

demo鏈接

以上就是spring動(dòng)態(tài)注冊(cè)bean AOP失效原理解析的詳細(xì)內(nèi)容,更多關(guān)于spring AOP失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

额尔古纳市| 宝鸡市| 昭通市| 渝中区| 永新县| 凯里市| 沧源| 阳高县| 红桥区| 同德县| 高尔夫| 宜州市| 凤山市| 渑池县| 同江市| 广平县| 来凤县| 金阳县| 庐江县| 宝山区| 河池市| 弋阳县| 神池县| 金阳县| 平阴县| 永吉县| 山西省| 镇坪县| 绥棱县| 双柏县| 泊头市| 台南市| 盖州市| 平安县| 昭平县| 泸定县| 松溪县| 巨野县| 南康市| 金门县| 汨罗市|