架构师对Spring的理解

125 阅读8分钟

Spring 组件构成

image.png

  • 核心容器
    • spring-core:控制反转IOC
    • spring-beans:依赖注入DI
      • BeanFactory是spring框架中的核心接口,是工厂模式的具体实现
      • BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时,才会对Bean进行实例化以及依赖注入。
    • spring-context:核心模块之上,扩展了BeanFactory
      • 增加了Bean生命周期控制,框架事件体系以及资源加载透明化等功能。
      • 提供了许多企业级支持,邮件访问,远程访问,任务调度等。
      • applicationContext是核心接口,超类是BeanFactory,不同是实例化后会自动对所有单实例Bean进行实例化和依赖注入,处于使用状态。
    • spring-context-support:对spring IOC的扩展支持,以及IOC子容器
    • spring-context-indexer:spring的类管理组件和Classpath扫描
    • spring-expression:统一表达式EL的拓展模块,可以查询、管理运行中的对象,同时也方便的可以调用对象方法,操作数组,集合等。类似EL,但拓展了额外功能
  • AOP设备支持
    • spring-aop:另一个核心模块AOP主要实现模块。
      • 以JVM的动态代理技术为基础,设计出了一系列AOP横切实现,比如前置通知,返回通知,异常通知等,同时,Pointcut接口匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入
    • spring-aspects:集成自AspectJ框架,主要是提供多种AOP实现方法。
    • spring-instrument:基于 JAVA SE 设计的,AOP的支援模块,主要作用是JVM启动时,生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP功能
  • 数据访问与集成
    • spring-jdbc:JDBC抽象框架的主要实现模块
      • 提供JDBC模版方式,关系数据库对象化方式,simpleJdbc方式,事务管理来简化JDBC编程
      • JdbcTemplate,SimpleJdbcTemplate,NamedParameterJdbcTemplate
    • spring-tx:Spring JDBC事务控制实现模块
      • 使用Spring框架,对事务做了很好的封装,通过AOP配置,可以灵活配置在任何一层
      • 许多需求和应用,直接说过JDBC事务控制,可以灵活配置在任何一层;
      • 一个完整的业务应该对应业务层里的一个方法;业务失败,整个事务回滚;
      • 事务控制放在业务层,但是持久层的设计应遵循一个很重要原则:保证操作原子性,即持久层里面的方法不可分割,所以使用spring JDBC事务控制时,注意其特殊型。
    • spring-orm:ORM框架支持模块
      • 主要集成Hibernate,JPA和Java Data Object(JDO)用于资源管理,数据访问对象(DAO)的实现和事务策略
    • spring-oxm:
      • O/M-mapper,将java对象映射成XML数据,或者将XML数据映射成java对象
    • spring-jms:发送和接收信息,4.1以后还提供对spring-messageing的支撑
  • Web组件
    • spring-web:最基础的Web支持,建立与核心容器之上,通过Servlet或Listeners来初始化IOC容器
    • spring-webmvc:Web-Servlet模块,实现了Spring MVC的Web应用
    • spring-websocket:与Web前端的全双工通讯协议
    • spring-webflux:一个新的非阻塞函数式Reactive Web框架,用来建立异步的,非阻塞的,事件驱动的服务,并且扩展性非常好。
  • 通信报文
    • spring-messaging:为Spring 框架集成一些基础的报文传送
  • 集成测试
    • spring-test:测试提供支持
  • 集成兼容
    • spring-framework-bom:Bill of materials 解决spring不同模块依赖版本问题

Spring 常用注解

  • @Configuration:方法头如果注册了@Bean,将为注册到spring容器中
  • @ComponentScan:默认扫描该类所在包下所有的配置类
  • @Scope:用于指定scope作用域用在类上
  • @Lazy:表示延迟加载
  • @Conditional:spring4开始,按照一定条件进行判断满足则注册到spring中
  • @Import:导入外部资源
  • 生命周期控制
    • @PostConstruct:用于指定初始化方法
    • @PreDestory:用于销毁方法
    • @DependsOn:定义Bean初始化及销毁时间的顺序
  • @Component:泛指组件,当组件不好归类时,可以用这个注解标注
  • @Service:业务层组件
  • @Controller:控制层组件
  • @Repository:数据访问组件
  • @Value:普通数据类型赋值
  • @Autowired:类型装配,(如果按名字,结合@Qualifier一起使用)
  • @PropertySource:读取i配置文件赋值
  • @Qualifier:存在多个实例配合使用
  • @Primary:自动装配时当出现多个Bean候选者时,@Primary作为首选,否则跑异常
  • @Resource:按名次装配,当找不到与名称匹配的bean才会按类型装配
  • ApplicationContextAware:通过上下文缓解对象得到Spring容器中的Bean
  • BeanDefinitionRegistyPostProcessor
    • BeanFactoryPostProcessor接口是BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition
  • @EnableTransactionManagement:添加对事务管理的支持
  • @Transactional:配置声明式事务信息

