依赖查找的来源
查找来源
| Bean 名称 | 配置元数据 | 备注 |
|---|---|---|
| Spring BeanDefinition | ||
| Spring BeanDefinition | @Bean public User user(){} | |
| 单例对象 | API 实现 |
Spring 內建 BeanDefintion
| Bean 名称 | Bean 实例 | 使用场景 |
|---|---|---|
| org.springframework.context. annotation.internalConfigur ationAnnotationProcessor |
ConfigurationClassPostProcessor 对象 | 用来处理 Spring 配置类 |
| org.springframework.context. annotation.internalAutowire dAnnotationProcessor |
AutowiredAnnotationBeanPostProcessor 对象 | 处理 @Autowired 以及 @Value 注解(构造器代码里 add 了上述两个注解) |
| org.springframework.context. annotation.internalCommonAn notationProcessor |
CommonAnnotationBeanPostProcessor 对象 | (条件激活)处理 JSR-250 注解, 如 @PostConstruct 等 |
| org.springframework.context. event.internalEventListener Processor |
EventListenerMethodProcessor 对象 | 处理标注 @EventListener 的 Spring 事件监听方法(直接标注在方法上就行,无需实现 ApplicationListener 接口) |
| org.springframework.context. event.internalEventListener Factory |
DefaultEventListenerFactory 对 象 |
@EventListener 事件监听方法适 配为 ApplicationListener |
| org.springframework.context. annotation.internalPersiste nceAnnotationProcessor |
PersistenceAnnotationBeanPostProcessor 对象 | (条件激活)处理 JPA 注解场景 |
相关代码
先在 xml 文件中配置以下内容(当前来说不用弄,直接跟源码就行)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/beans/spring-context.xsd"><context:annotation-config/><context:component-scan base-package="mindartisan.blog.csdn.net.XXX"/><bean id="user" class="com.mindartisan.spring.geek.ioc.overview.domain.User" autowire="byName"><property name="id" value="1"/><property name="name" value="Steve"/></bean><bean id="superUser" class="com.mindartisan.spring.geek.ioc.overview.domain.SuperUser" parent="user"primary="true"><property name="address" value="北京"/></bean><!-- 延迟查找使用 --><bean id="objectFactoryCreatingFactoryBean"class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"><property name="targetBeanName" value="user"/></bean></beans>
再来看 AnnotationConfigUtils.class
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);if (beanFactory != null) {if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);}if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());}}Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));}// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition();try {def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,AnnotationConfigUtils.class.getClassLoader()));}catch (ClassNotFoundException ex) {throw new IllegalStateException("Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);}def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));}return beanDefs;}
Spring 内建单例对象
| Bean 名称 | Bean 实例 | 使用场景 |
|---|---|---|
| environment | Environment 对象 | 外部化配置:Java 系统的属性,比如 -D 参数 Profiles:比如 dev、test |
| systemProperties | java.util.Properties 对象 | Java 系统属性、系统路径或目录 |
| systemEnvironment | java.util.Map 对象 | 操作系统的环境变量(主要指当前用户环境变量) |
| messageSource | MessageSource 对象 | 国际化文案 |
| lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器(Bean 生命周期) |
| applicationEventMulticaster | ApplicationEventMulticaster 对象 | 事件广播 |
相关代码
AbstractApplicationContext.class
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 无关代码// Register default environment beans.if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());}if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());}if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());}}/*** Initialize the ApplicationEventMulticaster.* Uses SimpleApplicationEventMulticaster if none defined in the context.* @see org.springframework.context.event.SimpleApplicationEventMulticaster*/protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isTraceEnabled()) {logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isTraceEnabled()) {logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");}}}/*** Initialize the LifecycleProcessor.* Uses DefaultLifecycleProcessor if none defined in the context.* @see org.springframework.context.support.DefaultLifecycleProcessor*/protected void initLifecycleProcessor() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {this.lifecycleProcessor =beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);if (logger.isTraceEnabled()) {logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");}}else {DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();defaultProcessor.setBeanFactory(beanFactory);this.lifecycleProcessor = defaultProcessor;beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);if (logger.isTraceEnabled()) {logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");}}}/*** Initialize the MessageSource.* Use parent's if none defined in this context.*/protected void initMessageSource() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);// Make MessageSource aware of parent MessageSource.if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;if (hms.getParentMessageSource() == null) {// Only set parent context as parent MessageSource if no parent MessageSource// registered already.hms.setParentMessageSource(getInternalParentMessageSource());}}if (logger.isTraceEnabled()) {logger.trace("Using MessageSource [" + this.messageSource + "]");}}else {// Use empty MessageSource to be able to accept getMessage calls.DelegatingMessageSource dms = new DelegatingMessageSource();dms.setParentMessageSource(getInternalParentMessageSource());this.messageSource = dms;beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);if (logger.isTraceEnabled()) {logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");}}}
依赖注入的来源
注入来源
| Bean 名称 | 配置元数据 | 备注 |
|---|---|---|
| Spring BeanDefinition | ||
| Spring BeanDefinition | @Bean public User user(){} | |
| Spring BeanDefinition | BeanDefinitionBuilder | |
| 单例对象 | API 实现 | |
| 非 Spring 容器管理对象(非推广对象;游离对象) | ResolvaleDependency | |
| 外部化配置 | @Value 注解读取配置文件 |
代码示例
/*** 依赖来源示例** @author mindartisan.blog.csdn.net* @date*/public class DependencySourceDemo {// 注入在 postProcessProperties 方法执行,早于 setter 注入,也早于 @PostConstrut@Autowiredprivate BeanFactory beanFactory;@Autowiredprivate ResourceLoader resourceLoader;@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;@PostConstructpublic void initByInjection() {System.out.println("beanFactory == applicationContext -> " + (beanFactory == applicationContext));System.out.println("beanFactory == applicationContext.getBeanFactory -> " + (beanFactory == applicationContext.getAutowireCapableBeanFactory()));System.out.println("resourceLoader == applicationContext -> " + (resourceLoader == applicationContext));System.out.println("applicationEventPublisher == applicationContext -> " + (applicationEventPublisher == applicationContext));}@PostConstructpublic void initByLookUp() {getBean(BeanFactory.class);getBean(ApplicationContext.class);getBean(ResourceLoader.class);getBean(ApplicationEventPublisher.class);}public <T> T getBean(Class<T> beanType) {try {return beanFactory.getBean(beanType);} catch (NoSuchBeanDefinitionException e) {System.err.println("当前类型:" + beanType.getName() +" 无法在 BeanFactory 中查找!");}return null;}public static void main(String[] args) {// 创建 BeanFactory 容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();// 注册 配置类(配置类也是 Spring 的 Bean)applicationContext.register(DependencySourceDemo.class);// 启动 Spring 应用上下文applicationContext.refresh();// 依赖查找 AnnotationDependencyFieldInjectionDemo beanDependencySourceDemo demoBean = applicationContext.getBean(DependencySourceDemo.class);// 关闭 Spring 应用上下文applicationContext.close();}}
此 demo 的含义是为了证明 resolvableDependencies中的 bean 不是依赖查找中的来源,而是依赖注入中的来源。
源码分析
AbstractApplicationContext#refresh() -> AbstractApplicationContext#prepareBeanFactory()
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 无关代码// BeanFactory interface not registered as resolvable type in a plain factory.// MessageSource registered (and found for autowiring) as a bean.beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);beanFactory.registerResolvableDependency(ResourceLoader.class, this);beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);beanFactory.registerResolvableDependency(ApplicationContext.class, this);}
DefaultListableBeanFactory#registerResolvableDependency()
@Overridepublic void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue) {Assert.notNull(dependencyType, "Dependency type must not be null");if (autowiredValue != null) {if (!(autowiredValue instanceof ObjectFactory || dependencyType.isInstance(autowiredValue))) {throw new IllegalArgumentException("Value [" + autowiredValue +"] does not implement specified dependency type [" + dependencyType.getName() + "]");}this.resolvableDependencies.put(dependencyType, autowiredValue);}}
DefaultListableBeanFactory#resolveDependency() -> DefaultListableBeanFactory#doResolveDependency() -> DefaultListableBeanFactory#findAutowireCandidates():
protected Map<String, Object> findAutowireCandidates(@Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager());Map<String, Object> result = new LinkedHashMap<>(candidateNames.length);// 重点是这玩意:this.resolvableDependencies.entrySet()// 断点位置下一行for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {Class<?> autowiringType = classObjectEntry.getKey();if (autowiringType.isAssignableFrom(requiredType)) {Object autowiringValue = classObjectEntry.getValue();autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);if (requiredType.isInstance(autowiringValue)) {result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);break;}}}

