精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

剖析Spring中最常用的擴展點(下)

jf_78858299 ? 來源:蘇三說技術 ? 作者:蘇三說技術 ? 2023-02-15 16:07 ? 次閱讀

7.修改BeanDefinition

Spring IOC在實例化Bean對象之前,需要先讀取Bean的相關屬性,保存到BeanDefinition對象中,然后通過BeanDefinition對象,實例化Bean對象。

如果想修改BeanDefinition對象中的屬性,該怎么辦呢?

答:我們可以實現BeanFactoryPostProcessor接口。

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder.addPropertyValue("id", 123);
        beanDefinitionBuilder.addPropertyValue("name", "蘇三說技術");
        defaultListableBeanFactory.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
    }
}

在postProcessBeanFactory方法中,可以獲取BeanDefinition的相關對象,并且修改該對象的屬性。

8.初始化Bean前后

有時,你想在初始化Bean前后,實現一些自己的邏輯。

這時可以實現:BeanPostProcessor接口。

該接口目前有兩個方法:

  • postProcessBeforeInitialization 該在初始化方法之前調用。
  • postProcessAfterInitialization 該方法再初始化方法之后調用。

例如:

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof User) {
            ((User) bean).setUserName("蘇三說技術");
        }
        return bean;
    }
}

如果spring中存在User對象,則將它的userName設置成:蘇三說技術。

其實,我們經常使用的注解,比如:@Autowired、@Value、@Resource、@PostConstruct等,是通過AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor實現的。

9.初始化方法

目前spring中使用比較多的初始化bean的方法有:

  1. 使用@PostConstruct注解
  2. 實現InitializingBean接口

9.1 使用@PostConstruct注解

@Service
public class AService {
    @PostConstruct
    public void init() {
        System.out.println("===初始化===");
    }
}

在需要初始化的方法上增加@PostConstruct注解,這樣就有初始化的能力。

9.2 實現InitializingBean接口

@Service
public class BService implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("===初始化===");
    }
}

實現InitializingBean接口,重寫afterPropertiesSet方法,該方法中可以完成初始化功能。

10.關閉容器前

有時候,我們需要在關閉spring容器前,做一些額外的工作,比如:關閉資源文件等。

這時可以實現DisposableBean接口,并且重寫它的destroy方法:

@Service
public class DService implements InitializingBean, DisposableBean {
 
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean destroy");
    }
 
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean afterPropertiesSet");
    }
}

這樣spring容器銷毀前,會調用該destroy方法,做一些額外的工作。

通常情況下,我們會同時實現InitializingBean和DisposableBean接口,重寫初始化方法和銷毀方法。

11.自定義作用域

我們都知道spring默認支持的Scope只有兩種:

  • singleton 單例,每次從spring容器中獲取到的bean都是同一個對象。
  • prototype 多例,每次從spring容器中獲取到的bean都是不同的對象。

spring web又對Scope進行了擴展,增加了:

  • RequestScope 同一次請求從spring容器中獲取到的bean都是同一個對象。
  • SessionScope 同一個會話從spring容器中獲取到的bean都是同一個對象。

即便如此,有些場景還是無法滿足我們的要求。

比如,我們想在同一個線程中從spring容器獲取到的bean都是同一個對象,該怎么辦?

這就需要自定義Scope了。

第一步實現Scope接口:

public class ThreadLocalScope implements Scope {
    private static final ThreadLocal THREAD_LOCAL_SCOPE = new ThreadLocal();

    @Override
    public Object get(String name, ObjectFactory objectFactory) {
        Object value = THREAD_LOCAL_SCOPE.get();
        if (value != null) {
            return value;
        }

        Object object = objectFactory.getObject();
        THREAD_LOCAL_SCOPE.set(object);
        return object;
    }

    @Override
    public Object remove(String name) {
        THREAD_LOCAL_SCOPE.remove();
        return null;
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }

    @Override
    public String getConversationId() {
        return null;
    }
}

第二步將新定義的Scope注入到spring容器中:

@Component
public class ThreadLocalBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        beanFactory.registerScope("threadLocalScope", new ThreadLocalScope());
    }
}

第三步使用新定義的Scope:

@Scope("threadLocalScope")
@Service
public class CService {
    public void add() {
    }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    338

    瀏覽量

    14308
  • AOP
    AOP
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11088
  • IOC
    IOC
    +關注

    關注

    0

    文章

    28

    瀏覽量

    10089
收藏 人收藏

    評論

    相關推薦

    Spring框架的設計理念

    Spring作為現在最優秀的框架之一,已被廣泛的使用,51CTO也曾經針對Spring框架中的hqC應用做過報道。本文將從另外一個視角試圖剖析Spring框架的作者設計
    發表于 07-15 08:17

    電路中最常見到的電容使用方法

    基于電容常用功能,詳細介紹各功能應用電路中最常見到的電容使用方法
    發表于 03-17 08:08

    請問射擊探測器中最常用的口徑是什么?

    射擊探測器中最常用的口徑是什么?
    發表于 04-12 06:56

    開關電源中最常用的電阻有哪些呢

    一 電阻1.開關電源中最常用的電阻有貼片電阻、插件色環電阻、壓敏電阻、熱敏電阻等。2.貼片電阻2.1 貼片電阻:主要按封裝和功率來分,常用的有0402 1/16W; 0603 1/10W; 0805
    發表于 12-29 06:14

    單片機系統中最常用的通信協議有幾種

    )、MOSI(主機輸出從機輸入Master Output/Slave Input)和MISO(主機輸入從機輸出Master Input/Slave Output)。單片機系統中最常用的通信協議有三種,分...
    發表于 02-17 07:43

    單片機系統中最常用的三種通信協議是什么?

    單片機系統中最常用的三種通信協議是什么?
    發表于 02-17 06:03

    EMC問題中最常用的手段RC濾波詳細資料說明

    讓我們一起來看看處理 EMC 問題中最常用的手段 -RC 濾波。本文介紹了濾波的概念,并詳細說明了電阻 - 電容(RC)低通濾波器的用途和特性。
    發表于 12-25 07:08 ?8次下載
    EMC問題<b class='flag-5'>中最常用</b>的手段RC濾波詳細資料說明

    聯網應用中最常用的傳感器是什么?

    環境、運動、光電/圖像和健康監測傳感器是物聯網應用中最常用的傳感器類型
    的頭像 發表于 08-16 11:26 ?941次閱讀

    Spring中最常用的11個擴展

    除此之外,我們在使用spring的過程中,有沒有發現它的擴展能力非常強。由于這個優勢的存在,讓spring擁有強大的包容能力,讓很多第三方應用能夠輕松投入spring的懷抱。比如:ro
    的頭像 發表于 01-11 10:31 ?851次閱讀

    剖析Spring中最常用擴展(上)

    我們一說到spring,可能第一個想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優秀設計,使得spring能夠從眾多優秀框架中脫穎而出。
    的頭像 發表于 02-15 16:06 ?719次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>擴展</b><b class='flag-5'>點</b>(上)

    剖析Spring中最常用擴展(中)

    我們一說到spring,可能第一個想到的是 `IOC`(控制反轉) 和 `AOP`(面向切面編程)。 沒錯,它們是spring的基石,得益于它們的優秀設計,使得spring能夠從眾多優秀框架中脫穎而出。
    的頭像 發表于 02-15 16:06 ?486次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>Spring</b><b class='flag-5'>中最常用</b>的<b class='flag-5'>擴展</b><b class='flag-5'>點</b>(中)

    基于spring的SPI擴展機制是如何實現的?

    基本上,你一說是基于 spring 的 SPI 擴展機制,再把spring.factories文件和EnableAutoConfiguration提一,那么這個問題就答的八九不離十了
    的頭像 發表于 03-07 09:17 ?1003次閱讀

    Spring中11個最常用擴展分享1

    在使用spring的過程中,我們有沒有發現它的擴展能力很強呢?由于這個優勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發表于 05-11 10:48 ?530次閱讀

    Spring中11個最常用擴展分享2

    在使用spring的過程中,我們有沒有發現它的擴展能力很強呢?由于這個優勢的存在,使得spring具有很強的包容性,所以很多第三方應用或者框架可以很容易的投入到spring的懷抱中。今
    的頭像 發表于 05-11 10:48 ?366次閱讀

    講一失效分析中最常用的輔助實驗手段:亮點分析(EMMI)

    EMMI:Emission microscopy 。與SEM,FIB,EB等一起作為最常用的失效分析手段。
    的頭像 發表于 06-12 18:21 ?6738次閱讀
    講一<b class='flag-5'>下</b>失效分析<b class='flag-5'>中最常用</b>的輔助實驗手段:亮點分析(EMMI)