Spring IOC

  • 定位配置资源
    • ApplicationContext
    • BeanFactroy
    • BeanDefinition
    • BeanDefinitionReader
    • BeanDefinitionScanner
    • AbstractApplicationContext.refresh()
      • obtainFreshBeanFactory()//注册Bean
        • createBeanFactory()//创建Bean工程
        • AbstractRefreshableApplicationContext.loadBecanFactory()//加载资源
          • ClassPathBeanFactoryScanner.scan(this.pageages)//扫描包中的class
          • AnnocationBeanFactoryReader.registry(classes) //读取注解中的Bean
            • DefaultListableBeanFactory.registryBeanDefinition(beanName)
            • beanDefinitionMap.put(beanName,beanDefinition)//存入容器
      • postProcessBeanFactory(beanFactory)//用于拓展BeanFactory后置处理器
      • invokeBeanFactoryPostProcess(beanFactory)//调用拓展的BeanFactory后置处理器
        • postProcess.postProcessBeanFactoryRegistry(registry)
          • registry.registryBeanDefinition(beanName,definition)//循环注册
      • onRefresh()//启动Tomcat容器
      • registryListeners()//注册监听器
      • finishRefresh()//完成,发布事件以及生命周期的处理

实例化 DI操作

  • DefaultListableBeanFactory.getBean()
  • AbstractBeanFactory.doGetBean()//从ioc容器获取bean并依赖注入
    • transformedBeanName(name)转换成规范的bean名称
    • getSingleton(beanName)从单例ioc容器中创建
    • getObjectForBeanInstance()创建工程Bean
    • markBeanAsCreated(beanName)标记已经创建
    • getMergedLocalBeanDefinition(beanName).getDependsOn()//获取依赖
    • getBean(dep)注册以来并给当前Bean
    • createBean(beanName,mdb,args)创建Bean
    • scope.get(beanName,createBean())创建request,session范围的Bean
    • getTypeConverter().convertIfNecessary(bean,requiredType);类型检查
  • AbstractBeanFactory.crateBean(BeanName,mdb,args)创建Bean实例化对象
    • resolveBeanClass(mdb,beanName)
    • resolveBeforeInstantiation(beanName,mdbToUse)
    • doCreateBean()
      • BeanWrapper.createBeanInstance(beanName,mdb,args);
        • instantiateUsingFactoryMethod();//工厂方法进行实例化
        • getInstiatetionStrategy().instantiate();//策略进行实例化
        • BeanUtils.instantiateClass()//反射创建Bean实例
      • AbstractAutowireCapableBeanFactory().initBeanWrapper(bw);
      • AbstractAutowireCapableBeanFactory().populateBean();//赋值(属性实力
        • applyPropertyValues()
          • resolveValueIfNecessary()解析属性值,对类型转换
          • resolveReference()解析引用类型的属性值
          • bw.setPropertyValues()依赖注入
      • AbstractAutowireCapableBeanFactory().initlializeBean();

image.png

20201223192030300.png

20200105225638265.png

