IOC基本概念
IOC的字面意思是控制反转,即包含两个意思:控制和反转。为了更好理解IOC,也有人称它为DI(Dependency Injection:依赖注入),让调用类对某一接口实现类的依赖关系交由第三方来控制,消除调用类对接口实现类的依赖。
IOC的类型
依赖注入包括三种方式:构造函数注入、属性注入和接口注入,Spring支持构造函数注入和属性注入
IOC的意义
帮助开发者从类的初始化和装载的工作中脱离出来,让开发者不在关注底层实现类的实例化、依赖关系装配等繁琐的工作,可以更加专注于业务逻辑的实现。Spring就是通过配置文件或注解的方式来描述类与类之间的依赖关系,自动完成类的初始化和依赖注入的工作。
容器
通过 new XmlBeanFactory("beans.xml")等方式可以启动Spring容器,Spring根据配置文件的信息,自动实例化bean并完成依赖关系的装配,从容器中即可返回准备就绪的bean实例,供后续使用。
类装载器Classloader
类装载器就是寻找类的字节码并构造出在JVM内部表示的对象的组件,类装载器将一个类装入JVM中,通常需要经过以下几步:
1.装载:查找和导入class文件
2.链接:执行校验、准备和解析步骤
a) 校验:检查导入class文件的正确性
b) 准备:给类的静态变量分配存储空间
c) 解析:将符号引用转出直接引用
3.初始化:对类的静态变量、静态代码块执行初始化工作
类加载工作由Classloader及其子类协同负责,Classloader是Java重要的运行时系统组件,它负责在运行阶段查到和导入class字节码。JVM运行时会产生三个Classloader:根装载器、(ExtClassLoader)扩展类装载器和(AppClassLoader)系统类装载器。
1.根装载器:负责JRE核心类库
2.扩展类装载器:负责JRE扩展目录Ext中的jar类包
3.应用类装载器:负责加载classpath目录下的类包
全盘负责委托机制
JVM加载类采用的原则是全盘负责委托机制。
“全盘负责“是指一个类在被某个Classloader加载时,除非显示的调用另一个Classloader,否则这个类以及类所依赖的和引用的类都由这个Classloader载入。
“委托机制”是指首先委托父装载器寻找目标类,只有父装载器找不到的情况下才从自己的类路径中查找并装载目标类。
Java反射机制
通过class对象获取类的构造函数、成员变量和方法类等元素的反射对象,通常包括三个反射类
1.constructor:类的构造函数反射类,通过getConstructors()方法获取类的构造函数反射对象数据。
2.method:类的方法反射类,通过getDeclareMethods()方法获取类的方法数组,通过getDeclareMethod(String name, Class....paramterTypes)方法获取特定方法。
3.field:成员变量反射类,通过getDeclareFields()方法获取类的所有变量数组,通过getDeclareField(String name)方法获取某个特定变量反射对象
资源访问器Resource
JDK虽然提供了资源访问类(URL、File等),但是它们并不能满足所有的资源访问的需求,因此Spring自己设计了一套resource接口,为开发提供了更强大的访问底层资源的能力。
resource在Spring中起着非常重要的作用,Spring通过resource加装各种配置资源,包括配置文件、国际化属性文件等。
ByteArrayResource:二进制数组资源,二进制数组资源可以通过程序在内存中构造
ClassPathResource:类路径下的资源
FileSystemResource:文件系统资源,资源以文件系统的方式存储
InputStreamResource:对应一个InputStream资源
ServletContextResource:web资源加装,支持以流或者URL方式访问
UrlResource:封装了java.net.Url,可以访问任何通过URL表示的资源