Spring容器管理和游离对象
| 来源 | Spring Bean 对象 | 生命周期管理 | 配置元信息 | 使用场景 | 备注 |
|---|---|---|---|---|---|
| Spring BeanDefinition | √ | √ | 有 | 查找、注入 | |
| Spring 内建单例对象 | √ | × | 无 | 查找、注入 | |
| Resolvable Dependency | × | × | 无 | 注入 |
Spring BeanDefinition 作为依赖来源
通过 BeanDefinitionRegistry#registerBeanDefinition 传递 BeanDefinition
/*** Register a new bean definition with this registry.* Must support RootBeanDefinition and ChildBeanDefinition.* @param beanName the name of the bean instance to register* @param beanDefinition definition of the bean instance to register* @throws BeanDefinitionStoreException if the BeanDefinition is invalid* @throws BeanDefinitionOverrideException if there is already a BeanDefinition* for the specified bean name and we are not allowed to override it* @see GenericBeanDefinition* @see RootBeanDefinition* @see ChildBeanDefinition*/void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;
源码分析
DefaultListableBeanFactory#registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {Assert.hasText(beanName, "Bean name must not be empty");Assert.notNull(beanDefinition, "BeanDefinition must not be null");if (beanDefinition instanceof AbstractBeanDefinition) {try {// validate() 方法在 BeanDefinitionBuilder 中也使用了((AbstractBeanDefinition) beanDefinition).validate();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Validation of bean definition failed", ex);}}// map 由来:private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);if (existingDefinition != null) {if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);}else if (existingDefinition.getRole() < beanDefinition.getRole()) {// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTUREif (logger.isInfoEnabled()) {logger.info("Overriding user-defined bean definition for bean '" + beanName +"' with a framework-generated bean definition: replacing [" +existingDefinition + "] with [" + beanDefinition + "]");}}else if (!beanDefinition.equals(existingDefinition)) {if (logger.isDebugEnabled()) {logger.debug("Overriding bean definition for bean '" + beanName +"' with a different definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}else {if (logger.isTraceEnabled()) {logger.trace("Overriding bean definition for bean '" + beanName +"' with an equivalent definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}this.beanDefinitionMap.put(beanName, beanDefinition);}else {if (hasBeanCreationStarted()) {// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;removeManualSingletonName(beanName);}}else {// Still in startup registration phasethis.beanDefinitionMap.put(beanName, beanDefinition);// beanDefinitionNames 由来:/** List of bean definition names, in registration order. */// private volatile List<String> beanDefinitionNames = new ArrayList<>(256);// beanDefinitionNames 作用:保证注册的顺序this.beanDefinitionNames.add(beanName);removeManualSingletonName(beanName);}this.frozenBeanDefinitionNames = null;}if (existingDefinition != null || containsSingleton(beanName)) {resetBeanDefinition(beanName);}}
注意:依赖注入阶段的延迟注入是用代理的方式;依赖查找是 bean 已经 ready 了,延迟非延迟没啥大区别
单例对象作为依赖来源
来源:外部的普通 Java 对象
注册方式:SingletonBeanRegistry#registerSingletion
限制:无生命周期管理以及无法延迟初始化 Bean(因为单体对象是外部已初始化对象,所以不存在 Lazy 的问题,Lazy 针对于 BeanDefinition,而非具体对象。)
源码分析
SingletonBeanRegistry#registerSingleton(String beanName, Object singletonObject) 由 DefaultSingletonBeanRegistry#registerSingleton(String beanName, Object singletonObject) 实现
/** Cache of singleton objects: bean name to bean instance. */private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);/** Cache of singleton factories: bean name to ObjectFactory. */private final Map<String, r<?>> singletonFactories = new HashMap<>(16);/** Cache of early singleton objects: bean name to bean instance. */private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);/** Set of registered singletons, containing the bean names in registration order. */private final Set<String> registeredSingletons = new LinkedHashSet<>(256);@Overridepublic void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {Assert.notNull(beanName, "Bean name must not be null");Assert.notNull(singletonObject, "Singleton object must not be null");// 此处加锁是因为是一个二元操作:get、addsynchronized (this.singletonObjects) {Object oldObject = this.singletonObjects.get(beanName);if (oldObject != null) {throw new IllegalStateException("Could not register object [" + singletonObject +"] under bean name '" + beanName + "': there is already object [" + oldObject + "] bound");}addSingleton(beanName, singletonObject);}}/*** Add the given singleton object to the singleton cache of this factory.* <p>To be called for eager registration of singletons.* @param beanName the name of the bean* @param singletonObject the singleton object*/protected void addSingleton(String beanName, Object singletonObject) {// 此处加锁的原因是可能会被单独调用synchronized (this.singletonObjects) {this.singletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}
非Spring 容器管理对象作为依赖来源
限制:无生命周期管理、无法实现延迟初始化 bean、无法依赖查找(只能依赖注入)
源码分析
/*** Resolvable Dependency 示例** @author mindartisan.blog.csdn.net* @date*/public class ResolvableDependencySourceDemo {@Autowiredprivate String value;@PostConstructpublic void init() {System.out.println(value);}public static void main(String[] args) {// 创建 BeanFactory 容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();// 注册 配置类(配置类也是 Spring 的 Bean)applicationContext.register(ResolvableDependencySourceDemo.class);// 下行代码执行晚于 refresh 方法,可以 debug 发现// invokeBeanFactoryPostProcessors() 方法早于 bean 初始化「finishBeanFactoryInitialization()」之前applicationContext.addBeanFactoryPostProcessor(beanFactory -> beanFactory.registerResolvableDependency(String.class, "Hello,World"));// 启动 Spring 应用上下文applicationContext.refresh();// AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();// if ((autowireCapableBeanFactory instanceof ConfigurableListableBeanFactory)) {// ConfigurableListableBeanFactory configurableListableBeanFactory = ConfigurableListableBeanFactory.class.cast(autowireCapableBeanFactory);// configurableListableBeanFactory.registerResolvableDependency(String.class, "Hello,World");// }// 关闭 Spring 应用上下文applicationContext.close();}}
总结:
注册非 Spring 管理的依赖对象时,可以通过两种方式实现:
- 通过 ApplicationContext.getBeanFactory() 获取 AnnotationConfigApplicationContext 创建时初始化的 DefaultListableBeanFactory 对象,然后调用 registryResolveableDependency 来注册,为啥不能通过 getAutowireCapableBeanFactory() 来获取beanFactory对象,因为方法中需要 beanFactory 已被激活即执行了 ApplicationContext的refresh() 操作之后
- 通过 addBeanFactoryPostProcessor 回调方式实现,因为当 refresh() 方法执行 invokeBeanFactoryPostProcessors() 时会遍历已创建的 beanFactoryPostProcessors 集合对象来执行 postProcessBeanFactory() 方法
外部化配置作为依赖来源
用到了 @Value注解,处理类似 @Autowired处理流程
相关代码:
ExternalConfigurationDependencySourceDemo.class
/*** 外部化配置作为依赖来源 示例** @author mindartisan.blog.csdn.net* @date*/@Configuration@PropertySource(value = "META-INF/default.properties",encoding="UTF-8")public class ExternalConfigurationDependencySourceDemo {@Value("${user.id:-1}")private Long id;@Value("${usr.name}")private String name;@Value("${user.resource:classpath://default.properties}")private Resource resource;public static void main(String[] args) {// 创建 BeanFactory 容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();// 注册 Configuration Class(配置类) -> Spring BeanapplicationContext.register(ExternalConfigurationDependencySourceDemo.class);// 启动 Spring 应用上下文applicationContext.refresh();// 依赖查找 ExternalConfigurationDependencySourceDemo BeanExternalConfigurationDependencySourceDemo demo = applicationContext.getBean(ExternalConfigurationDependencySourceDemo.class);System.out.println("demo.id = " + demo.id);System.out.println("demo.name = " + demo.name);System.out.println("demo.resource = " + demo.resource);// 显示地关闭 Spring 应用上下文applicationContext.close();}}
default.properties
user.id = 1usr.name = mindartisan.blog.csdn.netuser.resource = classpath://META-INF/default.properties
源码分析
DefaultListableBeanFactory#doResolveDependency()
@Nullablepublic Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {// 无关代码Class<?> type = descriptor.getDependencyType();// 在下行代码处理注入的值Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);if (value != null) {if (value instanceof String) {String strVal = resolveEmbeddedValue((String) value);BeanDefinition bd = (beanName != null && containsBean(beanName) ?getMergedBeanDefinition(beanName) : null);value = evaluateBeanDefinitionString(strVal, bd);}TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());try {return converter.convertIfNecessary(value, type, descriptor.getTypeDescriptor());}catch (UnsupportedOperationException ex) {// A custom TypeConverter which does not support TypeDescriptor resolution...return (descriptor.getField() != null ?converter.convertIfNecessary(value, type, descriptor.getField()) :converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));}}// 无关代码}
