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. msyql 主从配置

    vim /etc/mysql/my.cnf; # 以下部分一定要配置在[mysqld]后面 [mysqld] log-bin=mysql-bin server-id= //设置数据库服务器唯一ID,这 ...

  2. JSON_FORCE_OBJECT 数字索引数组 强转对象

    $abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...

  3. react创建项目报错unexpected end of json while parsing near xxx

    报这个错,执行下面的命令,然后重新创建项目就可以. npm cache clean --force

  4. C语言编程题

    1.将整形a的第m位赋值到整形b的第n位 int fun4(int a, int m, int b, int n) { a = (a>>m) & ;//将a的第m位取出,为1或0, ...

  5. Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)

    Javascript.Jquery获取浏览器和屏幕各种高度宽度 另外参见    http://www.cnblogs.com/top5/archive/2009/05/07/1452135.html ...

  6. beforeunload事件

    window.addEventListener("beforeunload", function (e) { var confirmationMessage = "\o/ ...

  7. css3 box-sizing详解。

    人们慢慢的意识到传统的盒子模型不直接,所以他们新增了一个叫做 box-sizing 的CSS属性. box-sizing: 盒大小,盒模型. 我们经常遇到左右模块宽度为50%,加个边框会掉下去,加一个 ...

  8. 笔记:认识 head 标签 待 更新中……

    文档的头部描述了文档的各种属性和信息,包括文档的标题等.绝大多数文档头部包含的数据都不会真正作为内容显示给读者. 下面这些标签可用在 head 部分: <head> <title&g ...

  9. hibernate增删改

    public class HibernateUtils { private static SessionFactory sessionFactory=null; static{ //获取config ...

  10. jQuery插件初级练习1答案

    html: <script> $(".btn").click(function(){ $.color($("#box"),"blue&qu ...