Spring 初始化容器的拓展点(生命周期)

  • ApplicationContextInitializer.initialize()整个容器在刷新之前的回调接口
  • BeanDefinitionRegistryPostProcess.postProcessBeanDefinitionRegistry()beanDefinition之后执行
  • beanFcatoryPostProessor.postProcessBeanFactory()读取beanDefinition之后,实例化之前执行
  • InstanctiationAwareBeanPostProcessor初始化阶段
    • postProcessBeforeInstantiation实例化bean之前
    • postProcessAfterInstantiation实例化bean之后
    • postProcessPropertyValues实例化完成,属性注入时触发
    • postProcessBeforeInitialization初始化bean之前
    • postProcessAfterInitialization初始化Bean之后
  • SmartInstantiationAwareBeanPostProcessor
    • predictBeanType 实例化之前,无法得到bean类型时回调该方法决定类型信息
    • determineCandidateConstructors 实例化之前,构造函数之后返回列表
    • getEarlyBeanReference 实例化之后调用
  • BeanFactoryAware 注入属性之前,获取BeanFactory
  • AppicationContextAwareProcessor 实例化之后,初始化之前
    • EnvironmentAware 系统内所有参数
    • EmbeddedValueResolverAware 与@Value类似
    • ResourceLoaderAware 获取ResourceLoader对象
    • ApplicationEventPublisherAware 发布事件
    • MessageSourceAware 国际化拓展
    • ApplicationContextAware 获取上下文
  • BeanNameAware setBeanName时触发
  • @PostConstruct 在postProcessBeforeInitialization之后,InitializingBean.afterPropertiesSet()之前
  • InitializingBean.afterPropertiesSet() 在postProcessAfterInitialization之前
  • FactoryBean 拓展这个类,为实例化bean做一个代理
  • SmartInitializingSingleton.afterSingletonsInstantiated 初始化之后回调,postProcessAfterInitialization 之后
  • CommandLineRunner 启动完毕后,自动执行。多个Order排序
  • DisposableBean.destroy()销毁时触发
  • ApplicationListener Spring的内置监听器
    • ContextRefreshedEvent 上下文refresh()时被触发
    • ContextStartedEvent 上下文start()时触发
    • ContexttoppedEvent 上下文 stop()时触发
    • RequestHandledEvent 用户请求结束后,触发

v2-64762b1ac6e4795790c088a470f11a9a_r.jpg

20210224222910402.png

Spring MVC

  • DispatcherServlet:请求调度
    • 主要属性
      • applicationContext:上下文
      • handlerMappings:url与方法名的匹配
      • handlerAdapter:增强了调用方法时需要的参数等,方便直接调用
      • viewResolver:试图渲染
    • 初始化init操作
      • 初始化applicaitonContext
      • 初始化九大组件
        • MultipartResolver:多文件上传
        • LocalResolver:本地语言环境
        • ThemeResolver:主题模版处理器
        • HandlerMapping:URL映射关系
        • HandlerAdapter:动态参数适配器
        • HandlerExceptionResolver:异常拦截器
        • RequestToViewNameTranslator:视图提取器
        • ViewResovlers:视图转换器
        • FlashMapManager:参数缓存器
    • 执行步骤
      • 用户请求url到 DispatcherServlet 中
      • 委派到HandlerMapping 查找handler
      • 返回执行链 HandlerExecutionChain
      • 查找对应适配器
      • 根据适配器进行执行handler
      • 返回modelAndView到DispatcherServlet
      • 如果需要视图解析就请求ViewResolver返回view
      • 将视图渲染模型数据赋值到request
      • 返回reponse响应

image.png

Spring AOP

  • AopProxy:代理接口
    • JdkDynamicAopProxy:jdk动态代理
    • cglibAopProxy:cglib动态代理
  • Target Object:目标对象
  • Pointcut:切入点
  • AdvisedSupport配置解析
    • 属性解析
      • Aspect:切面
      • targetClass:目标对象Class
      • Target:目标
      • config:aop配置
      • pointCutpattern:切点规则
      • methodCache:命中的方法
    • 实现步骤
      • 通过配置文件解析正则
      • 通过正则匹配符合aop的配置
      • 通过配置通知前置,后置,异常,环绕等定义,配置成执行链放入advices中
      • 最后封装成methodCache中,对于一个方法,一个List
  • Advice 通知回调
    • 前置,后置,返回后,异常,环绕
  • 与IOC的衔接
    • 实例化对象时,加入aop的判断
    • 如果配置了aop则生成代理实例对象,没有则原生对象

源码分析 DI时对bean的拓展

  • postProcessAfterInitialization()
    • wrapIfNecessary()
    • createProxy()
    • DefaultAopProxyFactory.createAopProxy()
    • invoke
      • this.advised.getInterceptorsAndDynamicInterceptionAdvice();返回经过aop代理的通知责任链
      • proceed()触发拦截器链的执行
      • invokeJoinpointUsingReflection()反射调用

u=1186975365,1169730663&fm=253&fmt=auto&app=138&f=JPEG.webp

SpringBoot 自动装配原理

aHR0cDovL3FpdXl1bmNkbi5jaGVueWwuc3BhY2Uvb25lYmxvZy9hcnRpY2xlLzIwMjAwNTE1MTAwMTI2MDA1LnBuZw.png

20200722225500601.png