【sping揭秘】5、IOC容器(一)
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容器(一)的更多相关文章
- 小白都能看懂的Spring源码揭秘之IOC容器源码分析
目录 前言 IOC 只是一个 Map 集合 IOC 三大核心接口 IOC 初始化三大步骤 定位 加载 注册 总结 前言 在 Spring 框架中,大家耳熟能详的无非就是 IOC,DI,Spring M ...
- 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管
可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...
- Sping IOC容器
Sping IOC容器 package servlet; import org.springframework.context.ApplicationContext; import org.sprin ...
- 【sping揭秘】3、Spring容器中bean默认是保持一个实例
Spring容器中bean默认是保持一个实例 这里做一个测试,基础代码 package cn.cutter.start.provider; import org.springframework.con ...
- Spring IoC容器初始化过程学习
IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...
- MyEclipse Spring 学习总结一 Spring IOC容器
一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...
- [IoC容器Unity]第四回:使用范例
1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...
- 请简要介绍Sping MVC、IoC和AOP
Sping MVC是在Spring框架上发展起来的框架,它提供了构建Web应用程序的全功能MVC模块,使用了Spring可插入的MVC架构,可以自由的选择各个模块所使用的架构,非常灵活.Spring ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
随机推荐
- 2018.12.17 hdu2138 How many prime numbers(miller-rbin)
传送门 miller−rabbinmiller-rabbinmiller−rabbin素数测试的模板题. 实际上miller−rabinmiller-rabinmiller−rabin就是利用费马小定 ...
- const修饰指针时应注意的问题
1.指向常量的指针 顾名思义,一个指针指向const对象,则称它为指向常量的指针. ; int* ptr=&a; //错误 const int* ptr=&a; //必须用const来 ...
- python的6种基本数据类型--字典
python的6种基本数据类型--字典 字典 字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1:value1,key2:value2} 1.键与值用冒号":& ...
- 第31章:MongoDB-索引--复合索引
①复合索引 对多个字段创建索引被称为复合索引或者组合索引 ②创建组合索引 创建组合索引(以后台模式创建) db.user.ensureIndex({"username": 1, & ...
- Path类对路径字符串的操作
在写程序时,不时会用到处理文件路径的问题,例如:取得扩展名.从路径中取出文件名.路径合并.取出或者去年扩展名等.这些功能都可以通过System.IO.Path类提供的方法来实现.这些相关功能用过多次了 ...
- window+R
好记性不如烂笔头, window+R:打开运行 等同于:所有程序-->附件-->运行
- spring-aop代理的生效原理
主要说下spring里aop的生效的原理吧,并不是讲底层的cglib和gdk动态代理. 还是老一套的分析流程,先找到了aop的标签的handler,然后看下在解析这个标签的时候,都干了些什么,其实主要 ...
- UT源码105032014098
(2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...
- 3.Django视图
视图 视图接受Web请求并且返回Web响应 视图就是一个python函数,被定义在views.py中 响应可以是一张网页的HTML内容,一个重定向,一个404错误等等 响应处理过程如下图: URLco ...
- 如何获取帮助———— QQ群讨论摘要
QQ群对话整理(删除一些简单的回应),对一些重要的地方,我做了一些加粗 宝玉 2015/9/21 1:49:05 这次题目还有个问题就是如何读取Excel,我想对于很多同学来说是个困难 ...