注意:所有文章除特别说明外,转载请注明出处.
IoC容器
1.IoC类型
从注入方式可以将IoC划分成三种:1.构造函数注入。2.属性注入。3.接口注入。
2.通过容器完成依赖关系的注入
相关Java基础
//通过Java反射机制以一种间接方式操控目标类
public class ReflectTest {
public static Car initByDefaultConst() throws Throwable {
//1.通过类装载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car");
//2.获取类的默认构造器对象并通过它实例化Car
Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
Car car = (Car) cons.newInstance();
//3.通过反射方法设置属性
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "宏碁");
...
return car;
}
public static void main(String[] args) throws Throwable {
Car car = initByDefaultConst();
car.instroduce();
}
}
类装载器 ClassLoader
1.类装载器工作机制
类装载器是寻找类的字节码文件并构造类在JVM内部表示对象的组件。在Java中,类装载器将一个类装入JVM中的步骤:
1.装载:查找和导入Class文件
2.链接:执行校验、准备和解析步骤。
2.1 校验:检查载入Class文件数据的正确性。
2.2 准备:给类的静态变量分配存储空间。
2.3 解析:将符号引用转换成直接引用。
3.初始化:对类的静态变量、静态代码块执行初始化工作。
扩展:JVM在运行时会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(应用类装载器)。
2.Java反射机制
BeanFactory 和 ApplicationContext
BeanFactory使管理不同类型的Java对象成为可能,应用上下文建立在 BeanFactory 基础之上,提供更多面向应用的功能。ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以使用ApplicationContext而非底层的BeanFactory。
1.BeanFactory
Spring为BeanFactory提供多种实现。XmlBeanDefinitionReader | DefaultListableBeanFactory。下面是该接口的扩展接口的说明:
1.ListableBeanFactory:该接口定义了访问容器中Bean的基本信息的若干方法。查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包含某一Bean等。
2.HierarchicalBeanFactory:父子级联IoC容器的接口,子容器可以通过接口方法访问父容器。
3.ConfigurableBeanFactory:增强IoC容器的可定制性。定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法。
4.AutowireCapableBeanFactory:定义将容器中的Bean按某种规则进行自动装配方法。
5.SingletonBeanRegistry:定义允许在运行期间向容器注册单实例Bean的方法。
6.BeanDefinitionRefistry:Spring配置文件中每一个<bean>结点元素。
2.初始化BeanFactory
XmlBeanDefinitionReader通过Resource装载Spring配置信息并启动IoC容器,然后通过 BeanFactory#getBean(beanName)方法从IoC容器中获取Bean。Spring在DefaultSingletonBeanRegistry类中提供一个用于缓存单实例Bean的缓存器,是一个用HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个HashMap中。
3.ApplicationContext
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统加载配置文件。ApplicationContext继承HierarchicalBeanFactory和ListableBeanFactory接口。同时还扩展其它BeanFactory接口。
1.ApplicationEventPublisher:让容器拥有发布应用上下文事件功能,包括容器启动和关闭事件。
2.MessageSource:为应用提供i18n国际化消息访问的功能。
3.ResourcePatternResolver:所有的ApplicationContext实现类都实现了类似于PathMatchingResourcePatternResolver的功能。
4.WebApplicationContext类体系
WebApplicationContext是专门为Web应用准备的,它允许从相对于Web根目录的路径中装载配置文件完成初始化工作。从WebApplicationContext中获得ServletContext的引用,整个Web应用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring应用上下文。
5.WebApplicationContext初始化
WebApplicationContext初始化和BeanFactory、ApplicationContext有区别,WebApplicationContext需要ServletContext实例,即它必须拥有Web容器的前提下才能完成启动。Spring提供用于启动WebApplicationContext的Servlet和Web容器监听器:
1. ...ContextLoaderServlet
2. ...ContextLoaderListener
在两者内部都实现启动WebApplicationContext实例逻辑。在web.xml中配置即可。
<!--1.指定配置文件-->
<context-param>
</context-param>
<!--声明Web容器监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>