
Spring Context
文章平均质量分 85
Spring Context相关学习
君战
凡是过往,皆是序章
展开
-
从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(三)?
做为分析Spring是如何将@ComponentScan注解属性basepackages指定的包路径下的资源通过I/O来读取,通过ASM来解析类中的注解元数据(MetadataReader→AnnotationMetadata)并构造成BeanDe-finition这个过程的最后最后一篇文章。在文章开始前先总结下前面两篇文章讲了些什么。从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?在第一篇文章中,我们分析了在AbstractApplic原创 2021-03-08 07:30:56 · 428 阅读 · 0 评论 -
关于Spring中的一级缓存、二级缓存、三级缓存那些事
题记常常听到别人提起:“一级缓存、二级缓存、三级缓存”。那么它们是什么呢?有什么作用呢?原创 2021-02-04 10:39:37 · 23129 阅读 · 6 评论 -
展望Spring野心-Spring资源定位
Java标准资源定位在Java标准资源管理中有面向资源的文件系统、artifact以及远程资源(HTTP、FTP等)。它们对应Java中的ClassLoader#getResource、File以及URL或者URI。Spring为什么要另起炉灶搞一套资源定位呢?主要是因为Java的标准资源定位接口不统一,分散到不同的API中。Spring有自己的野心,他想通过自定义一套API来进行整合,忽略底层的实现差异。事实上Spring也完成了这个目的,那就是其定义的Resource接口。该接口有三个主要原创 2021-01-17 10:53:16 · 234 阅读 · 0 评论 -
Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(二)?
书接上文 Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?在执行完ClassPathScanningCandidateComponentProvider的scanCandidateComponents方法后,应用上下文已经将在类中添加@Component或者由javax.annotation包中提供的@ManagedBean或者N-amed注解的Class通过ASM技术读取到类元信息并构造成SimpleMetadatRe原创 2021-01-13 09:45:36 · 387 阅读 · 1 评论 -
Spring IoC、应用上下文容器层次分析
相信很多同学在学习Spring源码时,总会被Spring IoC和应用上下文复杂的层次性所搞晕,debug时一会调到这个类一会调到那个类的,搞得晕头转向的,今天我们就分析下Spring IoC和应用上下文(ApplicationContext)的层次性,以及Spring为什么这样设计。BeanFactory这里我们以Spring...原创 2021-01-08 08:28:04 · 758 阅读 · 0 评论 -
扩展Spring-自定义Bean的作用域(Scope)
前提摘要之所以说Spring的IoC容器是最好的IoC容器实现之一,是因为其太灵活了,在各个执行链路中都留下了足够的扩展点,通过这些扩展点,可以打造出千人千面的IoC容器。废话不多说。我们都知道通过XML或者注解向IoC容器注册的Bean,Scope默认都是单例的,如果想配置其它作用域,可以通过添加@Scope注解配置其value属性来指定作用域。非Web环境支持Singl-eton和property。Web环境增加了四个作用域:request、session、application、websocket原创 2021-01-07 09:43:56 · 2157 阅读 · 2 评论 -
阿里面试题:什么是循环依赖?Spring是如何解决循环依赖的?
什么是循环依赖?顾名思义,循环依赖就是A依赖B,B又依赖A,两者之间的依赖关系形成了一个圆环,通常是由于不正确的编码所导致。Spring只能解决属性循环依赖问题,不能解决构造函数循环依赖问题,因为这个问题无解。接下来我们首先写一个Demo来演示Spring是如何处理属性循环依赖问题的。Talk is cheap. Show me the code第一步:定义一个类ComponentA,其有一个私有属性componentB。package com.tech.ioc;import org.spri原创 2021-01-06 09:34:48 · 6547 阅读 · 20 评论 -
@Resource真的只是按名称来进行依赖注入吗?@Autowired真的只是按照类型来依赖注入吗?
背景我们常听别人说:“Spring中的@Autowired是按类型来依赖注入的,@Resource是按名称来依赖注入的”,那么这句话到底正不正确呢?这里我先下个定论,“Spring中的@Autowired是按类型来依赖注入的,@Resource是按名称来依赖注入的”这句话正确也不正确。要怎么理解呢?@Resource注解是优先按照名称来进行依赖注入,但如果按名称找不到对应的Bean时,还是按类型来进行依赖注入;同样,当某个接口存在多个实现类,并且这些实现类都交给IoC容器管理,那么@Autowired也原创 2021-01-04 13:13:21 · 3419 阅读 · 1 评论 -
Spring-自定义BeanName生成规则
BeanName是什么?BeanName是Spring中用来区分不同Bean的一种手段,IoC容器必须保证BeanName的唯一性。如果无法保证BeanName的唯一性,容器会抛出异常,类似于我们的身份证,用户可以通过BeanName来定位唯一一个Bean。例如通过BeanFactory或者ApplicationContext提供的getBean方法。AbstractSuperBean extendAbstractBean = (AbstractSuperBean) applicationCo原创 2021-01-03 10:02:35 · 3211 阅读 · 2 评论 -
在单例Bean中依赖原型Bean问题解决
Talk is cheap. Show me the code第一步:创建一个单例Bean。package com.xxx.hyl.scope;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.ConfigurableBeanFactory;import org.springframework.context.annotatio原创 2021-01-02 09:19:52 · 418 阅读 · 0 评论 -
Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解。由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位大佬在评论区留言指正。如果各位小伙伴由于笔者描述不清,而不理解的地方也欢迎在评论区留言哦!该系列文章共有三篇,敬请期待~ ~ ~正文一切的开始要从AbstractApplicationContext的refresh方法说起。refresh方法是应用上下文中最重要的方法,没有之一!public void原创 2021-01-02 09:18:53 · 761 阅读 · 3 评论 -
深入理解@Lazy注解
结论当将@Lazy注解加在字段时,Spring应用上下文会为目标类型创建一个代理对象,Talk is cheap. Show me the code第一步:编写一个类交由IoC容器管理。package com.xxx.hyl.lazy;import org.springframework.context.annotation.Lazy;/** * 演示当前Bean 被延迟加载,需注意的是必须在当前类上添加{@link Lazy}注解,否则当前类在IoC容器初始化的时候就会被实例化 *原创 2020-12-31 13:43:20 · 3287 阅读 · 0 评论 -
Spring中的Bean可以绕过生命周期管理吗?
结论可以的。Talk is cheap. Show me the code原创 2020-12-30 16:32:07 · 366 阅读 · 2 评论 -
Bean被IoC容器销毁后还能使用吗?
Talk is cheap. Show me the code第一步:定义一个Bean用来测试。package com.xxx.hyl.ioc;/** * Bean 销毁演示 * @author 君战 * * **/public class DestroyBean {}第二步:使用IoC容器来销毁Bean,再次获取。package com.xxx.hyl.ioc;import org.springframework.context.annotation.AnnotationC原创 2020-12-30 16:01:39 · 971 阅读 · 4 评论 -
Spring Boot不指定包路径就可以扫描启动类所在包及其子包下的类是怎么做到的?
Talk is cheap. Show me the code第一步:在com.xxx.hyl.boot包下创建一个子包-beans,并在该包中创建一个Bean。package com.xxx.hyl.boot.beans;import org.springframework.context.annotation.ComponentScan;import org.springframework.stereotype.Component;/*** * 使用{@link ComponentScan原创 2020-12-29 17:41:41 · 2706 阅读 · 1 评论 -
一图助你搞明白Spring应用上下文初始化流程!
未经授权,不得转载。Talk is cheap. Show me the codepackage com.xxx.hyl.context.initialize;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/** * Spring 应用上下文 初始化流程演示 * @author 君战 * * **/public class ApplicationContextInitia原创 2020-12-29 16:36:42 · 1069 阅读 · 12 评论 -
面试题:原型Bean在一个线程多次获取是否一样?
结论对于原型Bean,IoC容器并没有进行缓存,所以每次调用getBean方法都是重新创建Bean,与线程无关。代码测试编写一个类,添加上@Scope注解,然后指定其value为prototype。创建注解驱动应用上下文,调用register方法来注册编写的类的class,通过应用上下文的getBean(Class)方法来获取应用上下文创建好的Bean实例。package com.xxx.fame.prototype;import org.springframework.beans.factor原创 2020-12-25 21:03:18 · 567 阅读 · 0 评论 -
在Spring IoC中,依赖注入和依赖查找的数据来源区别
什么是依赖注入?什么是依赖查找?简单来说,依赖查找是一个主动获取的过程,例如我需要某个Bean,通过BeanFactory的getBean方法来获取;依赖注入是一个被动接受的过程,例如我需要某个Bean,我只需在类中方法或字段上添加@Autowired或@Resource注解即可,由IoC容器来帮我完成查找并注入。Talk is cheap. Show me the code第一步:定义一个Bean,其拥有ApplicationContext、BeanFactory、ApplicationEventP原创 2020-12-28 15:34:53 · 1631 阅读 · 6 评论 -
从源码理解Bean的生命周期执行顺序
Talk is cheap. Show me the code第一步,定义一个Bean实现InitializingBean、DisposableBean、BeanPostProcessor、ResourceLoaderAware、BeanFactoryAware、BeanClassLoaderAware接口。package com.xxx.hyl.bean.lifecycle;import org.springframework.beans.BeansException;import org.sp原创 2020-12-28 13:58:53 · 405 阅读 · 0 评论 -
什么是安全查找Bean,什么是非安全查找Bean?如何安全地查找Bean?
查找Bean有哪些手段?总体来说,查找Bean有两种手段,一种是单Bean查找(只会返回一个Bean),一种是多Bean查找(返回多个Bean),它们分别对应BeanFactory和ListableBeanFactory。ListableBeanFactoty继承自BeanFactory接口。再往细分,BeanFactory接口定义的方法主要有两种,一种是根据名称或类型非安全查找(当未根据传入的参数查找到对应的Bean时会抛出异常),这系列的代表是getBean(String)、getBea原创 2020-12-28 10:18:51 · 653 阅读 · 1 评论 -
对于相同Bean,在父应用上下文中定义的切面,在子应用上下文中会生效吗?
背景描述假设这样一个场景,在父应用上下文中持有一个类的Bean实例,并针对这个Bean定义了相关切面,而在子容器中也持有和父应用上下文相同类的Bean实例,但未定义针对该Bean的切面,那么当从子应用上下文中获取该Bean实例并执行其方法时,定义在父应用上下文中的切面会生效吗?结论会生效。因为Spring AOP 在使用应用上下文(ApplicationContext)查找切面时,会使用层次性查找。虽然在子容器中未定义切面,但是会把父容器中的切面找到。Talk is cheap. Show me t原创 2020-12-27 11:32:21 · 531 阅读 · 3 评论 -
什么场景下声明式事务会失效?如何解决?
先说下使用的ORM框架-MyBatis,数据库链接池为阿里巴巴的Druid。Talk is cheap. Show me the code数据库DDLCREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf原创 2020-12-26 17:25:27 · 974 阅读 · 1 评论 -
你所不知道的@ComponentScan注解用法之包路径占位符
@ComponentScan注解的basePackages属性支持占位符吗?答案是肯定的。代码测试首先编写一个属性配置文件(Properties),名字随意,放在resources目录下。在该文件中只需要定义一个属性就可以,属性名随意,值必须是要扫描的包路径。basepackages=com.xxx.fame.placeholder编写一个Bean,空类即可。package com.xxx.fame.placeholder;import org.springframework.stere原创 2020-12-25 15:56:55 · 2952 阅读 · 0 评论 -
如何判断IoC容器中是否存在指定Bean?
containsBean方法的作用就是判断IoC容器中是否包含指定名称的Bean。该方法由BeanFactory接口定义,由AbstractBeanFactory实现。判断IoC容器中是否包含指定beanName是从三个维度去判断的:一、当前IoC容器的一级缓存(singletonObjects)中是否包含指定beanName的实例;二、当前IoC容器中是否包含指定beanName的BeanDefinition信息;三、当前IoC容器如果存在父容器,那么父容器是否存在指定beanName的Bean或原创 2020-12-24 18:42:44 · 5005 阅读 · 1 评论 -
@Scope注解的proxyMode的作用以及如何影响IoC容器的依赖查找
首先查看下@Scope注解的定义信息,其共有三个方法,分别为value、scopeName、proxyMode,其中value和scopeName利用了Spring的显性覆盖,这两个方法的作用是一样的,只不过scopeName要比value更具有语义性。重点是proxyMode方法,其默认值为ScopedProxyMode.DEFAULT。@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)原创 2020-12-24 17:37:29 · 11463 阅读 · 5 评论 -
BeanDefinitionRegistryPostProcessor是什么?
BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor。该接口的功能就是就是向B-eanFactory中注册BeanDefinition该接口只定义了一个方法-postProcessBeanDefinitionRegistry,通过该方法可以向IoC容器中注册Be-anDefinition。其最重要的实现便是ConfigurationClassPostProcessor,由该类完成用户在@ComponentScan注解中指定的类路径原创 2020-12-23 17:12:37 · 399 阅读 · 0 评论 -
Spring-BeanPostProcessor的执行顺序
只需让BeanPostProcessor的实现类实现PriorityOrdered接口或者Ordered接口,并实现其getOrder()方法。getOrder()方法的返回值越小将越先被执行。PriorityOrdered和Ordered优先级为,实现PriorityOrdered接口的BeanPostProcessor执行优先级高于实现Ordered接口的BeanPostProcessor。之所以会这样,是因为registerBeanPostProcessors方法所决定的。因为底层存储BeanPo原创 2020-12-23 16:40:41 · 3794 阅读 · 0 评论 -
Spring-外部配置的值是如何通过@Value注解获取的?
在DefaultListableBeanFactory的doResolveDependency方法中,首先通过AutowireCandidateResolver的getSuggestedValue方法获取@Value注解的属性值后(例如在@Value注解中配置的value属性为“user.name”,那这里获取到的就是"{user.name}”,那这里获取到的就是"user.name”,那这里获取到的就是"{user.name}")。接下来判断获取到的值是否不等于null,如果不等于null,则判断值是否原创 2020-12-23 15:11:20 · 1858 阅读 · 8 评论 -
单例Bean与原型Bean生命周期的不同之处
对于单例Bean而言,其实现的BeanNameAware、BeanFactoryAaware、ApplicationContextAware、自定义初始化方法、InitializingBean、BeanPostProcessor、DisposableBean等接口的方法都会被调用。而对于多例Bean来说,其自定义销毁方法和实现DisposableBean接口的销毁方法都不会被调用。IoC容器在关闭过程中处理Bean销毁时,会忽略多例Bean实现的销毁方法。所以如果依赖于Bean生命周期中的方法来进行一些资原创 2020-12-23 14:15:33 · 710 阅读 · 0 评论 -
如何使用@Autowire注入某个类型的多个实现类?
方式一:使用Map<String,T>Spring在处理该依赖项时,存入的Key为beanName,Value为Bean实例。代码示例:public class MainTest { @Autowired private Map<String, CustomizedService> customizedServiceMap; public static void main(String[] args) { // Ann原创 2020-12-23 14:06:56 · 1356 阅读 · 0 评论 -
BeanFactory和FactoryBean区别
BeanFactory是Spring中提供的一个工厂,可以产生对象,最常用的API就是getBean(),可以通过be-anName或者Bean的类型(Class)得到一个Bean。FactoryBean则是一个Bean。如果一个类实现了FactoryBean,那么Spring容器中存在两个对象,一个是getObject()返回的对象,还有一个是当前对象。如果需要通过BeanFactory的getBean方法来获取FactoryBean本身,必须在beanName前面拼接上“&”,如果不拼接,实原创 2020-12-23 13:50:36 · 366 阅读 · 0 评论