OC容器实现过程

1、 容器启动阶段,读取配置文件,解析文件BeanDefinitionReader

2、 Bean 实例化阶段

关于BeanFactoryPostProcessor

插手spring的启动插入自己的逻辑,在第一阶段和第二阶段之间插入。。。

IOC容器中bean的操作

1、bean的实例化与BeanWarpper

容器在内部实现的时候,采用策略模式来决定如何初始化bean

策略模式:http://www.cnblogs.com/cutter-point/p/5259874.html

Spring一般使用cglib动态字节码技术实现创建一个bean实例

关于beanwarpper,就是一个用来包裹我们使用的类的类,用以节省我们操作的方便,这里通过一个案例展示

@Test
public void testBeanWapper() {
try {
Object mo = Class.forName("cn.cutter.start.bean.MyObject").newInstance();
//使用beanwrapper进行包裹类
BeanWrapper moWrapper = new BeanWrapperImpl(mo);
//设置值
moWrapper.setPropertyValue("name", "cutter_point");
moWrapper.setPropertyValue("phoneNumber", "有本事你打110"); MyObject mo1 = (MyObject) mo; System.out.println("1->" + mo1.getName() + "\n1->" + mo1.getPhoneNumber());
System.out.println("2->" + moWrapper.getPropertyValue("name") + "\n2->" + moWrapper.getPropertyValue("phoneNumber")); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
展示结果:

很方便,这样我们就免得写反射代码再去设置了

2、       InitializingBean

对象实现这个接口之后,spring会在实例化对象之后,立马调用这个方法,我们可以定义一个线程,在这个类实例化之后,定时清理缓存

package cn.cutter.start.bean;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component; @Component
public class MyObject implements InitializingBean {
private String name;
private String phoneNumber; public MyObject() {
System.out.println("MyObjec construct!");
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("we do initializingbean afterpropertiesset !");
} }

Spring运行结果

@Test
public void test4() {
ApplicationContext ctx = before();
AwareTestBean awareTestBean = (AwareTestBean) ctx.getBean("awareTestBean");
AwareTestBean awareTestBean2 = (AwareTestBean) awareTestBean.getBean("awareTestBean");
// AwareTestBean awareTestBean3 = new AwareTestBean();
// AwareTestBean awareTestBean4 = (AwareTestBean) awareTestBean3.getBean("awareTestBean"); System.out.println(awareTestBean);
System.out.println(awareTestBean2);
// System.out.println(awareTestBean3);
// System.out.println(awareTestBean4); }

不要在意里面的其他代码,注解掉也无所谓,不在这次的演示范围内,其实我们只需要运行第一行代码,也就是其中的before()函数,好吧,我再把before函数发出来

public ApplicationContext before() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:application-bean.xml");
return ctx;
}

展示结果:

先执行构造函数,然后执行afterPropertiesSet

【sping揭秘】5、IOC容器(一)的更多相关文章

  1. 小白都能看懂的Spring源码揭秘之IOC容器源码分析

    目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...

  2. 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

    可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...

  3. Sping IOC容器

    Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...

  4. 【sping揭秘】3、Spring容器中bean默认是保持一个实例

    Spring容器中bean默认是保持一个实例 这里做一个测试,基础代码 package cn.cutter.start.provider; import org.springframework.con ...

  5. Spring IoC容器初始化过程学习

    IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...

  6. MyEclipse Spring 学习总结一 Spring IOC容器

    一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...

  7. [IoC容器Unity]第四回:使用范例

    1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...

  8. 请简要介绍Sping MVC、IoC和AOP

    Sping MVC是在Spring框架上发展起来的框架,它提供了构建Web应用程序的全功能MVC模块,使用了Spring可插入的MVC架构,可以自由的选择各个模块所使用的架构,非常灵活.Spring ...

  9. Spring IOC 容器源码分析系列文章导读

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

随机推荐

  1. springboot深入学习(一)-----springboot核心、配置文件加载、日志配置

    一.@SpringBootApplication @SpringBootApplication是spring boot的核心注解,源码如下: 相当于:@Configuration+@EnableAut ...

  2. 证明抛物线焦点发出的光线经y=ax^2反射后平行于y轴

  3. App测试基本流程详解(汇总整理)

    前言 看过许多大神对APP测试的理解,博主总结了一下我们平时测试APP应该注意的一些测试点并结合大神的理解,总结出这篇文章. 一.测试周期 测试周期一般为两周,根据项目情况以及版本质量可适当缩短或延长 ...

  4. Router components

    Input Unit The Input unit contains virtual channel buffers and an input VC arbiter. Route Info: use ...

  5. c语言spline

    #define NRANSI #include "nrutil.h" void spline(float x[], float y[], int n, float yp1, flo ...

  6. excel 错误提示以及其他基础知识

    http://wenda.tianya.cn/question/05a3d11b0e4f3c34 For i = 1 To ActiveSheet.ChartObjects.Count       M ...

  7. FPGA速度等级

    转自http://wenku.baidu.com/view/ea793deef8c75fbfc77db263.html?from=rec 最初接触speed grade这个概念时,很是为Altera的 ...

  8. 程序重复报more than 'max_user_connections' active connections问题解决

    早晨,开发扔过来一个问题,截图如下: ums already has more than 'max_user_connections' active connections 查看数据库发现: 最大连接 ...

  9. Struts2--HelloWord

    Struts2官网 官网指南 官网下载Struts2.5-min-lib.zip解压把lib目录下jar包拷贝到web项目lib目录下 配置web.xml文件 <filter> <f ...

  10. Objective-C的泛型

    WWDC2015的明星是Swift.在Swift语言到2.0以后会被开源,这其中包括了protocol扩展和一个新的错误处理API. 苹果的小baby已经长成,并且意料之中的获得了开发者的关注.但是在 ...