美文网首页Spring
Spring | 3.1.x 上

Spring | 3.1.x 上

作者: 不一样的卡梅利多 | 来源:发表于2020-05-20 17:01 被阅读0次

简介

x表示是3.1版本最后的一个版本,该版本发布于2013年1月。主要功能添加了注解配置beans,了解注解解析原理,是理解spring boot 实现的基础。该版本使用ant +ivy构建,
同时将单项目拆分为多项目开发。

Spring Framework 3.1 builds on the Spring Framework 3.0 foundation with a focus on Java-based application configuration and MVC enhancements.

回顾核心类图

IoC-Beans项目
XmlBeanFactory 被标记未过时的,功能迁移到Context 中去。

BeanFactory.png

IoC-Context项目
1、新增AnnotationConfigApplicationContext
2、将AbstractRefreshableApplicationContext,AbstractXmlApplicationContext替换为GenericApplicationContext,因为支持了注解配置,AbstractXmlApplicationContext 不合适了。

Context.png

注解配置实现

功能描述:获取class 的注解,解析成BeanDefinition并且注册。
核心类图
1、Bean定义

BeanDefinition.png

2、注解元数据


AnnotationMeta.png

核心实现代码

public AnnotationConfigApplicationContext() {
    this.reader = new AnnotatedBeanDefinitionReader(this);
    this.scanner = new ClassPathBeanDefinitionScanner(this);
}

public void register(Class<?>... annotatedClasses) {
    Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
    this.reader.register(annotatedClasses);
}
public void scan(String... basePackages) {
    Assert.notEmpty(basePackages, "At least one base package must be specified");
    this.scanner.scan(basePackages);
}

ClassPathBeanDefinitionScanner#scan 包扫描

ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider

ClassPathScanningCandidateComponentProvider#findCandidateComponents()
1、扫描包下面所有满足条件的class 文件
2、递归读取class上面的注解,使用了visitor pattern。

ClassReader reader =new ClassReader(Application.class.getName());
final AnnotationMetadataReadingVisitor visitor =new AnnotationMetadataReadingVisitor(Application.class.getClassLoader());
reader.accept(visitor, 2);
boolean filter = visitor.isAnnotated(Component.class.getName());

//解析后值保持在 :AnnotationAttributes (map) 中
注解读取核心类.png

3、依据filter 对class 文件进行排除和包含,includeFilters,excludeFilters
默认includeFilters,源码中filter里面只添加了一个@Component注解,但是我们配置的时候还有@Repository, @Controller ,@Service。也会被包含到includeFilters,就是由于注解的递归解析。

protected void registerDefaultFilters() {
             // Component
    this.includeFilters.add(new AnnotationTypeFilter(Component.class));
            //JSR-250
        this.includeFilters.add(new AnnotationTypeFilter(
                ((Class<? extends Annotation>) cl.loadClass("javax.annotation.ManagedBean")), false));
                // JSR-330
        this.includeFilters.add(new AnnotationTypeFilter(
                ((Class<? extends Annotation>) cl.loadClass("javax.inject.Named")), false));
    
}

4、将满足filter 条件的配置转换为BeanDefinition

小结

1、AOP 部分基本无变化,只扩展了几个默认的AbstractAutoProxyCreator。 AOP 部分之所以变化小,1、只依赖代理的实现技术,2、依赖bean 框架。依赖部分都是比较稳定。

2、IoC-beans 框架基本上也无变化,对bean的处理方式加强了一些功能。相反还去掉了一些功能,比如XmlBeanFactory

3、IOC-context 部分,核心部分也无变化,增加了一些扩展部分。精简了AbstractApplicationContext 的实现类层次。

4、注解的解析流程是Spring boot 项目的基础,注解的递归解析模型是Spring-Annotation-Programming-Model基础,注解解析使用访问者设计模式。

Spring 专题

相关文章

  • Spring | 3.1.x 上

    简介 x表示是3.1版本最后的一个版本,该版本发布于2013年1月。主要功能添加了注解配置beans,了解注解解析...

  • Spring |3.1.x 下

    上节简单介绍了3.1.x 版本较以前版本变化之处,以及如何解析注解。这节详细介绍下注解的整个处理流程。 客户端入口...

  • Spring boot | 启动分析

    spring 注解解析流程回顾 基本流程与3.1.x中基本一致,5.2.x版本在注解解析的时候 ,在加入到注册中心...

  • Cocos2d-x lua的项目创建

    Mac上使用Cocos命令创建Cocos2d-x Lu项目 一、下载cocos2d-x 3.1.x 解压到桌面 二...

  • Android Studio 3.1.x 以后ddms的使用和替

    3.1.x之后,ddms直接在ide上已经找不到了。 从sdk中找到ddms 我们可以通过sdk中tools中的m...

  • Hive 3.1.x 安装

    Hive 安装主要有4个事情 安装meta数据存储,mysql 解压缩安装包配置环境变量 初始化 schema 配...

  • 2019-02-24 三星C5000国行的新版TWRP/备份/刷

    都说三星Galaxy C5 / C5000的twrp 3.1.X难找,未必。 https://vasy.ru/TW...

  • Shiro、Spring Security整合

    Shiro、Spring Security Spring Boot 整合 Spring Security 快速上⼿...

  • spring session入门

    spring sesion 环境:在spring boot基础上开发 spring-session是spring旗...

  • Spring框架-2(IOC上)

    Spring系列文章 Spring框架-1(基础)Spring框架-2(IOC上)Spring框架-3(IOC下)...

网友评论

    本文标题:Spring | 3.1.x 上

    本文链接:https://www.haomeiwen.com/subject/hgsnohtx.html