![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
spring源码
文章平均质量分 78
spring源码
zuodaoyong
这个作者很懒,什么都没留下…
展开
-
SpringBoot系列三Conditional机制
spring提供了一个更通用的基于条件的bean创建,@Conditional注解,总的来说,根据特定条件来控制bean的创建行为,可以利用这个特性进行一些自动配置。以ConditionalOnProperty为例讨论运行机制。进入OnPropertyCondition类public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { //扫描出Condit.翻译 2021-11-10 23:43:37 · 264 阅读 · 0 评论 -
SpringBoot系列二Starter自动配置原理
观察@SpringBootApplication注解@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes翻译 2021-11-06 16:08:18 · 108 阅读 · 0 评论 -
SpringBoot系列一启动Spring
public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection<SpringBootExceptionReporter> exceptionReporters = new Ar..翻译 2021-11-06 14:24:19 · 71 阅读 · 0 评论 -
ApplicationContext系列九finishRefresh
在spring中提供了Lifecycle接口,Lifecycle中包含start/stop方法,实现此接口后,spring会保证在启动的时候调用start方法,开始生命周期,并在spring关闭的时候调用stop方法结束生命周期。ApplicationContext的初始化最后正是保证这一功能的实现。protected void finishRefresh() { this.clearResourceCaches(); this.initLifecycleProcessor();翻译 2021-11-06 14:16:44 · 91 阅读 · 0 评论 -
ApplicationContext系列八初始化非延迟加载单例
完成BeanFactory的初始化工作,其中包括ConversionService,配置冻结以及非延迟加载的bean的初始化工作。protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("...翻译 2021-11-06 14:01:43 · 106 阅读 · 0 评论 -
ApplicationContext系列七初始化ApplicationEventMulticaster
在说清楚spring的事件传播器之前,先回顾下spring的事件监听机制一、事件监听public class TestEvent extends ApplicationEvent { private String message; public TestEvent(Object source) { super(source); } public TestEvent(Object source,String message) { su翻译 2021-11-06 13:24:45 · 106 阅读 · 0 评论 -
ApplicationContext系列六初始化消息资源
“国际化信息”也称为“本地化信息”,一般需要两个条件才可以确定一个特定的类型的本地化信息1、语言类型2、国家/地区类型java是通过java.util.Locale类表示一个本地化对象。//带有语言和国家/地区信息的本地化对象Locale locale = new Locale("zh", "CN");//zh_CN//只有语言信息的本地化对象Locale locale1 = new Locale("zh");//zh//等同于new Locale("zh", "CN")L翻译 2021-11-06 12:57:50 · 68 阅读 · 0 评论 -
ApplicationContext系列五BeanFactory的后处理
BeanFactory作为Spring中容器功能的基础,用于存放所有已经加载的bean,为了保证程序上的高可用,spring针对BeanFactory做了大量的扩展,比如PostProcessor就是在这里实现一、激活注册的BeanFactoryPostProcessorBeanFactoryPostProcessor接口和BeanPostProcessor类似,可以对bean的定义(配置元数据)进行处理。spring容器允许BeanFactoryPostProcessor在容器实际实例化任何其他翻译 2021-11-02 23:59:15 · 68 阅读 · 0 评论 -
ApplicationContext系列四BeanFactory的功能扩展
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //设置beanFactory的ClassLoader为当前context的classloader beanFactory.setBeanClassLoader(this.getClassLoader()); //设置beanFactory的表达式语言处理器,spring3开始支持 ...翻译 2021-10-29 00:03:32 · 110 阅读 · 0 评论 -
ApplicationContext系列三加载BeanFactory
ApplicationContext是对BeanFactory的功能扩展,不但包含了BeanFactory的全部功能,还添加了其他扩展能力。obtainFreshBeanFactory方法是实现BeanFactory的地方,经过这个函数后,ApplicationContext就有了BeanFactory的全部功能。protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { //初始化beanFactory,读取xm.翻译 2021-10-26 00:20:11 · 280 阅读 · 0 评论 -
ApplicationContext系列二环境准备
环境准备工作由this.prepareRefresh()方法提供protected void prepareRefresh() { this.startupDate = System.currentTimeMillis(); this.closed.set(false); this.active.set(true); if (this.logger.isDebugEnabled()) { if (this.logg...翻译 2021-10-24 11:38:45 · 65 阅读 · 0 评论 -
ApplicationContext系列一概述
ApplicationContext和BeanFactory都是用于加载bean,但是ApplicationContext功能包含BeanFactory的所有功能。一、加载配置ApplicationContext sc=new ClassPathXmlApplicationContext("beans.xml");public ClassPathXmlApplicationContext(String configLocation) throws BeansException {翻译 2021-10-24 11:19:44 · 80 阅读 · 0 评论 -
创建Bean系列六销毁bean
Spring除了对初始化方法有扩展外,对销毁方法也有扩展激活销毁bean的方式有两种1、destory-method2、注册后置处理器DestructionAwareBeanPostProcessor统一销毁beanprotected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) { AccessControlContext acc = (Sy翻译 2021-10-23 19:21:49 · 100 阅读 · 0 评论 -
创建Bean系列五初始化bean
在bean的配置中有一个init-method的属性,这个属性的作用是在bean实例化前调用init-method指定的方法来根据业务进行相应的实例化,当程序执行到初始化bean的代码逻辑时,说明bean已经实例化完成,且已经进行了属性注入。protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityMana...翻译 2021-10-23 19:14:02 · 155 阅读 · 0 评论 -
创建Bean系列四属性注入
在讲述循环依赖时多次提到属性注入,那么属性注入的原理是populateBean方法提供注入能力。protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { if (bw == null) { if (mbd.hasPropertyValues()) { throw new BeanCreationE...翻译 2021-10-23 18:46:44 · 105 阅读 · 0 评论 -
创建Bean系列三之记录创建Bean的ObjectFactory
doCreateBean创建bean的方法里有这样一段逻辑boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) { if (logger.isTraceEnabled()) { .翻译 2021-10-14 02:36:43 · 105 阅读 · 0 评论 -
创建Bean系列二之创建Bean的实例
创建bean实例主要逻辑在createBeanInstance方法里protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 解析class Class<?> beanClass = resolveBeanClass(mbd, beanName); if (beanClass ...翻译 2021-10-13 00:56:40 · 118 阅读 · 0 评论 -
创建Bean系列一之概述
如果在缓存中不存在已经加载的单例Bean,就需要从头开始bean的加载过程。Spring中使用getSingleton的重载方法实现bean的加载过程。public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "Bean name must not be null"); synchronized (this...翻译 2021-10-09 23:44:27 · 1527 阅读 · 0 评论 -
循环依赖解析
一、什么是循环依赖循环依赖就是循环引用,两个或者多个bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则他们最终反映为一个环。二、Spring是如何解决循环依赖Spring容器循环依赖包括构造器循环依赖和setter循环依赖1、构造器循环依赖通过构造器注入形成的循环依赖,此依赖无法解决,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。Spring容器将每一个正翻译 2021-10-06 16:38:03 · 1285 阅读 · 0 评论 -
获取bean
一、缓存中获取单例bean单例在spring的同一个容器中只会被创建一次,后续再获取bean直接从单例缓存中获取,如果单例缓存中获取不到,则去singletonFactories中获取。1、为什么spring在获取bean时要这样设计?因为在创建单例bean的时候,会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,spring创建bean的原则是不等待bean创建完成就会将bean的objectFactory提早曝光加入到缓存中,一旦下一个bean创建时需要依赖上一个bean,则直接使用翻译 2021-09-23 16:59:42 · 494 阅读 · 0 评论 -
FactoryBean解析
Spring一般通过反射机制利用BeanDefinition的class属性指定实现类来实例化bean。有些场景下实例化bean比较复杂。按照传统的方式,需要在<bean>中配置大量信息。为了简化这种操作,Spring提供了一个FactoryBean接口public interface FactoryBean<T> { String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType"; @Nullable T翻译 2021-09-23 13:47:48 · 1114 阅读 · 0 评论 -
Bean的加载概述
beanFactory.getBean("user")doGetBean(name, requiredType, null, false);//getBean调用doGetBeandoGetBean是加载bean的主要入口一、转换对应的beanNameString beanName = transformedBeanName(name);传入的name可能是beanName,factoryBean或者别名,所以要对name做解析1、name为FactoryBean去除..翻译 2021-09-20 23:03:16 · 113 阅读 · 0 评论 -
bean的默认标签解析
bean的默认标签是使用parseDefaultElement方法解析private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) { importBeanDefinitionResource(ele); } else if (delegate.nodeName翻译 2021-09-19 18:36:52 · 169 阅读 · 0 评论 -
XMLBeanFactory解析
XMLBeanFactory初始化时序图一、读取xmlspring的配置文件读取是通过ClassPathResource,spring对内部使用到的资源实现了抽象。public interface InputStreamSource { InputStream getInputStream() throws IOException;}public interface Resource extends InputStreamSource {...}spring针对翻译 2021-09-19 11:58:50 · 331 阅读 · 0 评论 -
EntityResolver解析
spring解析XML,SAX首先读取该XML文件上的声明,根据声明去寻找相应的DTD定义,以便对文档做验证。默认的寻找规则是通过网络(声明的DTD的URL地址)来下载相应的DTD声明,并进行验证。由于出于网络的原因,spring提供了一个自定义寻找DTD声明的方式。spring解析XML的代码:protected Document doLoadDocument(InputSource inputSource, Resource resource) throws Exception { r翻译 2021-09-19 11:25:33 · 199 阅读 · 0 评论