場景:
在代碼中需要動態獲取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配置文件中聲明,要么加上注解