core
Spring Core是Spring框架的基础API核心模块,提供了基本的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)功能。
core核心功能举例
资源管理-系统资源加载
FileSystemResource是Spring框架中的一个实现了Resource接口的类,用于从文件系统中加载资源。它可以根据指定的文件路径来加载文件系统中的资源。
当你使用FileSystemResource加载资源时,你需要提供一个文件路径,它指向文件系统中的实际文件。FileSystemResource将会根据提供的路径去访问文件系统并加载相应的资源。
Bean
IOC容器/DI依赖注入
Spring Core提供了一个容器,也称为应用上下文(Application Context),它负责管理和装配应用程序中的对象。它实现了控制反转(IoC),即框架负责创建和管理对象的生命周期,而不是由开发人员手动创建和管理。同时还通过依赖注入管理对象间的依赖关系。对应的接口为:BeanFactory。
DI 依赖注入
BeanFactory通过Autowire实现依赖注入,AutowiredAnnotationBeanPostProcessor是@Autowire注解的实现类,它是一个后置处理器,用于在Bean实例化后对标记了@Autowired注解的字段、构造函数或方法进行依赖注入。它会扫描Bean中的@Autowired注解,解析注解所标记的依赖关系,并将相应的依赖对象注入到对应的位置。processInjection()方法是在Spring框架中用于执行依赖注入的方法。
//缓存已检查过的成员变量
private final Set<String> lookupMethodsChecked = Collections.newSetFromMap(new ConcurrentHashMap<>(256));
//缓存类的候选构造函数
private final Map<Class<?>, Constructor<?>[]> candidateConstructorsCache = new ConcurrentHashMap<>(256);
//缓存类的依赖注入元数据
private final Map<String, InjectionMetadata> injectionMetadataCache = new ConcurrentHashMap<>(256);
public void processInjection(Object bean) throws BeanCreationException {
Class<?> clazz = bean.getClass();
//查找Bean中的包含@Autowire注解的字段、构造方法、方法
InjectionMetadata metadata = findAutowiringMetadata(clazz.getName(), clazz, null);
try {
metadata.inject(bean, null, null);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
"Injection of autowired dependencies failed for class [" + clazz + "]", ex);
}
}
//遍历方法实现
private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {
// Fall back to class name as cache key, for backwards compatibility with custom callers.
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
// Quick check on the concurrent map first, with minimal locking.
InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);
if (InjectionMetadata.needsRefresh(metadata, clazz)) {
synchronized (this.injectionMetadataCache) {
metadata = this.injectionMetadataCache.get(cacheKey);
if (InjectionMetadata.needsRefresh(metadata, clazz)) {
if (metadata != null) {
metadata.clear(pvs);
}
metadata = buildAutowiringMetadata(clazz);
this.injectionMetadataCache.put(cacheKey, metadata);
}
}
}
return metadata;
}
DI 依赖查找
BeanFactory定义了依赖查找的方法。依赖查找是一种主动获取依赖对象的方式,用于获取其他Bean或依赖的实例。通过依赖查找,可以在需要的时候动态的获取所需的依赖对象,并在代码中使用。