springIOC容器的基本概述
Ioc容器和依赖反转模式
个人理解吧
IOC是一种思想一种设计理念,即 “控制反转”, 主要依赖的就是依赖倒置原则,其实说白了, 就是把你写好的bean交给容器或者框架管理,在你需要的时候注入到你需要的class中去,很多bean其实不承载数据的,只是用来处理数据,而这种bean可以交由容器管理,在你需要的时候从容器中获取(注入到需要的地方)
如果没有这种理念, 你写的代码如果要完成一个功能比如向数据库添加一条数据在一个类里,要写完所有的功能比如获取数据、建立数据库连接、写sql ,ok 假如你不觉得麻烦, 那某一天如果 要你在另一个地方也写一个添加数据的功能,你只能再重新复制一份再写
这种无意义的重复代码会加重代码的耦合度而且可测试性低SpringIoc 的主要几种注入方式
接口注入、setter注入、构造器注入
我目前看的版本 setter注入和构造器注入是主要的注入方式Ioc容器系列的设计与实现:BeanFactory和 ApplicationContext
在springIoc 容器的设计中,我们可以看到有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列的容器只实现了容器的最基本的功能,另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的功能,同时对应用环境做了许多的适配。这两种基本的容器基本上可以满足用户对Ioc容器使用的大部分需求
SpringIoc容器系列
如果深入到spring 的实现中去看 ,我们说的Ioc容器 其实代表的是各种各样功能的容器产品,只是容器的功能有大有小,有各自的特点, 其实可以比喻一下 容器好比是一个水桶, 我们生活中会有各种各样的桶,铁的、木的、塑料的、高的、矮的、红色的、白色的等等。只要能装水的 我都可以认为是桶,来让用户使用
spring中也是一样有各种各样的容器供 用户使用,使用什么样的容器 完全取决于用户的需要,但是在使用之前如果能了解容器的基本情况,那对于使用容器是非常有帮助的
就像商品需要有产品规格一样, ioc容器的实现也需要给其定义基本的功能规范。这个基本的功能规范表现为接口类BeanFactory ,它体现了最基本的容器的功能规范
以下是BeanFactory 中定义的容器基本功能:String FACTORY_BEAN_PREFIX = "&"; // 获取指定的bean ,如果有的话 Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; // 检索容器中是否包含指定名称的bean boolean containsBean(String name); // 查询指定名称的bean 是否是单例 如果没有定义bean boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 查询指定名称的bean是否是原型 如果没有定义bean boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 查询指定名字的bean类型 是否是指定的类型, 该类型由用户给定 boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException; // 查询指定名称的bean的类型 Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 查询指定bean的所有别名 返回一个数组 这些别名都是用户在beanDefinition中定义的 String[] getAliases(String name);在这些spring 提供的基本Ioc容器的接口定义上和实现基础上,spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及他们之间的依赖关系。
BeanDefinition这玩意说白了 就是定义好数据结构用来 承载bean数据的
以下是BeanDefinition的主要骨架:String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; int ROLE_APPLICATION = 0; int ROLE_SUPPORT = 1; int ROLE_INFRASTRUCTURE = 2; // 获取父类BeanName String getParentName(); // set父类BeanName void setParentName(String parentName); String getBeanClassName(); void setBeanClassName(String beanClassName); String getFactoryBeanName(); void setFactoryBeanName(String factoryBeanName); String getFactoryMethodName(); void setFactoryMethodName(String factoryMethodName); String getScope(); void setScope(String scope); boolean isLazyInit(); void setLazyInit(boolean lazyInit); String[] getDependsOn(); void setDependsOn(String[] dependsOn); boolean isAutowireCandidate(); void setAutowireCandidate(boolean autowireCandidate); boolean isPrimary(); void setPrimary(boolean primary); ConstructorArgumentValues getConstructorArgumentValues(); MutablePropertyValues getPropertyValues(); boolean isSingleton(); boolean isPrototype(); boolean isAbstract(); int getRole(); String getDescription(); String getResourceDescription(); BeanDefinition getOriginatingBeanDefinition();这玩意写的太烦, 简单说下 这个接口 定义了bean的所有,如 类名,属性,scope,是否单例,构造函数参数列表,依赖的bean,是否懒加载 等等,其实就是将bean的信息对应到BeanDefinition中来, 后面对bean的操作可以对BeanDefinition操作, 例如 根据类名,属性,构造函数参数,使用反射对Bean进行对象创建,BeanDefinition是一个接口,是一个抽象的定义,实际使用的是其实现类,如ChildBeanDefinition、RootBeanDefinition、GenericBeanDefinition等。BeanDefinition继承了AttributeAccessor,说明它具有处理属性的能力;BeanDefinition继承了BeanMetadataElement,说明它可以持有Bean元数据元素,作用是可以持有XML文件的一个bean标签对应的Object
Spring IOC容器详解

本文深入解析Spring框架中的IOC容器概念,探讨依赖反转模式及其在代码解耦中的作用。阐述了BeanFactory与ApplicationContext两种核心容器的区别与功能,以及setter注入、构造器注入等常见注入方式。并介绍了BeanDefinition在容器中的角色,揭示了其如何承载bean信息,实现bean的管理和依赖注入。
1684

被折叠的 条评论
为什么被折叠?



