一、Spring是什么

1,Spring是一个轻量级开源框架

以 IOC(Inverse Of Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,最为典型的当属数据库事务的使用,还能整合开源世界众多著名的第三方框架和类库,应该说Spring框架已经融入到了Java EE的各个开发领域。


2,Spring的优势

2.1,简化开发

Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 容器管理,降低了组件之间的耦合性。

2.2,声明式事务的支持

只需要通过配置就可以完成对事物的管理,而无须手动编程, 提高开发效率和质量。

2.3,集成各种优秀框架

Spring接受各种开源框架,其内部提供了对各种优秀框架的直接支持。

2.4,AOP 编程的支持

Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。

3,Spring由哪些模块组成?

简单可以分成6大模块:

  • Core
  • AOP
  • ORM
  • DAO
  • Web
  • Spring EE

    二、什么是IOC

    1.IOC(控制反转:Inverse of Control),又称作依赖注入(DI)

    是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心,它并不是一种技术而是一种设计思想。

2.什么是控制反转?

控制:是容器对bean进行创建、管理。控制bean的整个生命周期。
反转:我们是被动接受Spring容器创建的对象,而不是自己主动去控制。

3.什么是依赖注入?

DI—Dependency Injection,即依赖注入;
依赖:应用程序依赖IoC容器,在程序运行的时候,应用程序需要IoC容器来提供对象需要的外部资源;
注入:IoC容器注入应用程序的某个对象,注入了其所需要的的外部资源(对象、资源和数据等);
所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是IoC是设计思想,DI是实现方式。

4.为什么需要IOC?

1.在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。
对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。
2.现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。
3.耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。
如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。
4.为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中,很多的J2EE项目均采用了IOC框架产品Spring。


5.我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,

这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程(通过字符名称找到类),根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

三、IOC核心API

1.BeanFactory(bean工厂)

是用于访问Spring Bean容器的根接口,典型的工厂模式,用于生产Bean的一个Bean工厂,其提供了生产Bean所需的最基本规则。
image.png

2.BeanDefinition(bean定义,可以理解为bean的设计图纸)

BeanDefinition是bean在spring中的描述定义,有了BeanDefinition(图纸)Bean工厂就可以生产Bean了。
接下来我们看看BeanDefinition的相关接口与类.
方法

  • String: getBeanClassName: 返回当前bean definition定义的类名
  • ConstructorArgumentValues: getConstructorArgumentValues:返回bean的构造函数参数
  • String[]: getDependsOn:返回当前bean所依赖的其他bean的名称
  • String: getFactoryBeanName: 返回factory bean的名称
  • String: getFactoryMethodName: 返回工厂方法的名称
  • BeanDefinition: getOriginatingBeanDefinition: 返回原始的BeanDefinition,如果不存在返回null
  • String: getParentName: 返回当前bean definition的父definition的名字
  • MutablePropertyValues: getPropertyValues: 返回一个用于新的bean实例上的属性值
  • String: getScope: 返回当前bean的目标范围
  • boolean: isAbstract: 当前bean是否是abstract,意味着不能被实例化
  • boolean: isLazyInit: bean是否是延迟初始化
  • boolean: isPrimary: bean是否为自动装配的主要候选bean
  • boolean: isPrototype: bean是否是多实例
  • boolean: isSingleton: bean是否是单例
  • void: setAutowiredCandidate(boolean): 设置bean是否对其他bean是自动装配的候选bean
  • void: setBeanClassName(String): 指定bean definition的类名
  • void: setDependsOn(String …): 设置当前bean初始化所依赖的beans的名称
  • void: setFactoryBeanName(String): 如果factory bean的名称
  • void: setFactoryMethodName(String): 设置工厂的方法名
  • void: setLazyInit(boolean lazyInit): 设置是否延迟初始化
  • void: setParentName(String): 设置父definition的名称
  • void: setPrimary(boolean): 设置是否主要的候选bean
  • void: setScope(String): 设置bean的范围,如:单例,多实例