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. 2018.12.17 hdu2138 How many prime numbers(miller-rbin)

    传送门 miller−rabbinmiller-rabbinmiller−rabbin素数测试的模板题. 实际上miller−rabinmiller-rabinmiller−rabin就是利用费马小定 ...

  2. const修饰指针时应注意的问题

    1.指向常量的指针 顾名思义,一个指针指向const对象,则称它为指向常量的指针. ; int* ptr=&a; //错误 const int* ptr=&a; //必须用const来 ...

  3. python的6种基本数据类型--字典

    python的6种基本数据类型--字典   字典 字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1:value1,key2:value2} 1.键与值用冒号":& ...

  4. 第31章:MongoDB-索引--复合索引

    ①复合索引 对多个字段创建索引被称为复合索引或者组合索引 ②创建组合索引 创建组合索引(以后台模式创建) db.user.ensureIndex({"username": 1, & ...

  5. Path类对路径字符串的操作

    在写程序时,不时会用到处理文件路径的问题,例如:取得扩展名.从路径中取出文件名.路径合并.取出或者去年扩展名等.这些功能都可以通过System.IO.Path类提供的方法来实现.这些相关功能用过多次了 ...

  6. window+R

    好记性不如烂笔头, window+R:打开运行 等同于:所有程序-->附件-->运行

  7. spring-aop代理的生效原理

    主要说下spring里aop的生效的原理吧,并不是讲底层的cglib和gdk动态代理. 还是老一套的分析流程,先找到了aop的标签的handler,然后看下在解析这个标签的时候,都干了些什么,其实主要 ...

  8. UT源码105032014098

    (2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...

  9. 3.Django视图

    视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图: URLco ...

  10. 如何获取帮助———— QQ群讨论摘要

    QQ群对话整理(删除一些简单的回应),对一些重要的地方,我做了一些加粗   宝玉 2015/9/21 1:49:05       这次题目还有个问题就是如何读取Excel,我想对于很多同学来说是个困难 ...