IOC(控制反转)
即:某一个接口具体实现类的选择控制权从调用类中移除(这句话的意思就是在学生类中的某个方法里new了一个其他类的对象,现在不这么做了),交个了第三方(spring)来管理。由于IOC这个概念很模糊,后来又有人提出了DI(依赖注入),即:让调用类对某些对象的依赖由第三方来管理。
注入方式
1.构造函数注入
2.属性注入
这两种方式在实际应用中我们也是通过配置文件或者注解的方式使用。(通过反射来实现Bean的创建)
类加载器
类加载器的作用是找到类的字节码文件并构造出在jvm中表示的对象组件
类加载器的工作机制
1.装载
查找并导入class文件
2.链接
(a)校验class文件的正确性
(b)给类的静态变量分配存储空间
(c)将符号引用转成直接引用
3.初始化
对类的静态变量,静态代码块执行初始化工作
jvm在运行时会产生三个类加载器:
1.根加载器(负责加载jre的核心类库)
2.扩展类加载器(负责加载jre扩展目录的jar包)
3.应用类加载器(加载classpath下面的类文件)
三者关系是:爷爷(根加载器),爸爸(扩展类加载器),孙子(应用类加载器)
双亲委派机制:jvm在加载类的时候会先找父加载器,只有在父加载器找不到的时候才由应用类加载器加载classpath下的类(先给爷爷找再给爸爸找,最后由孙子找),这样做是出于安全考虑:试想有人想恶意修改String类,可以自定义,但是加载的时候总是由根加载器加载核心类库下的String。
BeanFactory和ApplicationContext
BeanFactory简介
spring通过一个配置文件就描述了Bean以及Bean之间的关系,通过java的反射机制来实例化Bean并且建立Bean之间的关系。
public class BeanFactoryTest {
public static void main( String[] args ) {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("这里是我们配置Bean.xml的路径");
BeanFactory bf = new XmlBeanFactory(resource);
System.out.println("init beanFactory");
AuthSMSCodeVO vo = bf.getBean("vo",AuthSMSCodeVO.class);
System.out.println("bean is ready for using");
}
}
注意:通过BeanFactory启动IOC容器时,并不会初始化配置的Bean,初始化动作发生在第一次调用时,并且缓存这个Bean(单例)
ApplicationContext简介
它由BeanFactory派生而来,提供了更多的功能
初始化ApplicationContext后就可以象前面那样用getBean方法获取Bean了,但是这里指的注意的是:ApplicationContext和BeanFactory的初始化有一个重大的区别,BeanFactory在启动容器时并不会初始化Bean(第一次访问Bean才初始化),而ApplicationContext则在启动应用上下文的时候就会初始化所有的Bean
todo:ioc的高级能容并补充进来