Spring
文章平均质量分 83
Spring...
A minor
本来无一物,何处惹尘埃
展开
-
【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原创 2020-11-30 20:50:28 · 2884 阅读 · 0 评论 -
【Spring】IOC(上):构建 Bean 的几种方式(包括xml、注解)
在JAVA的世界中,一个对象A怎么才能调用对象B?通常有以下几种方法:类别描述时间点外部传入构造方法传入属性设置传入设置对象状态时运行时做为参数传入调用时内部创建属性中直接创建创建引用对象时初始化方法创建创建引用对象时运行时动态创建调用时上表可以看到, 引用一个对象可以在不同地点(其它引用者)、不同时间由不同的方法完成。如果B只是一个非常简单的对象 如直接new B(),怎样都不会觉得复杂,比如你从来不会觉得创建一个Str原创 2020-12-01 00:41:16 · 1536 阅读 · 0 评论 -
【Spring】IOC(下):实体 Bean 的基本配置(包括xml、注解)
在上一篇文章我们介绍了如何通过 xml 和 JavaConfig 去创建 bean,本篇我们来看看如何配置 bean 的一些基本信息。1.作用域类别说明singletonSpring IOC 容器中仅存在一份 bean 实例prototype每次都创建新的实例request一次 http 请求创建一个新的 bean,仅适用于 WebApplicationContextsession一个 session 对应一个 bean 实例,仅适用于 WebApplica原创 2021-02-27 16:09:00 · 194 阅读 · 1 评论 -
【Spring】DI:四种依赖注入方式(包括xml、注解)
DI(DependencyInjection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句话说就。是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。1.set方法注入public class Student { private String name; private Teacher teacher; public String getName() {return name;} public void s原创 2020-12-02 20:42:32 · 2274 阅读 · 0 评论 -
【Spring】AOP:基本概念及aop示例(包括xml、注解)
1.AOP简介1.1 定义面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。1.2 优点利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。1.3 原理aop底层将采用代理机制进行实现。接口 + 实现类:spring 默认采用 jdk 的动态代理 Proxy。实现类:spring 默认采用 cglib 字节码增强。1.4 基本概念target:目标类,需要被代理的类。例如:Use原创 2020-12-05 20:30:20 · 2561 阅读 · 0 评论 -
【Spring】MVC(上):配置使用示例及优化建议
在上一篇分析了springmvc的九大组件,那我们具体该如何使用springmvc呢?1.web.xml中添加spring相关配置在web.xml中需要配置spring上下文监听器和springmvc的servlet,并且指定spring上下文配置文件和springmvc配置文件,具体配置如下:<!--spring监听器,指定spring配置文件--><context-param> <param-name>contextConfigLocation<原创 2020-12-05 20:30:51 · 2322 阅读 · 0 评论 -
【Spring】MVC(下):九大核心组件分析
SpringMVC相对于前面的IOC、DI、AOP是比较简单的,我们首先引用《SpringinAction》上的一张图来了解Spring MVC的核心组件和大致处理流程:①. DispatcherServlet是SpringMVC中的前端控制器(FrontController),负责接收Request并将Request转发给对应的处理组件。② .HanlerMapping 是 SpringMVC 中 完 成 url 到 Controller 映 射 的 组 件 。DispatcherServlet 接原创 2020-12-05 20:33:00 · 1377 阅读 · 0 评论 -
【Spring】日志:使用 spring 时日志的多种选择
前言:由于篇幅所限,关于日志的基础内容请看我的这篇文章 【Java杂记】日志:Java日志体系,从应用场景到发展历史…Spring 底层选择的是 JCL做为日志门面 + JUL 作为日志实现,而 SpringBoot 选择的是 SLF4J 做为日志门面 + Logback 作为日志实现。那我们本篇就来看看在 Spring 中到底可以如何组合使用各种日志框架+日志实现。1.spring 底层日志框架 JCL+ spring 底层的日志实现 JUL首先,引入 spring-context 依赖<.原创 2020-12-12 03:13:55 · 4003 阅读 · 0 评论 -
【Spring】事务(上):三大接口、隔离级别、传播属性
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。特点:事务是恢复和并发控制的基本单位。事务应该具有4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(Automicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。一致性(Consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。隔离性(Isolation)。一个事务的执行不能被其他事原创 2020-12-09 23:13:46 · 1057 阅读 · 0 评论 -
【Spring】事务(下):使用示例(编程式、声明式、注解式)
原文链接:https://blog.csdn.net/weixin_43935927/article/details/110943178在 Spring 中使用事务有三种方式:编程式:在开发代码中通过 TransactionTemplate 直接开启、提交、关闭事务配置式:在 spring 配置文件中通过 tx 标签进行配置,然后借助 aop 实现注解式:在配置文件开启注解,然后在选用使用事务的方法上 @Transactional1.编程式事务管理public class OrdersS.转载 2021-02-27 16:22:05 · 348 阅读 · 0 评论 -
【Spring】SSM整合(附完整代码)
完整的 ssm 整合 demo 我已经放到了 GitHub 上,点击这里跳转…本篇只是贴出来其中最重要的三个配置文件applicationContext.xmlapplicationContext-mvc.xmlweb.xmlSpring 整合 Mybatis<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:x原创 2020-12-14 23:26:03 · 1989 阅读 · 0 评论 -
【Spring】仿写Spring核心逻辑--实现 IOC、DI、MVC
在开始手写前,我们先明确要实现的三个目标:目标一:可以通过自定义注解@MYService、@MYController,将对象交给IOC容器管理public interface IDemoService { String get(String name);}@MYServicepublic class DemoService implements IDemoService { public String get(String name) { return "My name is " +原创 2020-12-02 13:08:57 · 1591 阅读 · 1 评论 -
【Spring】重构--仿写Spring核心逻辑(一)目标及框架结构
之前我们用300行代码手写过 Spring 核心逻辑 【Spring】300行代码手写Spring核心逻辑(超详细注释),虽然也达到了我们想要的目的,实现了Spring的最基本功能,但是它把所有功能都放在一个类(MYDispatchServlet)中,没有用到任何设计模式。另外,它也没有实现Spring另一核心 aop 相关逻辑。所以,本篇我们就开始对它进行重构与扩充,原则是尽量模仿着Spring原本的样子,达到高仿真的目的。1.要实现的目标跟上篇一样,我们还是先来明确一下要实现的目标:目标一原创 2020-12-05 21:46:19 · 989 阅读 · 0 评论 -
【Spring】重构--手写Spring核心逻辑(二)实现IOC/DI(beans包)
MYBeanDefinition用来保存Bean的信息,包括实际类信息和配置信息。在我们平时使用Spring时,xml中有许多能配置的选项,但是为了简单我们这里只包括了 class,factory,method,lazyInit 这四项。在通过getBean获取Bean实例时,首先要拿到这里实例的类信息(BeanDefinition)。对应关系:一个Class对应多个BeanDefinition,比如Abean,Bbean属于同一class的实例,但一个是懒加载,一个不是懒加载一个BeanDe原创 2020-12-06 03:24:55 · 2448 阅读 · 0 评论 -
【Spring】重构--仿写Spring核心逻辑(三)实现IOC/DI(context包)
在上一篇 【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包) 我们已经实现了 beans 包中的相关类,本篇就来实现 context 中关于容器的具体逻辑。1.MYAbstractApplicationContextIOC容器顶层设计,是最顶层容器的规范,不管是 XmlApplication 还是 AnnotationApplication 都必须去实现。这种设计也便于我们日后扩展新容器。public abstract class MYAbstractApplica原创 2020-12-06 03:25:57 · 2047 阅读 · 0 评论 -
【Spring】重构--仿写Spring核心逻辑(四)实现MVC(webmvc包)
在前面两篇,我们已经成功实现了 Spring 最核心的功能 IOC和DI:【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–手写Spring核心逻辑(三)实现IOC/DI(context包)从这篇开始,我们来看看如何实现 MVC:MVC 的核心就是那九大组件 【Spring】MVC:九大核心组件分析,而其中最重要的三个:HandlerMappings,HandlerAdapters,ViewResolvers。1.MYHandlerMa原创 2020-12-06 18:52:24 · 1411 阅读 · 0 评论 -
【Spring】重构--仿写Spring核心逻辑(五)实现AOP(aop包)
在前面两篇,我们已经成功实现了 Spring 最核心的功能 IOC和DI:【Spring】重构–手写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–手写Spring核心逻辑(三)实现IOC/DI(context包)从这篇开始,我们就要来实现Spring的另一核心 AOP。...原创 2020-12-07 00:12:14 · 2121 阅读 · 0 评论 -
【Spring】扩展点(一):InitializingBean、DisposableBean
首先,什么是 Spring 的扩展点呢?IOC 容器对 bean 的管理从 BeanDefinition 的注册到实例化再到依赖注入,有自己一套默认的流程,而 Spring 预留的扩展点允许某些 bean 干预这个预设的流程。下面来看一个例子:那问题来了,什么样的码农会选择去加班(什么样的 bean 会用到扩展点)?那还用说,肯定是想拿或者已经拿了更多薪水的人啊,公司会它们做更多的事情。同理,当某个 bean 实现了 Spring 中预置的扩展接口,比如 FactoryBean,InitialingB原创 2020-12-21 21:49:29 · 2824 阅读 · 1 评论 -
【Spring】扩展点(二):BeanNameAware、ApplicationContextAware、BeanFactoryAware
前言:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor【Spring】扩展点(二):FactoryBean、BeanFactoryPostProcessor本篇我们来看看 BeanNameAware、ApplicationContextAware、BeanFactoryAware 这三个扩展接口,把它们放在一起写是因为作用相似(PS:“Aware”.原创 2020-12-21 22:47:20 · 3435 阅读 · 0 评论 -
【Spring】扩展点(三):BeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor
前言:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor1.FactoryBean传统的 Spring 容器加载一个 bean 的整个过程,都是由 Spring 控制的,换句话说,开发者除了设置Bean相关属性之外,是没有太多的自主权的。FactoryBean 改变了这一点,开发者可以个性化地定制自己想要实例化出来的 Bean,方法就是实现 Factory.原创 2020-12-21 21:50:39 · 3568 阅读 · 0 评论 -
【Spring】扩展点(四):总结 --Spring bean 的生命周期
Spring 扩展点系列:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor【Spring】扩展点(二):FactoryBean、BeanFactoryPostProcessor【Spring】扩展点(三):BeanNameAware、ApplicationContextAware、BeanFactoryAware【Spring】扩展点(四):总结 -.原创 2021-03-02 17:23:31 · 511 阅读 · 0 评论 -
【Spring】IOC:核心组件的继承关系类图
下图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IoC 体系中大部分的核心类和接口:下面我们就针对这个图进行简单的拆分和补充说明。1.Resource 体系org.springframework.core.io.Resource,对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。2.ResourceLoader原创 2020-12-02 16:16:27 · 1681 阅读 · 0 评论 -
【Spring】IOC:初始化流程源码分析(上)定位 Resource
1.寻找入口 (ClassPathXmlApplication)ClassPathXmlApplicationContext()ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");进入ClassPathXMLApplication查看其相应构造函数:public ClassPathXmlApplicationContext(String configLocation) throws Beans原创 2020-12-05 21:42:57 · 445 阅读 · 0 评论 -
【Spring】IOC:初始化流程源码分析(中)加载 BeanDefinition
装载就是 BeanDefinition 的载入。BeanDefinitionReader 读取、解析 Resource 资源,也就是将用户定义的 Bean 表示成 IOC 容器的内部数据结构:BeanDefinition。在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,在配置文件中每一个都对应着一个BeanDefinition对象。1.准备文档对象 (DefaultDocumentLoader)DocumentLoader的实现类DefaultDocumentLoade原创 2020-12-05 21:43:12 · 1400 阅读 · 0 评论 -
【Spring】IOC:初始化流程源码分析(下)注册 BeanDefinition
向IOC容器注册在第二步解析好的 BeanDefinition,这个过程是通过 BeanDefinitionRegistery 接口来实现的。在 IOC 容器内部其实是将第二个过程解析得到的 BeanDefinition 注入到一个 HashMap 容器中,IOC 容器就是通过这个 HashMap 来维护这些 BeanDefinition 的。在这里需要注意的一点是这个过程并没有完成依赖注入,依赖注册是发生在应用第一次调用 getBean() 向容器索要 Bean 时。当然我们可以通过设置预处理,即对某原创 2020-12-05 21:43:30 · 1179 阅读 · 0 评论 -
【Spring】IOC:基于注解的IOC容器初始化源码分析
从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可以取代 XML配置文件。开发人员对注解(Annotation)的态度也是萝卜青菜各有所爱,个人认为注解可以大大简化配置,提高开发速度,但也给后期维护增加了难度。目前来说 XML方式发展的相对成熟,方便于统一管理。随着Spring Boot的兴起,基于注解的开发甚至实现了零配置。但作为个人的习惯而言,还是倾向于原创 2020-12-08 21:00:56 · 1686 阅读 · 0 评论 -
【Spring】IOC:小结--核心类时序图
简易时序图初始化的入口在容器实现中的refresh()调用来完成。对Bean定义载入IOC 容器使用的方法是loadBeanDefinition(),其中的大致过程如下:通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader是默认的实现,同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径,文件系统,URL等方式来定为资源位置。如果是XmlBeanFactory 作为 IOC容器,那么需要为它指定 Bean定义的资源,也就是说原创 2020-12-08 15:34:21 · 1759 阅读 · 0 评论 -
【Spring】DI:源码分析(上)实例化 Bean
当SpringIOC 容器完成了Bean定义资源的定位、载入和解析注册以后,IOC 容器中已经管理了Bean定义的相关数据,但是此时 IOC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况发生:用户第一次调用 getBean() 方法时,IOC 容器触发依赖注入当用户在配置文件中将元素配置了lazy-init=false属性,即让容器在解析注册 Bean 定义时进行预实例化,触发依赖注入1.寻找获取Bean的入口 (AbstractBeanFactory)getBean()实原创 2020-12-05 21:48:45 · 1512 阅读 · 0 评论 -
【Spring】DI:源码分析(下)依赖注入
在前面的分析中我们已经了解到Bean的依赖注入主要分为两个步骤,首先调用createBeanInstance()方法生成 Bean 所包含的 Java对象实例。然后调用 populateBean()方法,对 Bean属性的依赖注入进行处理。现在我们继续分析生成对象后,Spring IOC 容器是如何将 Bean 的属性依赖关系注入 Bean 实例对象中并设置好的。1.准备依赖注入 (AbstractAutowireCapableBeanFactory)回到AbstractAutowireCapableB原创 2020-12-05 21:49:24 · 1418 阅读 · 0 评论 -
【Spring】DI:小结--核心类时序图
DI 可以分为两步,实例化Bean => 依赖注入,具体步骤如下:【Spring】DI:源码分析(上)实例化Bean【Spring】DI:源码分析(下)依赖注入核心类的时序图如下:原创 2020-12-09 01:02:25 · 1845 阅读 · 0 评论 -
【Spring】IOC&DI:核心流程小结
前篇:【Spring】重构–手写Spring核心逻辑(一)目标及框架结构【Spring】重构–仿写Spring核心逻辑(二)实现IOC/DI(beans包)【Spring】重构–仿写Spring核心逻辑(三)实现IOC/DI(context包)先来说一下我们要使用的容器 MYApplicationContext 的继承关系,它实现了 BeanFactory 接口和 AbstractApplicationContext 抽象类BeanFactory 接口:提供了 getBean(beanN.原创 2021-02-27 20:46:39 · 166 阅读 · 0 评论 -
【Spring】IOC&DI:循环依赖问题及解决方案
1.什么是循环依赖?所谓的循环依赖就是A依赖B,B依赖A;或者是A依赖B,B依赖C,C依赖A下面来看个实例:public class InstanceA { private InstanceB instanceB; // setter...} public class InstanceB { private InstanceA instanceA; // setter...}这里有两个类 A 和 B,A 中有一个成员变量 B,B 中有一个成员变量原创 2021-03-28 01:24:17 · 523 阅读 · 0 评论 -
【Spring】IOC&DI:循环依赖相关源码分析
前言:【Spring】IOC&DI:循环依赖问题及解决方案…Spring 在启动过程中,使用到了三个 map,称为三级缓存// 一级缓存:用于存放 beanName 和初始化好的 bean 对象(属性已经初始化好的) private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256); // 二级缓存:用于存放 beanName 和一个.原创 2021-03-28 02:10:53 · 178 阅读 · 0 评论 -
【Spring】IOC&DI:FactoryBean 使用场景及源码分析
在Spring中,有两个很容易混淆的类:BeanFactory 和 FactoryBean。BeanFactory:Bean 工厂,是一个工厂(Factory),我们 Spring IOC 容器的最顶层接口就是这个BeanFactory,它的作用是管理 Bean,即实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。FactoryBean:工厂Bean,是一个 Bean,作用是产生其他 bean实例。通常情况下,这种Bean没有什么特别的要求,仅需要提供一个工厂方法,该方法用来返回其他 Bean原创 2020-12-05 21:51:35 · 3176 阅读 · 0 评论 -
【Spring】IOC&DI:关于懒加载 lazy-init
我们已经知道 IOC 容器的初始化过程就是对 Bean 定义资源的定位、载入和注册。此时容器对Bean的依赖注入并没有发生,依赖注入主要是在应用程序第一次向容器索取Bean时,通过getBean()方法的调用完成。当Bean定义资源的<Bean>元素中配置了 lazy-init=false 属性时,容器将会在初始化的时候对所配置的 Bean 进行预实例化,Bean 的依赖注入在容器初始化的时候就已经完成。这样,当应用程序第一次向容器索取被管理的 Bean时,就不用再初始化和对 Bean进行依赖原创 2020-12-05 21:51:00 · 1975 阅读 · 0 评论 -
【Spring】IOC&DI:关于自动装配 autowiring
Spring IOC 容器提供了两种管理Bean依赖关系的方式:显式管理:通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理。autowiring: Spring IOC 容器的依赖自动装配功能,不需要对Bean属性的依赖关系做显式的声明,只需要在配置好 autowiring 属性,IOC 容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的Bean,从而自动地完成依赖注入。通过对 autowiring 自动装配特性的理解,我们知道容器对原创 2020-12-09 01:21:32 · 1229 阅读 · 0 评论 -
【Spring】AOP:源码分析(上)创建代理对象
1.寻找入口(BeanPostProcessor)postProcessBeforInitialization()public interface BeanPostProcessor { // 为在Bean的初始化前提供回调入口 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } .原创 2020-12-03 23:09:52 · 236 阅读 · 0 评论 -
【Spring】AOP:源码分析(下)具体调用逻辑
现在来逐一分析。首先,从上面的代码可以看到,通知链是通过Advised.getInterceptorsAndDynamicInterceptionAdvice()这个方法来获取的,我们来看下这个方法的实现逻辑:1.获取通知链(DefaultAdvisorChainFactory)getInterceptorsAndDynamicInterceptionAdvice()// AdvisedSupportpublic List<Object> getInterceptorsAndDynami原创 2020-12-03 23:09:32 · 437 阅读 · 0 评论 -
【Spring】AOP:核心流程小结
1)入口是初始化 ApplicationContext 的 instantiteBean() 创建 bean 实例创建封装了配置信息的 AopConfig(切面类、切点表达式、前置/后置/环绕通知)将 AopConfig 再封装成 AdvisedSupport(包括了上面的配置文件信息,目标类,被代理对象)在调用 AdvisedSupport#setTargetClass() 保存目标类信息时,会调用自己的 parse() 方法根据切点表达式,提取并构造目标类特征表达式获取切面类的所有方法(L原创 2021-03-02 16:34:59 · 175 阅读 · 0 评论 -
【Spring】MVC:源码分析(上)初始化阶段
我们下面从三个部分来分析Spring MVC的源代码ApplicationContext初始化时用Map保存所有url和Controller类的对应关系根据请求url找到对应的Controller,并从Controller中找到处理请求的方法Request参数绑定到方法的形参,执行方法处理请求,并返回结果视图1.初始化阶段我们首先找到DispatcherServlet这个类,必然是寻找init()方法。然后,我们发现其init方法其实在父类 HttpServletBean中,其源码如下:in原创 2020-12-12 19:40:06 · 1797 阅读 · 0 评论