
Spring
文章平均质量分 89
Spring
ximeneschen
这个作者很懒,什么都没留下…
展开
-
Spring框架中的单例bean是线程安全的吗
在@Controller/@Service等容器中,默认情况下,scope值是单例-singleton的,也是线程不安全的。尽量不要在@Controller/@Service等容器中定义静态变量,不论是单例(singleton)还是多实例(prototype)他都是线程不安全的。默认注入的Bean对象,在不设置scope的时候他也是线程不安全的。一定要定义变量的话,用ThreadLocal来封装,这个是线程安全的。原创 2022-09-20 10:21:10 · 424 阅读 · 0 评论 -
ConfigurationClassPostProcessor —— Spring中最!最!最!重要的后置处理器!没有之一!!!
本文主要分析了 ConfigurationClassPostProcessor 类的作用,由于该类实现了 BeanFactoryPostProcessor 接口和 BeanDefinitionRegistryPostProcessor 接口,所以会重写 postProcessBeanDefinitionRegistry() 方法和 postProcessBeanFactory() 方法。在。转载 2022-09-16 02:39:20 · 442 阅读 · 1 评论 -
Spring 依赖注入方式及@Autowired 和 @Resource
任何人都可以提交 JSR给 Java 官方,但只有最终确定的 JSR,才会以 JSR-XXX 的格式发布,如 JSR-250,而被发布的 JSR 就可以看作是 Java 语言的规范或标准。构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。因为依赖对象是在构造方法中执行的,而构造方法是在对象创建之初执行的,因此被注入的对象在使用之前,会被完全初始化,这也是构造方法注入的优点之一。...转载 2022-08-31 11:25:27 · 1879 阅读 · 0 评论 -
@Transactional注解失效的场景
Transactional用于在项目中开启事务,然后如果使用不当,也可能会导致事务失效,看看以下场景这3种情况都可以从spring的源码中找到原因此方法会检查目标方法的修饰符是否为 public,。而。注意:private,protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错的一点。默认情况下,spring只会回滚RuntimeException和Error,对于普通的Excetion(非运行时异常),他不会回滚。因为原创 2022-07-02 17:51:15 · 598 阅读 · 0 评论 -
WebMvcConfigurer接口配置讲解及@EnableWebMvc的坑
一、@EnableWebMvc使用坑点解析通过注解的方式来进行Spring4 MVC开发时,我们都会在配置文件中加入<mvc:annotation-driven/>标签,这个配置会自动注册了一个 RequestMappingHandlerMapping、一个RequestMappingHandlerAdapter、以及一个ExceptionHandlerExceptionResolver 以支持使用注解Controller的注解方法(如@RequestMapping、@ExceptionHan原创 2022-06-01 19:30:37 · 3531 阅读 · 0 评论 -
Spring 5个标准事件及自定义事件
一、spring5个标准事件如下作用如下:上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。上下文停止事件(Conte原创 2022-05-31 01:17:27 · 2951 阅读 · 0 评论 -
SpringMVC 参数解析器
一、问题springMVC对于下面这种接口,参数是怎么解析的:@GetMapping("/hello/{id}")public void hello3(@PathVariable Long id) { System.out.println("id = " + id);}这是我们日常中最常见的参数定义方式,相信很多小伙伴对此很感兴趣。由于这块涉及到一个非常庞大的类AbstractNamedValueMethodArgumentResolver,因此这里我单独写了一篇文章来和大家分享这个问题转载 2022-03-26 22:07:14 · 1762 阅读 · 0 评论 -
@ResponseStatus & @ControllerAdvice
一、@ResponseStatus注解作用@ResponseStatus注解是spring-web包中提供的一个注解,从下图部分源码中可以看出@ResponseStatus注解具有value、code、reason 三个属性。代码中的作用:在实际项目中,可能碰到这种情况,我们提供的服务,调用方并不需要json报文中的消息,调用方只关注响应码,比如200,代表调用正常;404,代表请求资源不存在;502,代表系统异常。那么我们就可以使用@ResponseStatus实现这一功能二、@Respon原创 2022-03-23 23:52:31 · 1443 阅读 · 0 评论 -
Spring TX源码分析
一、先思考一下什么是事务?事务是一系列数据库操作的集合,在一个事务里,所有有关的数据库操作一起提交或一起回滚事务用在什么地方?如果多个数据库操作需要一起生效或一起失效,那么这些操作需要放在一个事务里面事务如何创建?用户创建了针对数据库操作的连接(java.sql.Connection)之后,就可以针对Connection进行事务的操作,事务依赖于连接事务的基本操作?1. 开启事务:Connection.setAutoCommit(false);关闭自动提交则就开启了事务2. 提交事务:原创 2022-03-18 15:31:22 · 582 阅读 · 0 评论 -
Spring加载流程源码
一、从AbstractApplicationContext的体系说起第一,从类结构设计上看, 围绕着是否需要Refresh容器衍生出两个抽象类:GenericApplicationContext: 是初始化的时候就创建容器,往后的每次refresh都不会更改AbstractRefreshableApplicationContext:AbstractRefreshableApplicationContext及子类的每次refresh都是先清除已有(如果不存在就创建)的容器,然后再重新创建;原创 2022-03-16 19:04:49 · 1662 阅读 · 0 评论 -
springMVC九大组件及一次请求流程
一、九大组件HandlerMapping(处理器映射器)HandlerMapping 是⽤来查找Handler的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作⽤便是找到请求相应的处理器Handler 和 Interceptor.HandlerAdapter(处理器适配器)HandlerAdapter 是⼀个适配器。原创 2022-03-14 16:59:13 · 1054 阅读 · 0 评论 -
JAVA SPI机制及SPI机制在Tomcat中的应用和在springboot中的应用
SPI 是 JAVA 提供的一种服务提供发现接口,其实就是一种面向接口的编程,为接口去匹配具体服务实现的机制,这一点上与 IOC 的思想类似,都是把装配的控制权放到了程序之外,下面具体看看什么是 SPI。一、什么是 SPISPI 全称为 Service Provider Interface,即服务提供发现接口,这里的服务指的不是我们经常听到的微服务服务发现,这里的一个服务 Service 指的是一个接口或抽象类,服务提供方则是对这个接口或抽象类的实现。SPI 是 ”基于接口的编程 + 策略模式 + 配置原创 2022-03-10 18:27:13 · 1437 阅读 · 0 评论 -
SpringMVC拦截器HandlerInterceptor原理及使用
在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从HandlerInterceptor接口开始一步步分析。一、HandlerInterceptor接口包含三个方法:default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) t原创 2022-03-01 20:51:20 · 3780 阅读 · 0 评论 -
@ModelAttribute和@SessionAttributes和@SessionAttribute和@RequestAttribute
一、@ModelAttribute用法绑定请求参数到命令对象(入参对象):放在控制器方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;当参数类型是一个bean的时候,它可以按照bean的属性一一注入。@ModelAttribute("LoginUser") User user暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法,也就是没有@RequestMapping标注的方法)上时,是为表单准备要展示的表单引用数原创 2022-02-25 01:42:47 · 1393 阅读 · 0 评论 -
从web.xml谈谈SpringMVC集成spring的初始化流程及SpringBoot集成SpringMVC
一、关于servlet详解servlet,https://www.runoob.com/servlet/servlet-tutorial.html总览一下:servlet与servlet容器Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。 Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立 的字节码原创 2022-02-24 19:12:23 · 1297 阅读 · 0 评论 -
@Conditional使用,Spring的Condition接口及@ConditionOnXXX源码分析
一、@Contidional 介绍 Conditional 是由 SpringFramework 提供的一个注解,位于 org.springframework.context.annotation 包内,定义如下。@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface Conditional { Class<? extends Conditio原创 2022-02-19 19:49:47 · 1640 阅读 · 1 评论 -
ImportBeanDefinitionRegistrar向容器中注册bean
一、ImportBeanDefinitionRegistrar我们先来看看ImportBeanDefinitionRegistrar是个什么鬼,点击进入ImportBeanDefinitionRegistrar源码,如下所示。public interface ImportBeanDefinitionRegistrar { default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinit原创 2022-02-19 17:43:16 · 840 阅读 · 0 评论 -
Spring.ImportSelector接口
一、关于ImportSelector接口ImportSelector接口是至spring中导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)都有它的存在二、ImportSelector接口源码package org.springframework.context.annotation;import org.springframework.core.type.AnnotationMetadata;/** * Interface to be imple原创 2022-02-19 16:56:01 · 696 阅读 · 0 评论 -
Spring Aop 组件概述
Spring Aop 概述AOP(Aspect-Oriented Programming) 面向切面编程, 这种编程模型是在 OOP(Object-Oriented Programming) 的基础上诞生的一种编程模型, 我们可以简单的将其理解为: 在程序中具有公共特性的某些类/某些方法上进行拦截, 在方法执行的前面/后面/执行结果返回后 增加执行一些方法 (PS: 对, 就这么简单, 最起码 Spring 中是这样的); 在 Spring 中主要通过了CGLib|动态代理来实现 -> CGLi.转载 2022-02-18 17:11:50 · 726 阅读 · 0 评论 -
Spring IOC 组件概述
IOC 概述IOC: Inversion of Control(控制反转), 这里其实指的是: 将程序中需要使用的 POJOs, 丢入到容器中, 解析成统一的 BeanDefinition(主要基于XML的 GenericBeanDefinition/RootBeanDefinition 与 通过 注解生成的 ScannedGenericBeanDefinition), 而 Bean 依赖的信息都在XML中描述(或通过注解描述), 容器则负责 Bean 的统一生成(本来Bean的创建/销毁是由我们开发人.转载 2022-02-18 16:41:40 · 321 阅读 · 0 评论 -
@EnableAspectAutoJAutoProxy_exposeProxy属性
一、@EnableAspectAutoJAutoProxy开启AOP功能@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Import({AspectJAutoProxyRegistrar.class})public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false; boolean原创 2022-02-11 17:05:32 · 4053 阅读 · 1 评论 -
Servlet、Tomcat、 SpringMVC 之间的关系
一、基础知识(什么是servlet)在idea中打开servlet的源码:可以看见servlet就是一个接口;接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范。有的人往往以为就是servlet直接处理客户端的http请求,其实并不是这样,servlet并不会去监听8080端口;直接与客户端打交道是“容器”,比如常用的tomcat。客户端的请求直接打到tomcat,它监听端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个serv原创 2021-11-11 16:07:24 · 2801 阅读 · 2 评论 -
手写简版spring --10--容器事件和事件监听器
一、降低耦合解耦场景在互联网开发的设计中使用的也是非常频繁,如:这里需要一个注册完成事件推送消息、用户下单我会发送一个MQ、收到我的支付消息就可以发货了等等,都是依靠事件订阅和发布以及MQ消息这样的组件,来处理系统之间的调用解耦,最终通过解耦的方式来提升整体系统架构的负载能力。其实解耦思路可以理解为设计模式中观察者模式的具体使用效果,在观察者模式中当对象间存在一对多关系时,则使用观察者模式,它是一种定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。事件原创 2021-08-16 14:27:25 · 322 阅读 · 0 评论 -
手写简版spring --9--对象作用域和FactoryBean
一、目标交给 Spring 管理的 Bean 对象,一定就是我们用类创建出来的 Bean 吗?创建出来的 Bean 就永远是单例的吗,没有可能是原型模式吗?在集合 Spring 框架下,我们使用的 MyBatis 框架中,它的核心作用是可以满足用户不需要实现 Dao 接口类,就可以通过 xml 或者注解配置的方式完成对数据库执行 CRUD 操作,那么在实现这样的 ORM 框架中,是怎么把一个数据库操作的 Bean 对象交给 Spring 管理的呢。因为我们在使用 Spring、MyBatis 框架的时候都原创 2021-08-16 11:22:33 · 200 阅读 · 0 评论 -
手写简版spring --8--Aware感知容器对象Aware感知容器对象
一、目标目前已实现的 Spring 框架,在 Bean 操作上能提供出的能力,包括:Bean 对象的定义和注册,以及在操作 Bean 对象过程中执行的,BeanFactoryPostProcessor、BeanPostProcessor、InitializingBean、DisposableBean,以及在 XML 新增的一些配置处理,让我们可以 Bean 对象有更强的操作性。那么,如果我们想获得 Spring 框架提供的 BeanFactory、ApplicationContext、BeanClassL原创 2021-08-16 10:44:39 · 349 阅读 · 0 评论 -
手写简版spring --7--初始化方法和销毁方法
一、目标当我们的类创建的 Bean 对象,交给 Spring 容器管理以后,这个类对象就可以被赋予更多的使用能力。就像我们在上一章节已经给类对象添加了修改注册Bean定义未实例化前的属性信息修改和实例化过程中的前置和后置处理,这些额外能力的实现,都可以让我们对现有工程中的类对象做相应的扩展处理。那么除此之外我们还希望可以在 Bean 初始化过程,执行一些操作。比如帮我们做一些数据的加载执行,链接注册中心暴漏RPC接口以及在Web程序关闭时执行链接断开,内存销毁等操作。如果说没有Spring我们也可以通过构原创 2021-08-16 09:21:36 · 288 阅读 · 0 评论 -
java钩子函数(hook)以spring源码为例
一、什么是钩子函数请问在Spring中,如果JVM异常终止,Spring是如何保证会释放掉占用的资源,比如说数据库连接等资源呢?钩子函数非常简单,简单到只用摘抄一段Spring代码即可。二、问题Spring 容器中 Bean 在什么时候执行销毁方法?我们知道在Spring中定义销毁方法有两种方式实现DisposableBean 的 destroy 方法。 使用 @PreDestroy 注解修饰方法@Componentpublic class DataCollectBean implements D转载 2021-08-15 04:16:14 · 2840 阅读 · 0 评论 -
手写简版spring --6--应用上下文(BeanPostProcessor 和 BeanFactoryPostProcessor)
一、目标如果你在自己的实际工作中开发过基于 Spring 的技术组件,或者学习过关于SpringBoot 中间件设计和开发等内容。那么你一定会继承或者实现了 Spring对外暴露的类或接口,在接口的实现中获取了 BeanFactory 以及 Bean 对象的获取等内容,并对这些内容做一些操作,例如:修改 Bean 的信息,添加日志打印、处理数据库路由对数据源的切换、给 RPC 服务连接注册中心等。在对容器中 Bean 的实例化过程添加扩展机制的同时,还需要把目前关于Spring.xml 初始化和加载策略进原创 2021-08-15 03:58:51 · 281 阅读 · 0 评论 -
手写简版spring --4--注入属性和依赖对象
一、目标首先我们回顾下这几章节都完成了什么,包括:实现一个容器、定义和注册Bean、实例化Bean,按照是否包含构造函数实现不同的实例化策略,那么在创建对象实例化这我们还缺少什么?其实还缺少一个关于类中是否有属性的问题,如果有类中包含属性那么在实例化的时候就需要把属性信息填充上,这样才是一个完整的对象创建。对于属性的填充不只是 int、Long、String,还包括还没有实例化的对象属性,都需要在 Bean 创建时进行填充操作。不过这里我们暂时不会考虑 Bean的循环依赖,否则会把整个功能实现撑大,这样新原创 2021-08-13 09:27:37 · 191 阅读 · 0 评论 -
手写简版spring --5--资源加载器解析文件注册对象
一、目标在完成 Spring 的框架雏形后,现在我们可以通过单元测试进行手动操作Bean对象的定义、注册和属性填充,以及最终获取对象调用方法。但这里会有一个问题,就是如果实际使用这个 Spring 框架,是不太可能让用户通过手动方式创建的,而是最好能通过配置文件的方式简化创建过程。需要完成如下操作:如图中我们需要把步骤:2、3、4 整合到Spring 框架中,通过 Spring 配置文件的方式将 Bean 对象实例化。接下来我们就需要在现有的 Spring 框架中,添加能解决 Spring 配置原创 2021-08-13 11:27:58 · 197 阅读 · 0 评论 -
手写简版spring --3--对象实例化策略
一、目标这一章节的目标主要是为了解决上一章节我们埋下的坑,那是什么坑呢?其实就是一个关于 Bean 对象在含有构造函数进行实例化的坑。在上一章节我们扩充了 Bean 容器的功能,把实例化对象交给容器来统一处理,但在我们实例化对象的代码里并没有考虑对象类是否含构造函数,也就是说如果我们去实例化一个含有构造函数的对象那么就要抛异常了。怎么验证?其实就是把 UserService 添加一个含入参信息的构造函数就可以。验证public class UserService { private Str原创 2021-08-12 17:28:28 · 233 阅读 · 0 评论 -
手写简版spring --2--实现Bean的定义、注册、获取
一、目标在上一章节我们初步依照 Spring Bean 容器的概念,实现了一个粗糙版本的代码实现。那么本章节我们需要结合已实现的 Spring Bean 容器进行功能完善,实现 Bean 容器关于 Bean 对象的注册和获取。这一次我们把 Bean 的创建交给容器,而不是我们在调用时候传递一个实例化好的 Bean 对象,另外还需要考虑单例对象,在对象的二次获取时是可以从内存中获取对象的。此外不仅要实现功能还需要完善基础容器框架的类结构体,否则将来就很难扩容进去其他的功能了。二、设计鉴于本章节的案例目标原创 2021-08-12 15:53:59 · 239 阅读 · 0 评论 -
手写简版spring --1--创建简单的Bean容器
一、声明这个系列是我自己的学习笔记,为了在学习的过程中巩固知识而记录的,本系列都是基于小缚哥的文章和代码的,想要深入了解,请移步小缚哥博客二、spring-Bean生命周期流程三、什么是Spring Bean容器Spring 包含并管理应用对象的配置和生命周期,在这个意义上它是一种用于承载对象的容器,你可以配置你的每个 Bean 对象是如何被创建的,这些 Bean 可以创建一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何相互关联构建和使用的。 如果一个 Bean 对象交给 Sprin原创 2021-08-12 10:17:24 · 1330 阅读 · 0 评论 -
spring循环依赖及解决方法
一、三种循环依赖的情况①构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException异常。②单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖,能处理。③非单例循环依赖:无法处理。原型(Prototype)的场景是不支持循环依赖的,通常会走到AbstractBeanFactory类中下面的判断,抛出异常。if (isPrototypeCurrentlyInCreation(beanName)) { throw new原创 2021-01-27 15:12:13 · 38953 阅读 · 20 评论 -
SpringIOC、DI、AOP、MVC总结、时序图
一、IOC容器初始化IOC 容器的初始化包含了BeanDefinition资源文件Resource定位、解析加载和注册三个步骤。 步骤依次为 : 读取资源文件为InputStream --> 转为Resource -> Document -> 解析元素节点封装为 BeanDefinition-> 放入IOC容器中,即DefaultListableBeanFactory的 Map<String, BeanDefinition> beanDefinitionMap主要转载 2021-01-27 10:45:13 · 736 阅读 · 0 评论 -
Spring IOC流程源码分析
一、Spring 核心容器 IOC初始化过程Spring 核心之 IOC 容器初体验IOC 与 DIIOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建,依赖的代码,反转给容器来帮忙实现。 那么必然的我们需要创建一个容器 ,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置文件。 DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类而不是自己主动去找,换句转载 2021-01-27 09:47:10 · 326 阅读 · 0 评论 -
SpringBoot跳转网页的三种方法
下面三个方法均在该类中:@Controllerpublic class TestController { ......}1、使用ModelAndView @RequestMapping("redirect") public ModelAndView redirect(){ return new ModelAndView("redirect:http://www.baidu.com"); }2、使用SpringMVC @RequestMapping转载 2020-12-17 09:57:52 · 2886 阅读 · 0 评论 -
Spring IOC 核心流程浓缩
一、基础概念1、IoC 和 DIIoC (Inversion of Control),即控制反转。这不是一种新的技术,而是 Spring 的一种设计思想。在传统的程序设计,我们直接在对象内部通过 new 来创建对象,是程序主动去创建依赖对象;而在 Spring 中有专门的一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这个容器我们一般称为 IoC 容器。所有的类的创建、销毁都由 Spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 Spring。对于某个具转载 2020-07-20 15:04:20 · 210 阅读 · 0 评论 -
Spring Ioc源码分析 之 Bean的加载(7):初始化
接着分析doCreateBean()的第6步——初始化 bean 实例对象首先回顾下CreateBean的主流程:如果是单例模式,从factoryBeanInstanceCache 缓存中获取BeanWrapper 实例对象并删除缓存调用 createBeanInstance() 实例化 bean后置处理单例模式的循环依赖处理属性填充初始化 bean 实例对象依赖检查注册bean的销毁方法一、初始化Spring在对Bean进行属性填充之后,会对Bean进行初始化,代码如下:/转载 2020-07-18 00:05:37 · 172 阅读 · 0 评论 -
Spring Ioc源码分析 之 Bean的加载(6):属性填充(populateBean())
“属性填充”,也是在populateBean()方法中。首先回顾下CreateBean的主流程:如果是单例模式,从factoryBeanInstanceCache 缓存中获取BeanWrapper 实例对象并删除缓存调用createBeanInstance() 实例化 bean后置处理单例模式的循环依赖处理属性填充初始化 bean 实例对象依赖检查注册bean的销毁方法本文主要分析第5步:属性注入在Spring中属性注入有三种方式:xml配置:节点中的default-aut转载 2020-07-17 23:47:03 · 397 阅读 · 0 评论