@SpringContext通過實現ApplicationContextAware接口動態獲取bean


場景:

在代碼中需要動態獲取spring管理的bean

目前遇到的主要有兩種場景:
1.在工具類中需要調用某一個Service完成某一個功能,如DictUtils
2.在實現了Runnable接口的任務類中需要調用某一個Service完成run方法中的功能!

代碼:

SpringContextUtils.java

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtils.applicationContext = applicationContext;
        System.out.println("spring容器在項目構建的時候就執行了");
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            //beanDefinitionName是容器中bean實例的id
            //<bean id="">對應此處的id
            System.out.println(beanDefinitionName);
        }
    }

    /**
     * 當通過接口多個實現時,需要用 beanName區分
     *
     * @param name 注冊的 bean名稱
     * @param clazz 注冊的 bean類型
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        if (applicationContext == null){
            return null;
        }
        return applicationContext.getBean(name, clazz);
    }

    /***
     * 根據一個bean的類型獲取配置文件中相應的bean
     */
    public static <T> T getBeanByClass(Class<T> requiredType) {
        if (applicationContext == null) {
            return null;
        }
        return applicationContext.getBean(requiredType);
    }

    public static ApplicationContext getApplicationContext() {
        return ApplicationContextUtils.applicationContext;
    }
}

控制台輸出

spring容器在項目構建的時候就執行了

sqlSessionFactory
org.mybatis.spring.mapper.MapperScannerConfigurer#0
dataSource
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0
transactionManager
org.springframework.aop.config.internalAutoProxyCreator
org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0
org.springframework.transaction.interceptor.TransactionInterceptor#0
org.springframework.transaction.config.internalTransactionAdvisor
myTbItemServiceImpl
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
springContext
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor
tbItemMapper
@Service("myTbItemServiceImpl")
public class TbItemServiceImpl implements ITbItemService

這幾個注解所在的包是

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.2.5.RELEASE</version>
</dependency>

SpringContextUtils必須放在Spring容器中

要么在xml配置文件中聲明,要么加上注解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM