3 iostream1001001

尚未进行身份认证

我要认证

一个积极上进的程序猿。

等级
TA的排名 8w+

12、Spring特性-non-lazy-init

在之前的文章,笔者讨论的都是在用户第一次调用的时候触发的IOC过程,也就是所谓的lazy-init,下面看一下non-lazy-init,它是在IOC容器初始化的时候就把实例注入到了IOC容器中,它的思想是在容器完成对XML文件的BeanDefinition封装之后主动触发了该过程,具体过程和之前的IOC注入过程没有太大的区别,都是去调用getBean。不同就只有调用的触发对象和调用时间不同。

2018-01-27 09:39:43

11、IoC之依赖注入(5)-属性注入过程

在得到一个代理生成的目标对象之后,需要对目标对象进行属性注入,具体的实现是在AbstractAutowireCapableBeanFactory类中的populateBean方法中实现。具体代码如下:  // AbstractAutowireCapableBeanFactory // 使用bean定义中的属性值在给定的BeanWrapper中填充bean实例。 protected void

2018-01-27 09:36:36

10、IoC之依赖注入(3)-解析注入的属性

对于属性注入的间接引用,具体的解析过程是在BeanDefinitionValueResolver类中的resolveValueIfNecessary方法中实现的,主要解析Array,Set,Map,props和字符串类型的间接引用。具体实现源码如下: // BeanDefinitionValueResolver // 给定一个PropertyValue,返回一个值,必要时解析对工厂中其他

2018-01-27 08:31:19

9、IoC之依赖注入(2)-bean的代理对象生成

在前面已经封装好BeanDefinition之后,那么接下来就根据指定的BeanDefinition通过反射生成指定的对象。1、根据目标对象确定实例的产生方式:JDK或者CGLIB。有Override方法目标对象,使用CGLIB方式实例化具体的对象。 // SimpleInstantiationStrategy // 具体的bean实例化 // JDK或者CGLIB @Overr

2018-01-26 15:01:37

8、IoC之依赖注入(1)-getBean过程

从本篇blog开始,笔者开始开始分析IoC容器的依赖注入过程。1、依赖注入发生的时间有两个:A、用户第一次调用getBean方法时;B、配置了lazy-init属性,在IoC容器初始化的时候就发生了; 2、具体看一下第一种,用户第一次调用getBean方法时发生的依赖注入。Spring容器实现了很多的BeanFactory,并且实现了很多getBean方法的重载,但是通过跟踪代

2018-01-26 14:57:15

7、IoC容器的初始化(6)-BeanDefinition注册

在解析完Document读取的XML文件之后,会返回若干个BeanDefinition对象,那么解析来就是把这些对象注册到BeanFactory中,等待使用。注册BeanDefinition的入口是BeanDefinitionReaderUtils中的registerBeanDefinition方法:1、向给定的BeanFactory工厂注册给定的BeanDefinition。 //Bea

2018-01-26 14:48:47

6、IoC容器的初始化(5)-具体的bean解析流程

在上篇文章中已经看到了Spring中对根元素的解析过程,接下来看一下bean的具体解析过程。1、解析三个属性:id、name和别名: // BeanDefinitionParserDelegate // 具体的一个元素解析 // 本函数主要解析三个属性:id、name和别名 public BeanDefinitionHolder parseBeanDefinitionElement(

2018-01-26 14:44:41

5、IoC容器的初始化(4)-由Document解析根节点

本文主要讨论Document的根元素解析过程。 1、调用XmlBeanDefinitionReader中的registerBeanDefinitions方法,注册包含在给定DOM文档中的BeanDefinitions。  // XmlBeanDefinitionReader中 // 注册包含在给定DOM文档中的bean定义。 public int registerBeanDefin

2018-01-26 14:35:09

4、IoC容器的初始化(3)-配置文件的读取

配置文件的读取主要干两件事:1、确定读取方式;2、把XML文件中的信息封装到DOM对象中。1、 确定读取方式;它的读取入口应该是DefaultResourceLoader类中的getResource(String location)方法,这里面主要是在确定确认读取方式 // DefaultResourceLoader中 // 判断bean文件的资源对象的定位方式,使用对应的资源获取

2018-01-26 14:24:43

3、IoC容器的初始化(2)-BeanFactory创建和Bean Definition的定位资源加载

在前面IoC容器的初始化(1)中FileSystemXmlApplicationContext构造函数中的前两个方法super(parent);和setConfigLocations(configLocations);,接下来继续看refresh(); refresh();方法实现在AbstractApplicationContext类中,它是一个模板方法。它的主要作用的是两个:1、建立一

2018-01-26 14:16:10

