Spring IOC(Inversion of Control)容器的初始化过程分为几个主要步骤,从创建容器、定位资源、读取和解析配置文件,到最终实例化和初始化bean。
1. 创建IOC容器
根据配置类型选择适当的IOC容器实现。
- XML 配置:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- 注解配置:
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
2. 资源定位
Spring通过ResourceLoader
接口及其实现类来定位资源。通常情况下,XML配置使用ClassPathXmlApplicationContext
进行资源定位,而注解配置使用AnnotationConfigApplicationContext
。
3. 资源读取和解析
根据配置类型不同,Spring会采用不同的读取器来解析配置并生成BeanDefinition
对象:
- XML配置:使用
XmlBeanDefinitionReader
- 注解配置:使用
AnnotatedBeanDefinitionReader
这些读取器将配置文件或类解析成Spring内部的BeanDefinition
对象,这些对象包含了bean的所有配置信息。
4. 注册BeanDefinition
将解析后的BeanDefinition
对象注册到IOC容器中,通过BeanDefinitionRegistry
接口来完成。
5. BeanFactory准备
Spring使用DefaultListableBeanFactory
作为默认的BeanFactory
实现。在这一步,Spring会初始化一些基础设施bean,如BeanPostProcessor
和BeanFactoryPostProcessor
。
6. 实例化和注入依赖关系
这是Spring IOC容器最核心的功能之一,涉及以下几个子步骤:
6.1 实例化Bean
IOC容器根据BeanDefinition
中的信息实例化bean对象。这一步通常通过反射机制来完成。
6.2 设置Bean属性
在实例化bean之后,IOC容器会进行属性注入,将所需的依赖对象注入到bean中。这可以通过构造函数注入、setter方法注入或者字段注入(使用注解)。
6.3 初始化Bean
如果bean实现了InitializingBean
接口,Spring会调用它的afterPropertiesSet
方法。如果在配置文件中指定了init-method
方法,也会被调用。
6.4 Bean的生命周期回调
Spring支持多种生命周期回调,如@PostConstruct
注解的方法,这些方法会在依赖注入完成后调用。
6.5 AOP代理(可选)
如果bean配置了AOP(Aspect-Oriented Programming),在这个阶段Spring会为bean创建相应的代理对象。
示例代码
下面提供了XML配置方式和注解配置方式的完整示例代码。
XML配置方式
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myService" class="com.example.MyService">
<property name="name" value="Example Service"/>
</bean>
</beans>
Java代码示例
Main.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = context.getBean(MyService.class);
System.out.println(myService.getName());
}
}
MyService.java
package com.example;
public class MyService {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
注解配置方式
AppConfig.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
MyService myService = new MyService();
myService.setName("Example Service");
return myService;
}
}
Java代码示例
Main.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = context.getBean(MyService.class);
System.out.println(myService.getName());
}
}
MyService.java
package com.example;
public class MyService {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
关键步骤解析
-
创建IOC容器
- 使用
ClassPathXmlApplicationContext
或AnnotationConfigApplicationContext
来加载配置文件或配置类。
- 使用
-
资源定位
- Spring通过
ResourceLoader
接口及其实现类来找到配置文件或配置类的位置。
- Spring通过
-
资源读取和解析
- 根据配置类型不同,Spring会采用不同的读取器(如
XmlBeanDefinitionReader
或AnnotatedBeanDefinitionReader
)来解析配置并生成BeanDefinition
对象。
- 根据配置类型不同,Spring会采用不同的读取器(如
-
注册BeanDefinition
- 将解析后的
BeanDefinition
对象注册到IOC容器中,通过BeanDefinitionRegistry
接口来完成。
- 将解析后的
-
BeanFactory准备
- Spring使用
DefaultListableBeanFactory
作为默认的BeanFactory
实现。在这一步,Spring会初始化一些基础设施bean,如BeanPostProcessor
和BeanFactoryPostProcessor
。
- Spring使用
-
实例化和注入依赖关系
- 实例化Bean:根据
BeanDefinition
中的信息实例化bean对象。 - 设置Bean属性:进行属性注入,将所需的依赖对象注入到bean中。
- 初始化Bean:调用
InitializingBean
接口的afterPropertiesSet
方法或指定的init-method方法。 - Bean的生命周期回调:调用
@PostConstruct
注解的方法。 - AOP代理(可选):为bean创建AOP代理对象,如果有配置AOP。
- 实例化Bean:根据
通过以上步骤,Spring IOC容器能够成功初始化,并且所有bean都可以正确实例化和注入依赖关系。
资源读取和解析详细流程
XML 配置读取和解析
步骤:
-
创建
XmlBeanDefinitionReader
:XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
-
使用读取器加载和解析配置文件:
int beanCount = reader.loadBeanDefinitions("applicationContext.xml");
核心方法:
loadBeanDefinitions
:负责从XML文件中读取bean定义。doLoadBeanDefinitions
:实际执行XML文件的解析。
示例代码:
public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader {
public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {
Resource resource = getResourceLoader().getResource(location);
return loadBeanDefinitions(resource);
}
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
try (InputStream inputStream = resource.getInputStream()) {
return doLoadBeanDefinitions(inputStream, resource);
} catch (IOException ex) {
throw new BeanDefinitionStoreException("IOException parsing XML document from " + resource, ex);
}
}
protected int doLoadBeanDefinitions(InputStream inputStream, Resource resource) throws BeanDefinitionStoreException {
Document doc = doLoadDocument(inputStream, resource);
return registerBeanDefinitions(doc, resource);
}
// 其他必要的方法...
}
解析XML配置的主要步骤:
- 使用
ResourceLoader
获取配置文件资源。 - 打开输入流读取XML文件内容。
- 将XML内容解析成
Document
对象。 - 遍历
Document
对象,提取bean定义信息并注册为BeanDefinition
对象。
3.2 注解配置读取和解析
步骤:
-
创建
AnnotatedBeanDefinitionReader
:AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(beanFactory);
-
注册配置类:
reader.register(AppConfig.class);
核心方法:
register
:负责从配置类中读取bean定义。
示例代码:
public class AnnotatedBeanDefinitionReader {
private final BeanDefinitionRegistry registry;
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
this.registry = registry;
}
public void register(Class<?>... annotatedClasses) {
for (Class<?> annotatedClass : annotatedClasses) {
registerBean(annotatedClass);
}
}
private void registerBean(Class<?> annotatedClass) {
BeanDefinition beanDefinition = new ScannedGenericBeanDefinition(annotatedClass);
String beanName = determineBeanName(beanDefinition);
registry.registerBeanDefinition(beanName, beanDefinition);
}
// 其他必要的方法...
}
解析注解配置的主要步骤:
- 遍历配置类中的所有bean定义。
- 为每个bean定义创建
BeanDefinition
对象。 - 将
BeanDefinition
对象注册到容器中。
注册BeanDefinition详细流程
无论是XML方式还是注解方式,最终都会生成BeanDefinition
对象并注册到IOC容器中。这个过程通常由BeanDefinitionRegistry
接口实现。
核心接口和类
- BeanDefinitionRegistry: 这是一个接口,定义了注册和获取
BeanDefinition
的基本操作方法。 - DefaultListableBeanFactory: 这是
BeanDefinitionRegistry
接口的主要实现类,也是 Spring IOC 容器的默认实现。 - GenericApplicationContext: 这是一个方便的应用上下文实现类,组合了
DefaultListableBeanFactory
和其他功能。
注册 BeanDefinition 的核心方法
在 BeanDefinitionRegistry
接口中,有几个关键方法:
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
:注册一个新的BeanDefinition
。boolean containsBeanDefinition(String beanName)
:检查是否包含给定名称的BeanDefinition
。BeanDefinition getBeanDefinition(String beanName)
:获取指定名称的BeanDefinition
。
源码分析
BeanDefinitionRegistry
接口
public interface BeanDefinitionRegistry {
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
boolean containsBeanDefinition(String beanName);
String[] getBeanDefinitionNames();
int getBeanDefinitionCount();
}
DefaultListableBeanFactory
类
DefaultListableBeanFactory
是 BeanDefinitionRegistry
的主要实现类,其内部通过一个 ConcurrentHashMap
来存储 BeanDefinition
。
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
@Override
public 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");
synchronized (this.beanDefinitionMap) {
BeanDefinition oldBeanDefinition = this.beanDefinitionMap.get(beanName);
if (oldBeanDefinition != null) {
throw new BeanDefinitionStoreException(beanName,
"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
"': there is already [" + oldBeanDefinition + "] bound.");
}
this.beanDefinitionMap.put(beanName, beanDefinition);
}
// Other logic related to bean definition registration
}
@Override
public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {
BeanDefinition bd = this.beanDefinitionMap.get(beanName);
if (bd == null) {
throw new NoSuchBeanDefinitionException(beanName);
}
return bd;
}
@Override
public boolean containsBeanDefinition(String beanName) {
return this.beanDefinitionMap.containsKey(beanName);
}
@Override
public int getBeanDefinitionCount() {
return this.beanDefinitionMap.size();
}
@Override
public String[] getBeanDefinitionNames() {
return StringUtils.toStringArray(this.beanDefinitionMap.keySet());
}
}
简要流程总结
-
registerBeanDefinition(String beanName, BeanDefinition beanDefinition) :
- 检查 bean 名称和
BeanDefinition
是否为空。 - 使用
synchronized
块确保线程安全。 - 将
BeanDefinition
存入beanDefinitionMap
。 - 如果已经存在同名的
BeanDefinition
,则抛出异常。
- 检查 bean 名称和
-
getBeanDefinition(String beanName) :
- 从
beanDefinitionMap
获取指定名称的BeanDefinition
。 - 如果不存在,则抛出
NoSuchBeanDefinitionException
。
- 从
-
containsBeanDefinition(String beanName) :
- 检查
beanDefinitionMap
中是否包含指定名称的BeanDefinition
。
- 检查
-
getBeanDefinitionCount() :
- 返回
beanDefinitionMap
中的BeanDefinition
数量。
- 返回
-
getBeanDefinitionNames() :
- 返回
beanDefinitionMap
中所有BeanDefinition
的名称。
- 返回
手动注册一个BeanDefinition
流程
-
创建或者获取一个
BeanDefinitionRegistry
实例: 通常情况下,BeanDefinitionRegistry
由容器如DefaultListableBeanFactory
或GenericApplicationContext
提供。BeanDefinitionRegistry registry = new GenericApplicationContext();
-
定义你的Bean: 创建一个
BeanDefinition
实例,可以使用BeanDefinitionBuilder
来简化这个过程。BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(YourBeanClass.class); builder.addPropertyValue("propertyName", "propertyValue"); BeanDefinition beanDefinition = builder.getBeanDefinition();
-
将BeanDefinition注册到BeanDefinitionRegistry: 使用
registerBeanDefinition
方法,将创建好的BeanDefinition
注册到BeanDefinitionRegistry
中。String beanName = "yourBeanName"; registry.registerBeanDefinition(beanName, beanDefinition);
-
使用ApplicationContext获取Bean(如果需要) : 注册完成后,如果你使用的是
GenericApplicationContext
,可以通过该上下文来获取bean实例。if (registry instanceof GenericApplicationContext) { GenericApplicationContext context = (GenericApplicationContext) registry; YourBeanClass bean = context.getBean(beanName, YourBeanClass.class); }
示例代码
以下是一个完整的示例代码,展示了上述步骤:
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
public class BeanDefinitionRegistryExample {
public static void main(String[] args) {
// Step 1: 创建一个ApplicationContext,它实现了BeanDefinitionRegistry接口
GenericApplicationContext context = new AnnotationConfigApplicationContext();
// Step 2: 定义一个Bean
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class);
builder.addPropertyValue("name", "Test Bean");
// 获取BeanDefinition
BeanDefinition beanDefinition = builder.getBeanDefinition();
// Step 3: 将BeanDefinition注册到BeanDefinitionRegistry
String beanName = "myBean";
context.registerBeanDefinition(beanName, beanDefinition);
// 刷新上下文以应用注册的BeanDefinition
context.refresh();
// Step 4: 从ApplicationContext中获取Bean
MyBean myBean = context.getBean(beanName, MyBean.class);
System.out.println(myBean.getName());
}
public static class MyBean {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
思考题1:BeanDefinition
存储结构
ConcurrentHashMap
来存储 BeanDefinition
,具体参考上文。
BeanPostProcessor
和BeanFactoryPostProcessor
接口详细流程
BeanPostProcessor
和BeanFactoryPostProcessor
是两个非常重要的接口,它们允许开发者在bean实例化和初始化过程中插入自定义逻辑。下面是对这两个接口及其底层实现的详细分析。
一、BeanPostProcessor
1. BeanPostProcessor
接口
BeanPostProcessor
提供了两个回调方法,分别在bean初始化前后执行:
package org.springframework.beans.factory.config;
public interface BeanPostProcessor {
// 在bean初始化之前执行
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 在bean初始化之后执行
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
2. 使用示例
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Before Initialization : " + beanName);
return bean; // 可以返回原始bean或者包装后的bean
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("After Initialization : " + beanName);
return bean; // 可以返回原始bean或者包装后的bean
}
}
3. 如何注册BeanPostProcessor
可以在Spring配置文件或Java配置类中注册BeanPostProcessor
:
XML配置:
<bean class="com.example.MyBeanPostProcessor"/>
Java配置:
@Configuration
public class AppConfig {
@Bean
public MyBeanPostProcessor myBeanPostProcessor() {
return new MyBeanPostProcessor();
}
}
二、BeanFactoryPostProcessor
1. BeanFactoryPostProcessor
接口
BeanFactoryPostProcessor
用于在容器初始化后但在任何bean实例化之前修改bean定义。这使得它们能够修改应用程序上下文的内部bean工厂。
package org.springframework.beans.factory.config;
@FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
2. 使用示例
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor is called");
// 可以在这里修改bean定义或添加新的bean定义
}
}
3. 如何注册BeanFactoryPostProcessor
可以在Spring配置文件或Java配置类中注册BeanFactoryPostProcessor
:
XML配置:
<bean class="com.example.MyBeanFactoryPostProcessor"/>
Java配置:
@Configuration
public class AppConfig {
@Bean
public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
return new MyBeanFactoryPostProcessor();
}
}
两个接口的主要功能和实现细节如下:
-
BeanPostProcessor
:- 提供两个回调方法:
postProcessBeforeInitialization
和postProcessAfterInitialization
。 - 在bean初始化前后分别进行处理。
- Spring容器通过调用
applyBeanPostProcessorsBeforeInitialization
和applyBeanPostProcessorsAfterInitialization
方法来应用这些回调。
- 提供两个回调方法:
-
BeanFactoryPostProcessor
:- 提供
postProcessBeanFactory
方法,用于在Spring容器标准初始化之后修改应用上下文的内部bean工厂。
- 提供
InitializingBean
接口详细流程
InitializingBean
接口用于在一个bean属性设置完毕并进行其他初始化操作之后需要执行的额外初始化逻辑。InitializingBean
接口只定义了一个方法:afterPropertiesSet()
。当Spring容器实例化一个bean并完成其依赖注入后,它会自动调用实现InitializingBean
接口的bean的afterPropertiesSet()
方法。
下面是InitializingBean
接口的源码:
package org.springframework.beans.factory;
public interface InitializingBean {
/**
* 被所有bean属性设置后的回调函数。
* @throws Exception 在初始化时抛出的异常
*/
void afterPropertiesSet() throws Exception;
}
处理流程
当Spring容器创建并配置完一个bean后,会在以下几个阶段调用实现了InitializingBean
接口的bean的afterPropertiesSet
方法:
- Bean实例化:Spring容器通过反射机制创建bean实例。
- 依赖注入:Spring容器根据配置对bean的属性进行依赖注入。
- 调用
afterPropertiesSet
方法:如果这个bean实现了InitializingBean
接口,Spring容器会调用其afterPropertiesSet
方法。
实现示例
下面是一个简单的实现示例:
import org.springframework.beans.factory.InitializingBean;
public class MyBean implements InitializingBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void afterPropertiesSet() throws Exception {
// 在这里进行初始化操作
System.out.println("InitializingBean接口的afterPropertiesSet方法被调用,name属性为: " + name);
}
}
如何触发afterPropertiesSet
方法
为了看到afterPropertiesSet
方法的执行,我们可以使用ApplicationContext
来加载和管理我们的bean,如下所示:
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = (MyBean) context.getBean("myBean");
// 此时已经完成初始化,afterPropertiesSet方法已经被调用
context.close();
}
}
这里是beans.xml
文件的内容:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.example.MyBean">
<property name="name" value="Test Name"/>
</bean>
</beans>
源码解析
Spring在处理bean初始化时,最终会调用到AbstractAutowireCapableBeanFactory
类中的invokeInitMethods
方法,该方法负责调用InitializingBean
接口的方法。
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
} catch (PrivilegedActionException pae) {
throw pae.getException();
}
} else {
((InitializingBean) bean).afterPropertiesSet();
}
}
// 执行自定义的初始化方法
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
详细流程总结
-
检查是否实现
InitializingBean
接口:- 首先,方法中使用
instanceof
关键字检查当前bean是否实现了InitializingBean
接口。
- 首先,方法中使用
-
调用
afterPropertiesSet
方法:- 如果bean实现了
InitializingBean
接口,并且没有被外部管理的初始化方法覆盖,则通过反射机制(在有安全管理器时使用AccessController
)调用afterPropertiesSet
方法。
- 如果bean实现了
-
调用自定义初始化方法:
- 如果存在自定义初始化方法并且该方法不是
afterPropertiesSet
,则调用invokeCustomInitMethod
来执行自定义的初始化逻辑。
- 如果存在自定义初始化方法并且该方法不是
BeanDefinition
接口
在Spring的源码中,BeanDefinition
接口及其实现类负责存储bean的各种元数据,如类名、作用域、构造函数参数、属性值等。
BeanDefinition
接口
下面是BeanDefinition
接口的部分代码及相关说明:
package org.springframework.beans.factory.config;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.core.AttributeAccessor;
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
void setParentName(@Nullable String parentName);
@Nullable
String getParentName();
void setBeanClassName(@Nullable String beanClassName);
@Nullable
String getBeanClassName();
void setScope(@Nullable String scope);
@Nullable
String getScope();
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
void setPrimary(boolean primary);
boolean isPrimary();
void setFactoryBeanName(@Nullable String factoryBeanName);
@Nullable
String getFactoryBeanName();
void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();
ConstructorArgumentValues getConstructorArgumentValues();
MutablePropertyValues getPropertyValues();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
int getRole();
@Nullable
String getDescription();
@Nullable
String getResourceDescription();
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
关键方法解析
-
setParentName
和getParentName
:- 设置和获取该bean定义的父bean名称,用于bean继承。
-
setBeanClassName
和getBeanClassName
:- 设置和获取bean的类名。
-
setScope
和getScope
:- 设置和获取bean的作用域(如单例或原型)。
-
setLazyInit
和isLazyInit
:- 设置和判断是否延迟初始化。
-
setDependsOn
和getDependsOn
:- 设置和获取该bean所依赖的其他bean。
-
setAutowireCandidate
和isAutowireCandidate
:- 设置和判断该bean是否可以被自动装配。
-
setPrimary
和isPrimary
:- 设置和判断该bean是否为主要的候选者。
-
setFactoryBeanName
和getFactoryBeanName
:- 设置和获取创建该bean实例的工厂bean的名称。
-
setFactoryMethodName
和getFactoryMethodName
:- 设置和获取用于创建该bean实例的工厂方法的名称。
-
getConstructorArgumentValues
:- 获取构造函数参数值。
-
getPropertyValues
:- 获取属性值。
-
isSingleton
、isPrototype
和isAbstract
:- 判断该bean的作用域类型以及是否为抽象bean定义。
-
getRole
:- 获取bean定义的角色(应用程序、支持、基础设施)。
-
getDescription
:- 获取bean定义的描述。
-
getResourceDescription
:- 获取资源描述信息。