![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Spring
文章平均质量分 85
IOC -> DI -> AOP -> TX -> MVC
槑!
这个作者很懒,什么都没留下…
展开
-
【Spring】MVC:HandlerAdapter 适配与执行的过程
前言三个核心接口HttpMessageConverterSpringMVC处理请求和响应时,支持多种类型的请求参数和返回类型,而此种功能的实现就需要对HTTP消息体和参数及返回值进行转换,为此SpringMVC提供了大量的转换类,所有转换类都实现了HttpMessageConverter接口。HttpMessageConverter接口定义了5个方法,用于将HTTP请求报文转换为java对象,以及将java对象转换为HTTP响应报文。对应到SpringMVC的Controller方法,read方法原创 2021-02-23 00:01:25 · 500 阅读 · 1 评论 -
【Spring】MVC:HandlerInterceptor 注册与时序原理
前言HandlerInterceptor 定义public interface HandlerInterceptor { /** * 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器,自定义Controller * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断 * 不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应 */ default boolean preHandle原创 2021-02-23 00:01:07 · 628 阅读 · 2 评论 -
【Spring】MVC:HandlerMapping 初始化及 handler 获取
一、请求的分发过程首先简单描述一下,请求的分发过程。一个请求到来,会走到DispatcherServlet的doDispatch方法。这个方法非常重要,封装了整个请求的分发过程,其中有一段代码如下://根据请求找到对应的handler mappedHandler = getHandler(processedRequest, false);if (mappedHandler == null || mappedHandler.getHandler() == null) { noHand原创 2021-02-23 00:00:58 · 1433 阅读 · 0 评论 -
【Spring】MVC:源码流程(下)运行阶段
运行源码流程时序图DispatchServletdoDispatch()// 中央控制器,控制请求的转发 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = n原创 2021-02-23 00:00:43 · 122 阅读 · 1 评论 -
【Spring】MVC:源码流程(中)Servlet 初始化阶段
初始化运行时序图如下(只列出了核心类和方法):Servlet 的继承关系流程下面进入正文,我们的思路是首先找到 DispatcherServlet 这个类,然后寻找init()方法。我们发现其 init 方法其实在父类 HttpServletBean中,源码如下:init()@Overridepublic final void init() throws ServletException { if (logger.isDebugEnabled()) { logger.de原创 2021-02-23 00:00:33 · 266 阅读 · 1 评论 -
【Spring】MVC:源码流程(上)从监听器启动
Spring MVC启动过程web.xml 配置接下来以一个常见的简单web.xml配置进行Spring MVC启动过程的分析,web.xml配置内容如下:<web-app> <display-name>Web Application</display-name> <!--全局变量配置--> <context-param> <param-name>contextConfigLocation</para原创 2021-02-23 00:00:22 · 192 阅读 · 0 评论 -
【Spring】MVC:九大核心组件分析
SpringMVC相对于前面的IOC、DI、AOP是比较简单的,Spring MVC的核心组件和大致处理流程如下图:DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接收Request并将Request转发给对应的处理组件。HanlerMapping 是 SpringMVC 中 完 成 url 到 Controller 映 射 的 组 件 。DispatcherServlet 接收 Request,然后从 HandlerMapping 查找处原创 2021-02-23 00:00:12 · 1034 阅读 · 0 评论 -
【Spring】SpringMVC 整合示例与优化建议
1.web.xml中添加spring相关配置在web.xml中需要配置spring上下文监听器和springmvc的servlet,并且指定spring上下文配置文件和springmvc配置文件,具体配置如下:<!--spring监听器,指定spring配置文件--><context-param> <param-name>contextConfigLocation</param-name> <param-value>class原创 2021-02-23 00:00:00 · 175 阅读 · 0 评论 -
【Spring】Transation:源码执行流程(下)提交与回滚
剩余流程(提交与回滚)解析前面已经把最重要对象 TransactionStatus 准备流程说清了,剩下的事务控制实际上已经很简单了,获取到 TransactionInfo (主要是内部那个 TransactionStatus 以及对 TransactionSychronizationManager 的操作):后续的操作我们看到,就是三部分:报错做什么、最终做什么、怎么提交。 if (txAttr == null || !(ptm instanceof CallbackPreferringPlatf原创 2021-02-22 15:22:05 · 208 阅读 · 0 评论 -
【Spring】Transation:源码执行流程(上)准备阶段
TransactionAspectSupportinvokeWithinTransaction@Nullable protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, final InvocationCallback invocation) throws Throwable { // If the transaction attribute is null,原创 2021-02-22 15:21:52 · 169 阅读 · 0 评论 -
【Spring】Transation:源码流程核心对象
总览事务对象事务本质还是 JDBC 的 Connection,所以事务对象最终会保存的对象还是 connection5 层封装TransationInfoTransationStatusTransationObjectConnectHolderConnection包含关系TransationInfo -> TransationStatus -> TransationObject -> ConnectHolder -> Connect事务管理器提供原创 2021-02-22 15:21:42 · 225 阅读 · 0 评论 -
【Spring】事务(三大接口、隔离级别、传播属性)及示例
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。特点:事务是恢复和并发控制的基本单位。事务应该具有4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(Automicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(Consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(Isolation)。一个事务的执行不能被其他事原创 2021-02-22 01:14:06 · 354 阅读 · 0 评论 -
【Spring】AOP:源码流程(下)AdviceInterceptor 与回调
Advice 拦截器链获取在为AopProxy代理对象配置拦截器的实现中,有一个取得拦截器的配置过程,这个过程是由 DefaultAdvisorChainFactory 实现的,这个工厂类负责生成拦截器链,在它的 getInterceptorsAndDynamicInterceptionAdvice方法中,有一个适配器和注册过程,通过配置Spring 预先设计好的拦截器,Spring 加入了它对AOP实现的处理。// AdvisedSupportpublic List<Object> ge原创 2021-02-22 01:06:00 · 539 阅读 · 0 评论 -
【Spring】AOP:源码流程(中)方法调用
Advice 拦截器链获取在为AopProxy代理对象配置拦截器的实现中,有一个取得拦截器的配置过程,这个过程是由 DefaultAdvisorChainFactory 实现的,这个工厂类负责生成拦截器链,在它的 getInterceptorsAndDynamicInterceptionAdvice方法中,有一个适配器和注册过程,通过配置Spring 预先设计好的拦截器,Spring 加入了它对AOP实现的处理。// AdvisedSupportpublic List<Object> ge原创 2021-02-22 00:58:38 · 646 阅读 · 0 评论 -
【Spring】AOP:源码流程(上)创建代理 AopProxy
生成代理对象后的问题是,代理对象生成了,那切面是如何织入的?我们知道 InvocationHandler 是 JDK 动态代理的核心,生成的代理对象的方法调用都会委托到 InvocationHandler.invoke()方法。而从 JdkDynamicAopProxy 的源码我们可以看到这个类其实也实现了InvocationHandler,下面我们分析SpringAOP 是如何织入切面的,直接上源码看invoke()方法:invoke()public Object invoke(Object pro原创 2021-02-22 00:58:28 · 355 阅读 · 2 评论 -
【Spring】切面编程及 AOP 示例(注解、xml配置)
1.寻找入口(BeanPostProcessor)postProcessBeforInitialization()public interface BeanPostProcessor { // 为在Bean的初始化前提供回调入口 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } .原创 2021-02-22 00:39:55 · 321 阅读 · 0 评论 -
【Spring】Bean:不同作用域原理
五种作用域源码 doGetBean@SuppressWarnings("unchecked") // 真正实现向IOC容器获取Bean的功能,也是触发依赖注入功能的地方 protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws Beans原创 2021-02-22 00:35:00 · 266 阅读 · 0 评论 -
【Spring】Bean:生命周期与拓展点
首先,什么是 Spring 的扩展点呢?IOC 容器对 bean 的管理从 BeanDefinition 的注册到实例化再到依赖注入,有自己一套默认的流程,而 Spring 预留的扩展点允许某些 bean 干预这个预设的流程。下面来看一个例子:那问题来了,什么样的码农会选择去加班(什么样的 bean 会用到扩展点)?那还用说,肯定是想拿或者已经拿了更多薪水的人啊,公司会它们做更多的事情。同理,当某个 bean 实现了 Spring 中预置的扩展接口,比如 FactoryBean,InitialingB原创 2021-02-21 01:28:23 · 278 阅读 · 6 评论 -
【Spring】DI:循环依赖 singleton 三层缓存
singleton 三层缓存/** Cache of singleton objects: bean name to bean instance. *//** 缓存单例对象, K-V -> BeanName - Bean 实例 */private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);/** Cache of early singleton objects:原创 2021-02-21 01:23:11 · 3345 阅读 · 32 评论 -
【Spring】DI:自动装配 autowire
Spring IOC 容器提供了两种管理Bean依赖关系的方式:显式管理:通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理。autowiring: Spring IOC 容器的依赖自动装配功能,不需要对Bean属性的依赖关系做显式的声明,只需要在配置好 autowiring 属性,IOC 容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的Bean,从而自动地完成依赖注入。通过对 autowiring 自动装配特性的理解,我们知道容器对原创 2021-02-21 01:10:55 · 1277 阅读 · 8 评论 -
【Spring】DI:FactoryBean 与解析
Spring IOC 容器提供了两种管理Bean依赖关系的方式:显式管理:通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理。autowiring: Spring IOC 容器的依赖自动装配功能,不需要对Bean属性的依赖关系做显式的声明,只需要在配置好 autowiring 属性,IOC 容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的Bean,从而自动地完成依赖注入。通过对 autowiring 自动装配特性的理解,我们知道容器对原创 2021-02-21 01:08:16 · 202 阅读 · 1 评论 -
【Spring】DI:懒加载与 finishBeanFactoryInitialization
我们已经知道 IOC 容器的初始化过程就是对 Bean 定义资源的定位、载入和注册。此时容器对Bean的依赖注入并没有发生,依赖注入主要是在应用程序第一次向容器索取Bean时,通过getBean()方法的调用完成。当Bean定义资源的<Bean>元素中配置了 lazy-init=false 属性时,容器将会在初始化的时候对所配置的 Bean 进行预实例化,Bean 的依赖注入在容器初始化的时候就已经完成。这样,当应用程序第一次向容器索取被管理的 Bean时,就不用再初始化和对 Bean进行依赖原创 2021-02-21 01:07:37 · 185 阅读 · 0 评论 -
【Spring】DI:源码流程的核心类时序图
DI 可以分为两步:实例化Bean => 依赖注入【Spring】DI:源码分析(上)实例化Bean【Spring】DI:源码分析(下)依赖注入DI的时序图如下(只列出了核心类):原创 2021-02-21 01:00:11 · 185 阅读 · 0 评论 -
【Spring】DI:源码流程(下)依赖注入
在上一篇的分析中我们已经了解到Bean的依赖注入主要分为两个步骤首先调用createBeanInstance()方法生成 Bean 所包含的 Java对象实例然后调用 populateBean()方法,对 Bean属性的依赖注入进行处理。现在我们继续分析生成对象后,Spring IOC 容器是如何将 Bean 的属性依赖关系注入 Bean 实例对象中并设置好的。1.准备依赖注入 (AbstractAutowireCapableBeanFactory)回到AbstractAutowireCap原创 2021-02-21 00:59:32 · 172 阅读 · 0 评论 -
【Spring】DI:源码流程(上)实例化Bean
当SpringIOC 容器完成了Bean定义资源的定位、载入和解析注册以后,IOC 容器中已经管理了Bean定义的相关数据,但是此时 IOC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:用户第一次调用 getBean() 方法时,IOC 容器触发依赖注入当用户在配置文件中将元素配置了lazy-init=false属性,即让容器在解析注册 Bean 定义时进行预实例化,触发依赖注入DI 大致可以两步:实例化Bean => 依赖注入1.寻找获取Bean的入口 (A原创 2021-02-20 23:56:52 · 164 阅读 · 0 评论 -
【Spring】四种依赖注入方式(xml、注解)
DI(DependencyInjection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说就。是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。1.set方法注入public class Student { private String name; private Teacher teacher; public String getName() {return name;} public void s原创 2021-02-20 23:56:11 · 1639 阅读 · 1 评论 -
【Spring】IOC:源码流程的核心类时序图
IOC 容器初始化可以简单的分为三步:定位 Resource => 加载 BeanDefinition => 注册 BeanDefinition【Spring】IOC:初始化流程源码分析(上)定位 Resource【Spring】IOC:初始化流程源码分析(中)加载 BeanDefinition【Spring】IOC:初始化流程源码分析(下)注册 BeanDefinition初始化过程的简易时序图如下(只列出了核心类):初始化的入口在容器实现中的refresh()调用来完成。对原创 2021-02-20 23:55:40 · 386 阅读 · 0 评论 -
【Spring】IOC:初始化源码流程(下)注册 BeanDefinition
向IOC容器注册在第二步解析好的 BeanDefinition,这个过程是通过 BeanDefinitionRegistery 接口来实现的。在 IOC 容器内部其实是将第二个过程解析得到的 BeanDefinition 注入到一个 HashMap 容器中,IOC 容器就是通过这个 HashMap 来维护这些 BeanDefinition 的。在这里需要注意的一点是这个过程并没有完成依赖注入,依赖注册是发生在应用第一次调用 getBean() 向容器索要 Bean 时。当然我们可以通过设置预处理,即对.原创 2021-02-20 23:54:27 · 192 阅读 · 1 评论 -
【Spring】IOC:初始化源码流程(中)加载 BeanDefinition
装载就是 BeanDefinition 的载入。BeanDefinitionReader 读取、解析 Resource 资源,也就是将用户定义的 Bean 表示成 IOC 容器的内部数据结构:BeanDefinition。在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,在配置文件中每一个都对应着一个BeanDefinition对象。1.分配解析策略 (XmlBeanDefinitionReader)doLoadBeanDefinition(Doc,Res)XmlBe.原创 2021-02-20 23:53:56 · 213 阅读 · 0 评论 -
【Spring】IOC:初始化源码流程(上)定位 Resource
1.寻找入口 (ClassPathXmlApplication)ClassPathXmlApplicationContext()ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");进入ClassPathXMLApplication查看其相应构造函数:public ClassPathXmlApplicationContext(String configLocation) throws Bean.原创 2021-02-20 23:53:16 · 232 阅读 · 0 评论 -
【Spring】IOC:核心组件及继承关系类图
下图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IoC 体系中大部分的核心类和接口:下面我们就针对这个图进行简单的拆分和补充说明。1.Resource 体系org.springframework.core.io.Resource,对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。2.ResourceLoader原创 2021-02-20 23:52:36 · 506 阅读 · 0 评论 -
【Spring】实体Bean构建方式(xml、JavaConfig)及相关配置
在JAVA的世界中,一个对象A怎么才能调用对象B?通常有以下几种方法:类别描述时间点外部传入构造方法传入属性设置传入设置对象状态时运行时做为参数传入调用时内部创建属性中直接创建创建引用对象时初始化方法创建创建引用对象时运行时动态创建调用时上表可以看到, 引用一个对象可以在不同地点(其它引用者)、不同时间由不同的方法完成。如果B只是一个非常简单的对象 如直接new B(),怎样都不会觉得复杂,比如你从来不会觉得创建一个Str原创 2021-02-20 23:52:05 · 568 阅读 · 0 评论 -
【Spring】整体架构及模块依赖关系
1.整体架构1.1 核心容器组成:spring-beans、 spring-core、 spring-context、springexpression(SpringExpressionLanguage,SpEL)1.spring-core主要包含 Spring 框架基本的核心工具类, Spring 的其他组件都要用到这个包里的类, Core 模块是其他组件的基本核心。2.spring-beans(BeanFactory)它包含访问配直文件、创建和管理 bean 以及进行 Inversion o原创 2021-02-20 23:51:15 · 409 阅读 · 2 评论