You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

一、spring是什么

spring是一个非常优秀的java框架其目标是为了简化java企业级开发内部包含了很多技术比如控制反转&依赖注入、面向切面编程、spring事务管理、通过spring集成其他框架、springmvc、springboot、springcloud等等

二、概念

1.容器

spring容器的概念容器这个名字起的相当好容器可以放很多东西我们的程序启动的时候会创建spring容器会给spring容器一个清单清单中列出了需要创建的对象以及对象依赖关系spring容器会创建和组装好清单中的对象然后将这些对象存放在spring容器中当程序中需要使用的时候可以到容器中查找获取然后直接使用。

2.IOC控制反转

使用者之前使用B对象的时候都需要自己去创建和组装而现在这些创建和组装都交给spring容器去给完成了使用者只需要去spring容器中查找需要使用的对象就可以了这个过程中B对象的创建和组装过程被反转了之前是使用者自己主动去控制的现在交给spring容器去创建和组装了对象的构建过程被反转了所以叫做控制反转IOC是是面相对象编程中的一种设计原则主要是为了降低系统代码的耦合度让系统利于维护和扩展。

3.DI依赖注入

依赖注入是spring容器中创建对象时给其设置依赖对象的方式比如给spring一个清单清单中列出了需要创建B对象以及其他的一些对象可能包含了B类型中需要依赖对象此时spring在创建B对象的时候会看B对象需要依赖于哪些对象然后去查找一下清单中有没有包含这些被依赖的对象如果有就去将其创建好然后将其传递给B对象可能B需要依赖于很多对象B创建之前完全不需要知道其他对象是否存在或者其他对象在哪里以及被他们是如何创建而spring容器会将B依赖对象主动创建好并将其注入到B中去比如spring容器创建B的时候发现B需要依赖于A那么spring容器在清单中找到A的定义并将其创建好之后注入到B对象中。

4.AOP面向切面编程

三、原理

1.IOC容器

容器负责对象实例化、初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作,负责对象的整个生命周期。 放到容器中的对象需要在xml或java注解配置列出需要让ioc容器管理的对象以及可以指定如何构建对象init方法destory方法构造函数初始化等当容器启动时就会加载这个配置文件然后将这些对象给组装好以供外部访问。IOC容器也叫Spring容器在源码中是一个Map

容器的使用步骤:

  1. 引入spring相关maven配置或jar包
  2. 创建bean配置文件比如bean xml
  3. 在bean xml文件中定义好需要spring容器管理的bean对象
  4. 创建spring容器并给容器指定需要装载的bean配置文件当spring容器启动后会加载这些配置文件然后创建好配置文件中定义好的bean对象将这些对象放在容器中以供使用
  5. 通过容器提供的方法获取对象

重要的接口

1.BeanFactory

作为spring容器的顶层接口提供了容器最基本的功能。 !Snipaste_2023-02-14_14-43-52.png 其中getBean用于按照名称或类型查找bean并返回isSingleton用于判断是否单例getBeanProvider用于获取指定类型bean对象的获取器。

2.ApplicationContext

通过ListableBeanFactory间接继承了BeanFactory并进行了扩展增加了很多功能AOP、国际化等 !Snipaste_2023-02-14_15-15-50.png

3.ClassPathXmlApplicationContext

实现了ApplicationContext接口并且容器可以从classpath加载Bean xml配置然后创建xml中配置的bean !Snipaste_2023-02-14_19-51-09.png

4.AnnotationConfigApplicationContext

实现了ApplicationContext接口通过注解方式扫描并创建bean !Snipaste_2023-02-14_19-54-08.png

四、FAQ

1.如何定义bean xml文件

<bean id="bean唯一标识" name="bean名称" class="完整类型名称" factory-bean="工厂bean名称" factory-method="工厂方法"> 每个bean都有一个名称叫做bean名称bean名称在一个spring容器中必须唯一否则会报错通过bean名称可以从spring容器获取对应的bean对象。

bean名称别名定义规则
  1. 当id存在的时候不管name有没有取id为bean的名称
  2. 当id不存在此时需要看namename的值可以通过 ,;或者空格 分割最后会按照分隔符得到一个String数组数组的第一个元素作为bean的名称其他的作为bean的别名
  3. 当id和name都存在的时候id为bean名称name用来定义多个别名
  4. 当id和name都不指定的时候bean名称自动生成生成规则下面详细说明

!Snipaste_2023-02-15_09-26-16.png !Snipaste_2023-02-15_09-28-15.png

2.容器创建bean实例的方法

  • 通过反射调用构造方法创建bean对象
  • 通过静态工厂方法创建bean对象
  • 通过实例工厂方法创建bean对象
  • 通过FactoryBean创建bean对象