spring
文章平均质量分 64
David_lou
这个作者很懒,什么都没留下…
展开
-
《Spring设计思想》32-spring context的生命周期
之前的章节讲完了Spring bean的生命周期,实例化-初始化-卸载-回收这一节总结一下spring context的生命周期。要归纳spring context的生命周期,先要弄明白Spring context是什么。spring context就是Spring framework启动之后的上下文,上下文主要包括以下几个部分:1.Environment2.ResourceLoader3.ClassLoader4:MessageSource5.BeanFactory6.原创 2020-08-28 09:20:31 · 625 阅读 · 0 评论 -
《spring设计思想》31-Spring组合注解
上一节介绍了spring注解中的范式注解以及@Component和@ComponentScan的简单实现原理。这一节介绍一下spring的组合注解。所谓组合注解跟java中的组合模式差不多,多个注解组合使用,以达到特殊的功能。比如Spring-boot中的@SpringBootApplication注解,是个非常有代表性的组合注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inher原创 2020-08-11 23:13:05 · 352 阅读 · 0 评论 -
《spring设计思想》30-Spring的注解
开发过程中面对很多的spring-framework的注解(@Repository,@Service等)SpringMVC的注解(@Controller等),还有spring-boot的注解(@SpringbootConfiguration等),Spring-cloud的注解。其实这些注解都是基于Java语言的特性做的扩展,java语言自身在1.5版本之后开始支持注解,那么注解到底是个什么东西,有什么作用呢。其实注解相当于java的字节码注释,java自身的javaDoc注释是不会被存储在class原创 2020-08-11 11:39:56 · 275 阅读 · 1 评论 -
《spring设计思想》29-Event-事件发布与监听
java中自身设计的观察者模式涉及到的两个类Observable;可以被观察的类Observer:观察者接口当我们想要使用观察者模式的时候,可以根据这两个类进行开发public class ObservableDemo { public static void main(String[] args) { MyObservable observable = new MyObservable(); observable.addObserver(new原创 2020-08-07 14:23:33 · 334 阅读 · 0 评论 -
《spring设计思想》28-Spring泛型处理-generic
上一节讲到类型转换,有个特别注意的点忘记补充,就是ConverterServiceFactoryBean注册到spring上下文的时候,id一定要命名为"conersionService",否则spring会依赖查找不到。这一节梳理一下Java/Spring的泛型处理在jdk5版本中,java引入了泛型的概念,之前的版本是不支持范型的。...原创 2020-08-05 17:32:19 · 279 阅读 · 0 评论 -
《spring设计思想》27-类型转换 PropertyEditor||Converter
BeanDefinition在实例化bean的时候,有一步很重要的动作,就是获取Bean的BeanWrapper,然后接下来是initBeanWrapper/** * Instantiate the given bean using its default constructor. * @param beanName the name of the bean * @param mbd the bean definition for the bean * @return a BeanWr原创 2020-08-03 15:37:52 · 356 阅读 · 0 评论 -
《Spring设计思想》26-validation-校验
上面一节讲到的MessageSource,有很多技术其实依赖了很多Java语言的自身特性,比如说:1:ResourceBundle2:Locale3:MessageFormat而spring的MessageSource概念就是整合Java这些技术的一个wrapper。本节内容的讲一下跟MessageSource比较紧密的ValidationSpring中的validation有几个搭配使用的接口/类:1:接口:Validator,要自定义实现2:工具类:Validati原创 2020-07-28 20:09:39 · 261 阅读 · 0 评论 -
《spring设计思想》25-MessageSource-国际化i18n
前面讲了spring的ioc/resource两个不分,这节简单的介绍下spring的i18n,国际化消息的简单使用。虽然这块在我的工作中很少使用,但是作为spring的基础知识,还是要理解。先简单的讲解一下i18n-国际化的主要功能,比如我们后台要返回一个提示信息,在中国简体的环境下,提示信息是:“你好{***},现在时间{*********}”;在英语国家返回的提示信息要变成:”dear friend{*****},the time is {*******}“,*代表真实的替换信息。spri原创 2020-07-25 18:36:39 · 363 阅读 · 0 评论 -
《spring设计思想》24-ResourcePatternResolver-解析Ant pattern路径的资源
上一节讲完了资源加载器,在demo中可以看到单个资源加载的简单用例。本节讲一下ant格式路径的资源加载,在spring中我们经常看到引入资源的时候会用到@Value("classpath*:/META-INF/*.properties")public Resource[] resources;这种模式的路径,在spring中会解析这条路径,然后查找符合的资源,上面的path就是指向:classpath路径下/META-INF/文件下所有的properties文件在图片中的三个文件中,原创 2020-07-23 20:32:47 · 569 阅读 · 0 评论 -
《spring设计思想》23-ResourceLoader资源加载
上一节简单的介绍了一下spring中的资源体系设计,最终的抽象类型是Resource,能够获取输入流和文件信息。这一节总结一下资源加载起ResourceLoader。所谓资源加载器,就是把上一节讲到的Resource加载到spring中用到的工具类,在spring中被设计为ResourceLoader。简单的看下ResourceLoader接口/** * Strategy interface for loading resources (e.. class path or file s原创 2020-07-21 16:53:11 · 361 阅读 · 0 评论 -
《spring设计思想》22-重新认识resource-资源
前面的20节日志,已经总结了spring在ioc容器的一些内容,包括bean的依赖查找和依赖注入,也包括xml/properties/等资源的加载。总体上已经把bean的元信息解析内容概括了一下。接下来让我们认识一下spring中另外一个很重要的概念-resource资源spring中设计资源也是为了把不同的物理对象抽象成统一的概念模型,spring中对于classpath路径上的文件,或者是网络上的文件,只要是认为要读取到spring中的文件都当作resource处理。所以resource有个基础的功原创 2020-07-21 14:43:33 · 266 阅读 · 0 评论 -
《Spring设计思想》21-yaml配置解析
前面几节都是围绕XML/Properties文件配置spring信息,在Spring-boot/spring-cloud中也有YAML文件配置Spring信息。本节梳理一下Yaml文件配置spring。yaml文件比较注意格式:配置文件 beans.yamlselfBean: id: 100 name: David_louseflBean 是我们的前缀,属性id/name。注意属性key/value之间的": " 有空格。上面的yaml文件在原生的spring框架中支持不如在spr原创 2020-07-20 13:55:53 · 791 阅读 · 0 评论 -
《spring设计思想》20-自定义xml的Namespace-自定义命名空间
上一节的xml解析成BeanDefinition中讲到了XmlBeanDefinitionReader 委托DefaultBeanDefinitionDocumentReader 来解析xml文件DefaultBeanDefinitionDocumentReader 委托 NamespaceHandler 来解析Document的ElementNamespaceHandler 委托 BeanDefinitionParser 来解析Element中的tag,那么这次我们尝试自己命名一个dubb原创 2020-07-15 17:42:21 · 501 阅读 · 0 评论 -
《spring设计思想》19-xml资源读取BeanDefinition-dubbo配置的bean的基础原理
前面的几篇章节总体的介绍了springIOC容器的BeanDefinitiion加载及实例化和初始化的过程,本节再次总结一下BeanDefinition中元数据的加载1:面向资源-springIOC容器面向资源加载bean的元信息,资源类型包括 xml文件,properties文件。具体的加载类是XmlBeanDefinitionReader和propertiesBeanDefinitionReader,这两个类是继承自AbstractBeanDefinitionReader类,是兄弟类的关系,面原创 2020-07-14 23:39:12 · 244 阅读 · 0 评论 -
《spring设计思想》18-bean知识总结
现在spring中的bean来源主要有两个:一个是扫描资源文件xml/properties等加载BeanDefinition二是扫描Annotation标注的Class文件加载BeanDefinition不管是哪一种,我们都知道读取资源文件加载到BeanFactory中的都是BeanDefinition(针对普通的Bean)在我们需要使用的Bean的时候,再调用getBean方法获取Bean。如果是第一次的话会调用createBean方法,创建Bean的实例。如果是多次调用getBean原创 2020-07-06 16:53:24 · 210 阅读 · 0 评论 -
《Spring设计思想》17-bean初始化最后阶段applyBeanPostProcessorsAfterInitialization
上面几节内容总结了initializeBean方法中的前三步,第一步:invokeAwareMethods第二步:applyBeanPostProcessorsBeforeInitialization第三步:invokeInitMethods这节简单的描述下第四步 applyBeanPostProcessorsAfterInitialization方法跟第二步方法差不多 @Override public Object applyBeanPostProcessorsAfterIni.原创 2020-07-02 10:44:56 · 1526 阅读 · 0 评论 -
《spring设计思想》16-bean初始化阶段的自定义初始方法
上面两节14:讲了initializeBean中的第一步invokeAwareMethods15:讲了initializeBean中的第二步,applyBeanPostProcessorsBeforeInitialization这节我们讲一下第三步,invokeInitMethods /** * Give a bean a chance to react now all its properties are set, * and a chance to know about its o原创 2020-07-02 10:19:32 · 519 阅读 · 0 评论 -
《Spring设计思想》15-bean初始化中BeanPostProcessor的回调
上一节讲到bean初始化方法initializeBean方法的第一步,invokeAwareMethods。这节将初始化bean的第二步,applyBeanPostProcessorsBeforeInitialization方法看代码实现:遍历beanFactory里面的beanPostProcessor,执行postProcessBeforeInitialization方法,/** * factory的回调,允许用户自定义bean * Factory hook that allow原创 2020-07-01 20:05:49 · 266 阅读 · 0 评论 -
《spring设计思想》14-initializeBean,bean的初始化做了啥
回到代码中,观察initializeBean方法 /** * Initialize the given bean instance, applying factory callbacks * as well as init methods and bean post processors. * <p>Called from {@link #createBean} for traditionally defined beans, * and from {@link #init原创 2020-07-01 19:33:45 · 367 阅读 · 0 评论 -
《Spring设计思想》13-bean的实例化和初始化阶段概览
前面几节终于讲完了bean的实例化过程,围绕着bean的实例化,spring做了众多的准备工作:1-加载beanDefinition2-mergeBeanDefinition3-加载bean的Class4-调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法打断实例化过程5-实例化6-调用InstantiationAwareBeanPostProcessor的postProcessAfterIns原创 2020-06-29 14:13:11 · 282 阅读 · 0 评论 -
《spring设计思想》8-BeanDefinition中的beanClass从String转换为Class
上一节梳理了一下BeanDefinition的合并过程,而且讲到BeanDefinition中的基本属性 @Nullable private volatile Object beanClass;beanClass属性描述的是Bean的类型,而且很特殊的设置为Object类型,java中万物皆是对象,但是我们在读取xml或者propeties时,赋值的是什么类型呢,断点调试发现是Sting类型的对象,但是在执行过getBean方法之后,会调用上一节的mergeBeanDefinition原创 2020-06-26 17:00:03 · 1148 阅读 · 0 评论 -
《spring设计思想》7-BeanDefinition的合并-mergeBeanDefinition
上一节讲到了spring中依托PropertiesBeanDefinitionReader/XmlBeanDefinitionReader/AnnotatedBeanDefinitionReader几个类解析资源文件/class类来加载BeanDefinition到BeanDefinitionRegistry。该过程一般称之为“注册”。那注册之后通过依赖查找/依赖注入获取bean实例对象,在从BeanDefinition到Bean创建实例之间发生了什么样的变化?首先我们观察一下BeanDefinitio原创 2020-06-23 10:26:21 · 855 阅读 · 0 评论 -
【spring设计思想】4-依赖查找/依赖注入的数据来源
spring最基本的功能-依赖注入/依赖查找。依赖注入:比如我们平时用到的注解注入@Autowried/@Inject/@Value依赖查找:applicationContext.getBean()或者是beanFactory.getBean();等那么我们的依赖到底是保存在什么地方了呢。来源一:beanFactory/beanDefinitionMap;来源二:ApplicationContext;来源三:Environment;来源一beanFactory主要保存的是spri原创 2020-06-05 16:34:30 · 598 阅读 · 0 评论 -
《spring设计思想》5-搭建一个最简单的springMVC工程
环境:java8+maven3工具:idea准备工作:idea创建maven工程project。再创建一个maven的单元module。手动把module改成springMVC的web服务。springMVC的重要元素:1.web.xml:web服务的描述信息2.处理映射的统一DispatcherServlet3.特殊的bean类型:viewResolve/handleExceptionResolve/MutilPartResolve等4:controller类先看原始的原创 2020-06-10 15:14:03 · 177 阅读 · 0 评论 -
《spring设计思想》6 beanDefinition的加载实现
上面第四节讲到了spring的DI/look up的数据来源,这次分析一下spring中的beanDefinition是怎么加载到beanFactory中的。想一想我们在平时的工作中加载spring beanDefinition的几个来源1:xml配置文件2:properties文件3:注解标注那么针对三个不同的来源,会使用不同的手段加载到spring容器中。相当于spring设计一个接口,根据不同的规则实现特殊的类。spring设计的接口就是BeanDefinitionReader原创 2020-06-21 12:17:09 · 332 阅读 · 0 评论 -
《spring设计思想》12-InstantationAwareBeanPostProcessor-applyProperties之前回调postProcessProperties
第11节讲到InstantiationAwareBeanPostProcessor在bean被Spring“注入”属性之前将其带走了,那没被InstantiationAwareBeanPostProcessor带走的bean,接下来面对的是什么呢?书接上文:回到AbstractAutowireCapableBeanFactory.doCreateBean(String beanName,RootBeanDefinition mbd,Object[] args)方法: protected Obj原创 2020-06-29 11:23:06 · 1852 阅读 · 0 评论 -
《Spring设计思想》11-InstrantiationAwareBeanPostProcessor,实例化之后回调:postProcessAfterInstantiation
第9节书中写道:紫霞仙子的剑离秦祥林的喉咙只有0.01厘米,但是至尊宝撒了一个谎,这个谎导致紫霞仙子彻底的爱上了他,但是他万万没想到,这是一个悲剧的开始。紫霞仙子还是被捉去被强迫成亲,而他自己拿了月光宝盒逃跑。。。所以第10节紫霞仙子还是默认进行了实例化,这个时候她穿好了嫁衣,马上就要拜堂了。他的意中人到底能不能来接他这一节我们书接上文,继续看看bean被实例化之后有什么操作。还是AbstractAutowireCapableBeanFactory.createBean(String beanN原创 2020-06-28 16:40:43 · 1282 阅读 · 2 评论 -
《spring设计思想》10-反射调用实现bean的实例化
上面一节简单的介绍了InstantiationAwareBeanPostProcessor可以在bean的实例化之前,调用回调的接口-postProcessorBeforInstantiation方法打断spring bean的默认实现。那本节简单的看下spring bean的默认实例化方法。回到createBean(String beanName,RootBeanDefinition mbd,Objec[] args)方法。 /** * Central method of this clas原创 2020-06-26 21:14:41 · 683 阅读 · 0 评论 -
《spring设计思想》9-IntrantiationAwareBeanPostProcessor::实例化前回调-postProcessBeforeInstantiation
上一节说完BeanDefinition中的beanClass属性从String转换成了Class。这一节继续看看beanDefinition发生了什么,回到上一节的方法createBean: /** * Central method of this class: creates a bean instance, * populates the bean instance, applies post-processors, etc. * @see #doCreateBean */原创 2020-06-26 20:26:58 · 595 阅读 · 0 评论 -
【spring 设计思想】第3集-自动生成bean的代理
spring中的bean如果有需要的话,在ApplicationContext refresh()方法执行的时候,被替换成了代理类。具体的调用堆栈:我们看到默认使用的是CGLIB代理模式,这种模式的好处就是可以直接对实体类生成代理,而不必像JDK的代理,必须要被代理的类实现接口。...原创 2019-11-05 14:22:19 · 265 阅读 · 1 评论 -
【Spring 设计思想】第0集-前期准备-Servlet知识点
web应用要部署到web容器处理网络请求。比较常见的容器有tomcat和jetty,这两个都可以称作servlet容器。 web应用部署文件是war包,war是web-archive文件的缩写。 war包里面有web.xml文件,被称作是web应用描述文件,容器根据web.xml文件的基本配置启动web应用。 很久之前servl...原创 2018-10-23 21:08:01 · 260 阅读 · 0 评论 -
【spring设计思想】第2集Environment解析
从Spring启动我们知道,第一件做的事情就是--创建环境--Environment查看代码知道:interface Environment extends PropertyResolver{ String[] getActiveProfiles(); String[] getDefaultProfiles(); boolean acceptsProfiles(...原创 2018-10-19 17:38:05 · 1828 阅读 · 0 评论 -
【spring设计思想】第1集:spring启动顺序及自定义扩展
最近查看Spring代码的一些思考所得。因为对于启动过程进行了一部分自我总结,希望不会给大家带来困扰,还请大家勘误,指正。spring-boot 启动顺序:1:被@SpringBootApplication注解的启动类的main方法2:SpringApplicationBuilder.init<>();3:SpringApplication.init&l...原创 2018-09-20 09:28:30 · 449 阅读 · 0 评论