Spring 组件构成
- 核心容器
- 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-aop:另一个核心模块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的支撑
- spring-jdbc:JDBC抽象框架的主要实现模块
- 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)//循环注册
- postProcess.postProcessBeanFactoryRegistry(registry)
- onRefresh()//启动Tomcat容器
- registryListeners()//注册监听器
- finishRefresh()//完成,发布事件以及生命周期的处理
- obtainFreshBeanFactory()//注册Bean
实例化 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()依赖注入
- applyPropertyValues()
- AbstractAutowireCapableBeanFactory().initlializeBean();
- BeanWrapper.createBeanInstance(beanName,mdb,args);
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 用户请求结束后,触发
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响应
- 主要属性
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()反射调用