2、IoC容器的初始化-初始化资源加载器和上下文

这篇以及后面的几篇blog,都将讨论ApplicationContext初始化过程,其大致流程就需要完成与BeanDefinition相关的三件事1、Resource定位;2、载入;3、注册。下面主要以FileSystemXmlApplicationContext类为例1、 定位资源: ApplicationContext context = new FileSystemXmlAp

2018-01-26 13:44:12

1、Spring IOC体系

在Spring IOC体系中最重要的两个部分就是BeanFactory和BeanDefinition。BeanFactory:BeanFactory是一系列工厂的接口,典型的工厂模式,BeanFactory来实例化、配置和管理对象。BeanFactory和很多具体的实现类,先来看一下BeanFactory接口本身的定义,它直接定义了IOC容器的基本行为。 public interf

2018-01-26 13:21:57

5_策略模式

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。 策略模式最大价值就是干掉了选择,特别是switch,通过这种模式,可以干掉在代码在switch中的强耦合关系。按照惯例,还是来个生活写照:有一个国际的税务组织,需要和各国的税务规则打交道,每个国家都有自己的税务体系,需要根据实际的业务使用对应的税法规则。用代码来模拟这个业务,一种简单的实现如下(把对应的国家信息传

2018-01-17 09:38:11

4_模板方法

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。Template Method的核心观点就是把一般的操作步骤定下来,具体细节不管。一个现实中的例子就是买火车票(从本地出发),假设角色有老师和学生,买票方式有线上和线下。那么可以分为4种情况:1、老师线上买票;2、学生线上买票;3、老师线上买票;4、学生线上买票;虽然有4种情况,但是当我们对买票的步骤进行一些抽象,却发

2018-01-16 21:27:54

3_观察者模式

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。观察者模式就是现实生活情景的一个写真。在现实生活中有这样一个场景,就是在医院等待检查报告,等待的病人或者家属怎么知道报告已经出来了呢?有两种解决方案:1、 每个病人或者家属每隔一段时间就去问,护士就根据已经出来的报告进行回答,这样就搞定了。2、 每个病人或者家属都坐着等,护士每拿到一份报告就喊报告上面病人的名字,病人或

2018-01-14 20:49:48

2_工厂方法

写在前面:设计模式不是干掉变化,而是让变化集中到一个区域,方便开发。 工厂方法的核心思想就是自己不直接”new”对象,而是通过发送一些信息,问其他对象要。举个例子:有个商贸市场,用”new”的方式就是类似把生产基地建设在商贸市场里面,客户要什么,就生产什么。而通过工厂方法就是把工厂搬出去,我只要根据用户需求提交订单向工厂即可。这样商贸市场就只需要做两个动作,接收用户请求和提交订单。把变化“

2018-01-13 14:31:44

1_我对设计模式的思考

一直都对设计模式有一种膜拜之情,觉得设计模式是一种高深的技术,一年前大致看了一遍23种设计模式觉得就是一些固定调用,继承,派生的方式,以为记住就可以了。而对设计原则和设计思想视而不见。再经过了一年的学习和项目经验后在来重新学习设计模式,发现自己有了一些新的思考:1、 设计模式是思想,不是固定套路。是为了更好地让代码适应变化。2、 设计模式是为了应对局部变化而产生的。如果程序没有变化,那

2018-01-13 11:48:01

struts2原理模拟

Struts2的核心:Struts2的设计目的是提取Servlet的公共功能,达到简化Servlet的目的。核心思想就是设计一个在Servlet执行之前先做一些工作,比如设置编码,接收参数,还有结束之后的跳转等等。核心实现方式就是添加一个filter,完成上述功能。图一:Struts2核心原理Struts2的核心功能分析:1、 跳转:当一个用户请求的URI来了经过过滤器

2017-12-11 15:10:27

8-ClassLoader

ClassLoader的核心作用是:加载指定路径的classJVM将所需要运行的*.class文件加载到JVM进程中需要有一个类加载器(ClassLoader,系统会提供默认类加载器,我们也可以自己写),类加载器的好处就在于我们可以随意指定*.class文件的位置(包括网络上的)。类的初始化时间调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导

2017-12-08 22:25:19

7-类的加载、连接、初始化

Java虚拟机的生命周期   在下面的集中情况下会结束java虚拟机1、 执行了System.exit()2、 程序正常结束3、 程序在运行过程中遇到的异常或错误而异常终止4、 由于操作系统出现错误  类的加载、连接、和初始化加载:查找并加载的类二进制数据(加载到内存)将类的class文件中的二进制数据读入到内存中,将其运行时数据区的方法区,然后在堆内存上创

2017-12-08 21:04:39

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!