花都区水务建设管理中心官方网站,网页设计培训班招生,商务网站的特点,成都住建局官网保交楼本篇内容包括#xff1a;IOC 和 DI 的概念、Spring 容器#xff0c;即 BenaFactory 与 AplicationConext 等 IOC 相关内容。 一、IOC 和 DI 的概念
1、IOC
IoC#xff08;Inversion of control #xff09;即“控制反转”#xff0c;它是一种设计思想而非一个技术实现。… 本篇内容包括IOC 和 DI 的概念、Spring 容器即 BenaFactory 与 AplicationConext 等 IOC 相关内容。 一、IOC 和 DI 的概念
1、IOC
IoCInversion of control 即“控制反转”它是一种设计思想而非一个技术实现。描述了Java 开发领域对象的创建以及管理的问题。通过Spring来管理对象的创建、配置和生命周期这样相当于把控制权交给了Spring不需要人工来管理对象之间复杂的依赖关系这样做的好处就是解耦。
Spring 实现 IOC 的重要手段是依赖注入 DI 对象间的依赖的控制权从开发人员手中转移到了容器中降低了开发成本.
在 Spring 里面主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器通过他们来实现对 Bean 的管理。
2、DI
IoC 最常见以及最合理的实现方式叫做依赖注入Dependency Injection简称 DI。
依赖注入DIDependency Injection是 Spring 实现 IOC 的重要手段依赖注入将对象间的依赖的控制权从开发人员手中转移到了容器中降低了开发成本。
3、IOC 容器
在Spring里面主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器通过他们来实现对 Bean 的管理。 BeanFactory 粗暴简单可以理解为就是个 HashMapKey 是 BeanNameValue 是 Bean 实例。通常只提供注册put获取get这两个功能。我们可以称之为 “低级容器”。 ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。 二、Spring 容器设计
1、BenaFactory
BenaFactory 可以说是 IOC 最顶层的接口其定义了一个 IOC 容器的基本规范可以说 BenaFactory 就是一个低配版的 IOC 容器其定义了 IOC 容器最基本的功能
BeanFactory 使用控制反转对应用程序的配置和依赖性规范与实际的应用代码进行分离BeanFactory 实例化后并不会自动实例化 Bean只有当 Bean 被使用时才会对其进行实例化与依赖关系的装配。
public interface BeanFactory {//对 FactoryBean 的转义定义因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象如果需要得到工厂本身需要转义。String FACTORY_BEAN_PREFIX ;//根据 bean 的名字获取在 IOC 容器中得到 bean 实例。Object getBean(String name) throws BeansException;//根据 bean 的名字和 Class 类型来得到 bean 实例增加了类型安全验证机制。T T getBean(String name, ClassT requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;T T getBean(ClassT requiredType) throws BeansException;T T getBean(ClassT requiredType, Object... args) throws BeansException;T ObjectProviderT getBeanProvider(ClassT requiredType);T ObjectProviderT getBeanProvider(ResolvableType requiredType);//提供对 bean 的检索看看是否在 IOC 容器有这个名字的 bean。boolean containsBean(String name);//根据 bean 名字得到 bean 实例并同时判断这个 bean 是不是单例。boolean isSingleton(String name) throws NoSuchBeanDefinitionException;//根据 bean 名字得到 bean 实例并同时判断这个 bean 是不是原型。boolean isPrototype(String name) throws NoSuchBeanDefinitionException;//判断 bean 名字和 Type 判断 JavaBean 是否匹配指定的类型boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, Class? typeToMatch) throws NoSuchBeanDefinitionException;//得到 bean 实例的 Class 类型NullableClass? getType(String name) throws NoSuchBeanDefinitionException;NullableClass? getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;//得到 bean 的别名如果根据别名检索那么其原名也会被检索出来String[] getAliases(String name);}可以看到在 BeanFactory 里只对 IOC 容器的基本行为作了定义根本不关心你的 Bean 是如何定义怎样加载的。而要知道 Bean 是如何定义怎样加载的我们需要看具体的 IOC 容器实现Spring 提供了许多 IOC 容器的 实现 。比如 GenericApplicationContext 与 ClasspathXmlApplicationContext 。
2、AplicationConext
ApplicationContext 是 Spring 中的核心接口和容器允许容器通过应用程序上下文环境创建、获取、管理 bean。在构建容器的时候创建对象采用的策略是立即加载的方式即只要一读取完配置文件就立即创建配置文件中配置的对象BeanFactory采用的是延迟加载的方式什么时候根据 id 获取对象了什么时候才真正地创建对象。 从以上类图我们可以看出 ApplicationContext 继承了 6 个接口除了继承自 BeanFactory 的 HierarchicalBeanFactory 和 ListableBeanFactory 以外还包括了EnvironmentCapable、
ApplicationEventPublisher、ResourcePatternResolver 和 MessageSource。
EnvironmentCapable简单地说就是获取环境变量定义了 ApplicationContext 启动时的环境为应用程序环境的两个关键方面建模配置文件和属性ApplicationEventPublisher主要是做事件ApplicationEvent传播、事件发布的功能ResourcePatternResolver主要是做资源Resource加载支持多种类型加载MessageSource国际化国际化简而言之就是说国际通用的意思那就是需要不同的语言进行翻译这个是可以自定义的在资源文件夹下创建。
### Spring 的三个主要实现类
ClassPathXmlApplicationContext可以加载类路径下的配置文件要求配置文件必须在类路径之下FileSystemXmlApplicationContext可以加载磁盘中任意路径下的配置文件要求具有访问权限AnnotationConfigApplicationContext用于读取注解创建容器。