亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring擴展BeanFactoryPostProcessor使用技巧詳解

 更新時間:2022年09月27日 16:30:51   作者:rookie_only  
這篇文章主要為大家介紹了Spring擴展BeanFactoryPostProcessor使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1、Spring 擴展點 BeanFactoryPostProcessor 使用技巧

方法

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
throws BeansException;

其中提供一個 ConfigurableListableBeanFactory 回調(diào)對象,里面提供了很多框架內(nèi)部使用的方法,建議的話使用它的實現(xiàn)類去注冊 Bean 的信息。

不建議使用里面的方法直接實例化對象,因為過早的創(chuàng)建對象會導致后續(xù) Spring 一些對 Bean 修飾執(zhí)行不到,生命周期不完整。

1.1、BeanDefinitionRegistryPostProcessor

BeanFactoryPostProcessor 的實現(xiàn)類。

調(diào)用位置

org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, 
java.util.List<org.springframework.beans.factory.config.BeanFactoryPostProcessor>)

方法

void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 
throws BeansException;

一般來使用當前方法來注冊 BeanDefinition。

void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)            throws BeanDefinitionStoreException;

第一個參數(shù)填的是 Bean 的名稱,第二個就是 Bean 的信息。一般可以使用以下方式去獲取 BeanDefinition。

1.1.1、ScannedGenericBeanDefinition

public class Test {
    private static final PathMatchingResourcePatternResolver PATTERN_RESOLVER = new PathMatchingResourcePatternResolver();
    private static final CachingMetadataReaderFactory READER_FACTORY = new CachingMetadataReaderFactory();
    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
    public static void main(String[] args) throws IOException {
        System.out.println(doScan("com.rookie.mybatis.study"));
    }
    private static List<ScannedGenericBeanDefinition> doScan(String basePackage) throws IOException {
        basePackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                resolveBasePackage(basePackage) + '/' + DEFAULT_RESOURCE_PATTERN;
        List<ScannedGenericBeanDefinition> result = new ArrayList<>();
//        當前會掃描該類下所有的類文件
        Resource[] resources = PATTERN_RESOLVER.getResources(basePackage);
        for (Resource resource : resources) {
            MetadataReader metadataReader = READER_FACTORY.getMetadataReader(resource);
            ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
            sbd.setSource(resource);
            result.add(sbd);
        }
        return result;
    }
    private static String resolveBasePackage(String basePackage) {
        return ClassUtils.convertClassNameToResourcePath(new StandardEnvironment().resolveRequiredPlaceholders(basePackage));
    }
}

以上方式會將包下的所有類都掃描到然后添加到 Spring 容器當中,以上代碼參考于 Mybatis 注冊 Bean 的方式。

1.1.2、AnnotatedGenericBeanDefinition

這種方式就很直接了。直接 new 一個對象將需要的 Bean 的 class 放進去。

AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(Test.class);

1.1.3、RootBeanDefinition

這個實現(xiàn)類和上面很類似,只不過多了幾個構(gòu)造方法:

RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Test.class);
public RootBeanDefinition(String beanClassName);

最主要的還是以下的構(gòu)造器:

public RootBeanDefinition(@Nullable Class<?> beanClass, @Nullable ConstructorArgumentValues cargs,@Nullable MutablePropertyValues pvs);

這個的話多了幾個參數(shù),ConstructorArgumentValues,看名字就大概可以猜的出是傳構(gòu)造參數(shù)的。當我們需要創(chuàng)建的 Bean 是有參構(gòu)造器時,我們就可以使用當前方法將構(gòu)造參數(shù)傳遞進去。

        ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
        //        添加構(gòu)造參數(shù)        
        constructorArgumentValues.addGenericArgumentValue(111);

這個添加的順序就代表了構(gòu)造器參數(shù)的順序。

第二個對象我們可以通過它去修改類屬性的值。

// 修改類屬性的值
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
mutablePropertyValues.addPropertyValue("age",555);

當然我們也可以通過其他工具類去創(chuàng)建:

BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(TestBean.class);
beanDefinitionBuilder.addConstructorArgValue(1);registry.registerBeanDefinition("testBean",beanDefinitionBuilder.getBeanDefinition());

1.2、環(huán)境變量 Environment

一般我們創(chuàng)建 Bean 的時候都喜歡去讀 yml 的配置文件,但是在當前對象中,直接使用注入的方式是獲取不到配置文件的:

@Value("${test.case}")
private String name;
@Autowired
private Environment environment;

這時候我們可以配合另外一個擴展點去獲取環(huán)境變量。因為在當前擴展點執(zhí)行的之后,Environment 是已經(jīng)創(chuàng)建了放置進了 IOC 容器當中,我們需要通過下面的方式去獲取:

@Component
public class Test implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Environment environment = applicationContext.getEnvironment();
        String xx = environment.getProperty("xx");
    }
}

以上就是Spring擴展BeanFactoryPostProcessor使用技巧詳解的詳細內(nèi)容,更多關(guān)于Spring擴展BeanFactoryPostProcessor的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 說說@ModelAttribute在父類和子類中的執(zhí)行順序

    說說@ModelAttribute在父類和子類中的執(zhí)行順序

    這篇文章主要介紹了@ModelAttribute在父類和子類中的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spark SQL 編程初級實踐詳解

    Spark SQL 編程初級實踐詳解

    這篇文章主要為大家介紹了Spark SQL 編程初級實踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 淺析關(guān)于java的序列化和反序列化

    淺析關(guān)于java的序列化和反序列化

    這篇文章主要介紹了淺析關(guān)于java的序列化和反序列化,所謂序列化,就是把要傳輸?shù)膶ο笠约跋嚓P(guān)信息轉(zhuǎn)換成字節(jié)數(shù)組進行存儲的過程,而反序列化就是將字節(jié)數(shù)組再轉(zhuǎn)回對象的過程,需要的朋友可以參考下
    2023-07-07
  • springboot 啟動如何修改application.properties的參數(shù)

    springboot 啟動如何修改application.properties的參數(shù)

    這篇文章主要介紹了springboot 啟動如何修改application.properties的參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)

    Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable)

    本文主要介紹了Java中的三種校驗注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行詳解

    mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行詳解

    這篇文章主要給大家介紹了利用mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • Hikari連接池使用SpringBoot配置JMX監(jiān)控實現(xiàn)

    Hikari連接池使用SpringBoot配置JMX監(jiān)控實現(xiàn)

    Hikari是Spring Boot默認的數(shù)據(jù)庫連接池。區(qū)別于C3P0直接通過連接池對象獲取各項狀態(tài)指標,Hikari需要通過JMX來獲取。本文就詳細的來介紹一下,感興趣的可以了解一下
    2021-07-07
  • Mybatis-Plus環(huán)境配置與入門案例分析

    Mybatis-Plus環(huán)境配置與入門案例分析

    MyBatis-Plus 是一個 Mybatis 增強版工具,在 MyBatis 上擴充了其他功能沒有改變其基本功能,為了簡化開發(fā)提交效率而存在,本篇文章帶你配置環(huán)境并認識它
    2022-03-03
  • SpringBoot讀取外部配置文件的方法

    SpringBoot讀取外部配置文件的方法

    這篇文章主要介紹了SpringBoot讀取外部配置文件的方法,以端口配置為例,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • SpringBoot MDC全鏈路調(diào)用日志跟蹤實現(xiàn)詳解

    SpringBoot MDC全鏈路調(diào)用日志跟蹤實現(xiàn)詳解

    這篇文章主要為大家介紹了SpringBoot MDC全鏈路調(diào)用日志跟蹤實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論