Fork me on GitHub

Spring IOC

注意:所有文章除特别说明外,转载请注明出处.

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>

在IoC容器中装配Bean

本文标题:Spring IOC

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:01:03

原始链接:http://bangjinhu.github.io/undefined/Spring - IOC/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.