Spring
文章平均质量分 80
Leo Han
Leo Han
展开
-
springboot自动装配原理,底层源码分析,条件注解实现机制,EnableAutoConfiguration,AutoConfigurationImportSelector
在springboot中我们构建应用不用在像spring中那么繁琐,必须声明bean,然后才能使用,在springboot只要引入了相关的jar包,则对应的功能会自动加载扩展。要想理解springboot的自动装配原理,我们首先要知道在spring中中比较重要的几个注解:@Import@Configuration比如大家常见的@EnableWebMvc@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented原创 2020-07-01 11:15:21 · 672 阅读 · 0 评论 -
springboot应用启动流程分析,嵌入式tomcat
之前我们分析了下springboot自动装载的原理,现在我们看看springboot应用启动的流程:一般调用如下:// 应用代码 SpringApplication.run(MiddlewareApplication.class, args);// SpringApplication.java public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { ret原创 2020-07-01 13:50:23 · 405 阅读 · 0 评论 -
SpringBoot源码读取配置源码分析,配置优先级,加载Bean信息
一般在springboot项目中,我们只需要在appcaliton.properties或者appcaliton.yml中指定相关配置,在程序中就可以直接使用,这其中的原理是如何实现呢?首先我们看SpringBoot项目启动流程逻辑:// 默认SpringApplication启动都会最终调用这个构造函数public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.r原创 2021-03-02 20:31:11 · 1094 阅读 · 0 评论 -
springboot redis Template使用,数据乱码解决
springboot提供了redis客户端,可以很方便的和springboot进行集成,一般在pom中引入:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependenc原创 2021-05-12 14:54:01 · 1588 阅读 · 0 评论 -
springboot源码研究actuator,自定义actuator路径
我们知道,当我们在springboot项目中引入了actuator模块之后,可以通过暴露的端口来获取系统相关信息: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>如原创 2021-07-21 22:36:53 · 2946 阅读 · 3 评论 -
spring cloud配置实现、刷新,spring cloud config实现原理,刷新,基于RefreshScope和ConfigurationProperties注解刷新原理
我们在使用spring cloud config的时候或者相关类似配置中心,都很想知道客户端是怎么实现将配置中心的配置注入到当前spring的上线文的。本文分析的spring clod版本是2.1.11开始之前,先回顾以下之前写的这篇文章Spring cloud读取bootstrap配置过程应该知道在spring中,是将所有的配置,抽象成了一个Enviroment类来承载这些配置的,所谓的配置中心其实都是在ApplicationContext实例化之后,将第三方的配置加载导入到environment中然原创 2021-07-22 20:47:30 · 3016 阅读 · 5 评论 -
Spring中同一个类中方法调用事务不生效,非事务方法调用事务方式事务不生效
我们假定在SerivceXXX中有两个方法:serviceA 非事务方法serviceB事务方法如果serviceA中方法定义类似如下:@Servicepublic void serviceA(){........serivceB...........}@Transactionalpublic void serviceB(){.......}则调用serviceA方法的时候,serviceB方法的事务并不能被激活,查看之前我们研究的spring事务实现的原理篇,其实原理原创 2021-03-12 22:54:17 · 2187 阅读 · 0 评论 -
spring源码解析AnnotationConfigApplicationContext启动流程分析,加载Bean信息
在spring中提供了多种类型的ApplicationContext,其中AnnotationConfigApplicationContext用来支持基于注解的bean的生成和管理,其类继承结构如下:我们深入其源码,来看看其启动流程:public AnnotationConfigApplicationContext() { this.reader = new AnnotatedBeanDefinitionReader(this); this.scanner = new ClassPathBea原创 2021-03-06 17:17:06 · 757 阅读 · 0 评论 -
spring中BeanFactoryPostProcessor、BeanPostProcessor、Aware接口
首先看application.refresh流程:public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal b原创 2021-03-02 17:09:26 · 328 阅读 · 0 评论 -
springmvc使用范例,底层实现原理,源代码研究,springmvc父子容器
在J2EE的开发中,一般都是基于java servlet规范,很多web容器也实现了相关的规范,比如tomcat,使用原始J2EE servlet开发web应用的时候一般都是在web.xml中配置很多的servlet和对应servlet映射路径,springmvc则简化了这个步骤,使用springmvc之后,一般web.xml配置如下: <context-param> <param-name>contextConfigLocation</param-name>原创 2020-06-28 16:25:05 · 361 阅读 · 0 评论 -
spring中事务使用范例,事务传播机制实现逻辑,底层原理,事务回滚,事务嵌套
在java中处理数据库相关逻辑时一般都会用到事务相关处理,如果我们直接使用基于jdbc底层的事务处理,程序一般比较浮渣,spring的声明式事务处理让我们从繁杂的事务处理中得以解脱出来。从前面的spring的其他相关底层实现我们知道,一般遇到相关schema解析的时候,spring都会获取META-INF/spring.handlers中获取对应schema解析处理类来进行处理,我们直接定位到spring事务处理模块spring-tx,获取到对应spring.handlers文件内容如下:http\:/原创 2020-06-25 21:04:13 · 773 阅读 · 0 评论 -
spring中load-time-weaver静态aop处理,基于aspectJ的静态aop处理
前面我们已经探讨过基于spring的动态aop处理 spring动态aop处理 spring同时也遵循了aop的标准,提供了静态aop的处理方式。spring的配置增加如下配置开启静态aop: <context:load-time-weaver/>可以看到,这里对应的schema是context,我们在spring-context模块下META-IUNF/spring.handlers中发现内容如下:http\://www.springframework.org/schema/cont原创 2020-06-23 18:15:08 · 1681 阅读 · 1 评论 -
spring中aop使用示例,底层实现原理,jdk动态代理,cglib动态代理
总所周知,java是一个oop,面向对象的语言,以更贴近现实的描述来构造程序,但是也代理一些不好的或者说不方便的东西,比如当需要为多个不具有继承关系的对象引入同一个公共的行为的时候,如日志,安全检查等,我们只能在每个对象中引用公共行为,会产生大量的重复代码。AOP因此产生,作为oop的一个补充,面向切面编程。AOP中相关术语连接点(JoinPoint):程序执行多测某个特定位置,如方法调用前,方法调用后,方法抛出异常后,类开始初始化前, 类开始初始化后。在spring中一个连接点总是代表一个方法的执行原创 2020-06-21 23:16:18 · 376 阅读 · 0 评论 -
spring中bean的获取流程,getBean的实现逻辑
通过之前spring容器启动过程分析,以ClassPathXmlApplicationContext为例说明,我们看到在最后的原创 2020-06-19 21:34:23 · 1035 阅读 · 0 评论 -
spring容器启动过程分析,以ClassPathXmlApplicationContext为例说明
随着spring功能的扩充,以及spring封装了很多底层实现的细节,使得我们在学习spring的源码的时候经常会比较困惑,本节开始研究spring容器启动的相关过程,暂时先从整体大流程上分析,比较细节的部分后续再补充说明,spring的版本为spring-framework-5.1.15.RELEASE,我们先从后台spring应用开始说明,web相关后续补充。以ClassPathXmlApplicationContext启动说明,其类继承结构如下:当我们实例化一个 ClassPathXmlAppl原创 2020-06-06 17:46:43 · 404 阅读 · 0 评论 -
spring中xml配置bean加载解析流程
当我们以ClassPathXmlApplicationContext启动的时候,在实际启动容器的AbstractAppliationContext.refreshspring容器启动流程跟踪代码,在AbstractApplicationContext.obtainFreshBeanFactory();其在refreshBeanFactory实现具体逻辑protected final void refreshBeanFactory() throws BeansException { //如原创 2020-06-03 22:07:10 · 861 阅读 · 0 评论 -
Spring中如何解决循环依赖,singletonObjects,singletonFactories,earlySingletonObjects,一级缓存,二级缓存,三级缓存
所谓循环依赖是指, 两个或者多个Bean相互之间持有对方引用,比如BeanA引用了BeanB,BeanBU引用了BeanC,BeanC引用BeanA这种。在Spring中只能解决通过setter方式且引用的Bean的作用域是Singleton级别。Spring中通过set方式注入形成的循环依赖是先将提前暴露刚实例化但是未进行其他任何处理的Bean的实例引用,这样返回了Bean实例的引用,后期对bean的任何处理,不会改变bean的引用地址。实际实现上提前暴露一个单例工厂方法,返回了一个在创建中的Bea原创 2020-06-06 23:56:10 · 8299 阅读 · 8 评论 -
spring中bean的生命周期历程
spring中bean的生命周期一般如下:(1)bean实例化,查找到bean的类相关信息并通过反射实例化(2)bean的属性设置。设置bean的相关属性(3) 如果实现了BeanNameAware,调用setBeanName方法(4)如果实现了BeanClassLoaderAware,调用setBeanClassloader方法(5)如果实现了BeanFactoryAware,调用setBeanFactory(6)如果实现了EnviromentAware,调用setEnviroment(7)原创 2020-05-25 22:17:08 · 137 阅读 · 0 评论