欢迎关注头条号:java小马哥

周一至周日早九点半!下午三点半!精品技术文章准时送上!!!

精品学习资料获取通道,参见文末

spring ioc是spring的核心之一,也是spring体系的基础,那么spring ioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的bean都是通过spring容器来管理。这样做有什么好处呢?解耦!以前程序直接的调用用new直接给写死了,现在我们可以通过注入不同的接口实现类来完成对象直接的调用。

首先来聊聊Java的反射机制

1、反射机制的作用:

反编译:.class-->.java

通过反射机制访问java对象的属性,方法,构造方法等;

2、Java反射机制用途:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

3、sun为我们提供了那些反射机制中的类:

java.lang.Class;

java.lang.reflect.Constructor;

java.lang.reflect.Field;

java.lang.reflect.Method;

java.lang.reflect.Modifier;

4、反射实现的方式

Class c=Class.forName("className");

注明:className必须为全名,也就是得包含包名,比如,cn.xx.UserInfo;

Object obj=c.newInstance();

//创建对象的实例

Constructor getConstructor(Class[] params)

//根据指定参数获得public构造器

Constructor[] getConstructors()

//获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params)

//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()

//获得public的所有构造器

ewInstance();

//创建对象的实例

获得类方法的方法

Method getMethod(String name, Class[] params),

根据方法名,参数类型获得方法

Method[] getMethods()

//获得所有的public方法

Method getDeclaredMethod(String name, Class[] params)

//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()

//获得所以的public和非public方法

获得类中属性的方法

Field getField(String name)

//根据变量名得到相应的public变量

Field[] getFields()

//获得类中所以public的方法

Field getDeclaredField(String name)

//根据方法名获得public和非public变量

Field[] getDeclaredFields()

//获得类中所有的public和非public方法

总结一句,以前写的代码,类的熟悉、方法什么东西的都固定了,如果使用反射我们就可以在运行的时候动态的去修改、增删对象的熟悉、方法等等。

spring IOC是如果使用反射来完成对象的注入呢?

1、读取配置文件,或者扫描注解属性

2、根据配置文件,通过反射实例化对象

3、给对象注入依赖的属性

4、放到类似hashMap结构中,供系统调用

/**

* 学习版容器

*

*/

public class LeamClassPathXMLApplicationContext {

private List beanDefines = new ArrayList();

private Map sigletons = new HashMap();

public LeamClassPathXMLApplicationContext(String filename){

this.readXML(filename);

this.instanceBeans();

this.injectObject();

}

/**

* 为bean对象的属性注入值

*/

private void injectObject() {

for(Definition beanDefinition : beanDefines){

Object bean = sigletons.get(beanDefinition.getId());

if(bean!=null){

try {

PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();

for(ProsDefinition propertyDefinition : beanDefinition.getPropertys()){

for(PropertyDescriptor properdesc : ps){

if(propertyDefinition.getName().equals(properdesc.getName())){

Method setter = properdesc.getWriteMethod();//获取属性的setter方法

if(setter!=null){

Object value = sigletons.get(propertyDefinition.getRef());

setter.setAccessible(true);

setter.invoke(bean, value);//把引用对象注入到属性 }

break;

}

}

}

} catch (Exception e) {

}

}

}

}

/**

* 完成bean的实例化

*/

private void instanceBeans() {

for(Definition beanDefinition : beanDefines){

try {

if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))

sigletons.put(beanDefinition.getId(),

Class.forName(beanDefinition.getClassName()).newInstance());

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 读取xml配置文件

* @param filename

*/

private void readXML(String filename) {

SAXReader saxReader = new SAXReader();

Document document=null;

try{

URL xmlpath = this.getClass().getClassLoader().getResource(filename);

document = saxReader.read(xmlpath);

Map nsMap = new HashMap();

nsMap.put("ns

java bean参数清空_Java互联网架构-Spring IOC底层源码分析相关推荐

  1. java获取当前周一_Java互联网架构-Spring IOC源码分析

    欢迎关注头条号:java小马哥 周一至周日下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 源码介绍之前,看几个问题: Bean的承载对象是什么? Bean的定义如何存储的? B ...

  2. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  3. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  4. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  5. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  6. Spring IOC 容器源码分析

    Spring IOC 容器源码分析 创建时间: 2017-11-15 00:00:00 [TOC] Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring ...

  7. Spring IOC 容器源码分析 - 余下的初始化工作

    1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...

  8. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

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

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

最新文章

  1. LA3902 Network (树上dfs)
  2. linux用8m内存读取1g日志,检查 Linux 中内存使用状况的 8 条命令
  3. 金蝶CLOUD星空云tempdb过大处理方法
  4. ORACLE HANDBOOK系列之九:时间与时区(Time and Time Zone)
  5. 教你如何获取索爱X10 Android2.1 Root权限
  6. linux-组管理-添加组-删除组
  7. Android 音频开发(四) 如何播放一帧音频数据下
  8. (一)Nand FLASH 原理讲解
  9. .NET Framework-多线程网络编程
  10. win7计算机怎么录屏,win7电脑怎么录屏,什么电脑录屏软件好用?
  11. linux aria2 使用教程,Aria2安装配置使用教程
  12. c语言中实型变量的三种类型,在C语言中实型变量分为两种类型.doc
  13. 玛丽·娜拉(Marie Neurath)遗失的遗产
  14. linux的dlan脚本,Linux DLNA
  15. 解决Android SDK Manager无法更新下载 - 猪悟能 - 博客园 (cnblogs.com)
  16. 白胡子不杀黑胡子的真正原因
  17. Java实现 兔子数问题
  18. Linux内存、CPU及磁盘空间测试工具
  19. 国内汽车融资租赁ABN市场破冰 首单总注册额度20亿元花落易鑫
  20. android导入support-v4包(导包通用教程)

热门文章

  1. 案例分析:倾斜值传入导致 SQL 资源消耗升高
  2. 一文搞懂浏览器同源策略
  3. 了解库开发,我们从STM32标准库开发学起
  4. 【华为云技术分享】Nginx应用调优案例
  5. 华为云大咖说-庄表伟:架构师的基本功——管理篇
  6. 【nodejs原理源码赏析(9)】用node-ssh实现轻量级自动化部署
  7. 红橙Darren视频笔记 自定义View总集篇
  8. Win10+TeXLive2021无法识别新安装字体解决方法
  9. php border-style,border-style
  10. oozie mysql_【oozie】将oozie的数据库配置为mysql | 学步园