• 优点
    • 开源免费
    • 轻量非入侵
    • 控制反转 ioc,面向切面 aop
    • 对事务支持,框架支持。
  • 组成

    • image.png
    • spring框架是一个分层结构,由7层定义良好的模块组成,spring 模块构建在核心容器智商,核心容器定义了创建,配置,和管理bean的方式。
    • image.png

      组成细分

      核心容器

  • 核心容器提供框架的基本功能,核心容器的主要组件是 BeanFactory 是工厂模式的体现, BeanFactory 使用 控制反转 IOC 模式将应用程序的配置和依赖性规范和实际的应用程序代码分开

    Spring上下文

  • Spring 是一个配置文件,向Spring框架提供上下文信息,spring上下文包括企业服务,例如 JNDI,EJB,电子邮件,国际化,校验和调度功能

    Spring AOP

  • 通过配置管理特性,SpringAOP 模块直接将面向切面的编程功能集成到了 Spring模块中,所以可以很容易的使用Spring 框架管理任何支持AOP的对象,SpringAop 模块为基于Spring 的应用程序中的对象提供了事务管理服务,通过使用SpringAOP,不用依赖组件,就可以将生命行事务管理集成到应用程序中。

    Spring DAO

  • JDBC DAO 层提供了有意义的一场层次结构,可用该结构来管理一场处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大的降低了需要编写的异常代码数量, Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构

    Spring ORM

  • Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

    Spring Web

  • web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

    Spring MVC框架

  • MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring Boot 和 Spring Cloud

  • Spring boot 是 Spring 的一套快速配置脚手架,可以基于springboot 快速开发单个为服务

  • Spring Cloud是基于Spring boot实现的
  • Springboot专注于快速,放拜年集成的单个微服务个体,Spring Cloud 关注全局的服务治理框架
  • Springboot 使用了约束优于配置的理念,很多集成方案已经帮忙选择好了,能不进行配置就不进行配置,Spring Cloud很大的一部分基于 Springboot来进行实现,Spring boot则可以脱离Spring cloud 独立使用开发项目,但是 cloud 不能脱离 boot ,属于依赖的关系。

    IOC 理论推导复习

  • 以前所有东西都是由程序去进行创建,现在是由程序员自行控制创建对象,把主动权交给了调用者,程序不用去管怎么创建,怎么实现了,只负责提供一个接口。

    IOC 本质

  • 控制反转 ioc 是一种涉及思想,DI 依赖注入 是实现ioc的一种方法, 没有ioc的程序中,使用oop编程,对象的创建和对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建交给第三方,

  • ioc 是spring框架的核心内容,用多种方式实完美的实现了ioc,可以 xml配置,可以注解。
  • spring 容器在初始化时先读取配置文件,根据配置文件或元数据创建于组织对象存入容器中,程序使用时再从ioc容器中取出需要的对象。
  • image.png

    XML方式配置bean

  • bean的定义信息实现分离,采用注解的方式可以二者合为一体。bean的定义信息直接以注解的形式定义在实现类中,从而实现了零陪孩子的目的。

    依赖注入 DI

    概念

  • 依赖注入

  • 依赖: 指 Bean 对象的创建依赖于容器,. bean 对象的依赖资源
  • 注入: 只 Bean 对象所依赖的资源,由容器来设置和装配

    构造器注入

    Set注入(重点)

  • 要求被注入的属性,必须有set方法,如果属性为boolean类型,没有set方法,是is

    Bean 的作用域

  • Spring 中,哪些组成应用程序的主题及由Spring IoC容器所管理的对象,被称之为bean,简单讲,bean就是由ioc容器初始化,装配,及管理的对象。

  • image.png

几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

  • Songleton

    • 当一个bean的作用域为Singleton,那么Spring IOC容器中只会存在一个共享的bean的实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例,Singleton是单利类型,就是在创建起容器时就自动创建了一个bean的对象,不管是否使用毛豆存在,每次获取到的对象都是同一个对象, Singleton作用域是Spring中的雀圣作用域,要在xml中将bean定有成singleton 参照下面代码
      1. <bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
  • Prototype

    • 当一个bean的作用域为 Prototype ,表示一个bean定义对应多个对象实例,Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置
      • 有状态 与 无状态
        • java 类中 有装爱就是有数据存储功能,有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
        • 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。 ```javascript


    或者 ```

  • Request

    • 当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
      1. <bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
      针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁
  • Session

    • 当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
      1. <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
      针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

      自动装配

  • 自动装配是spring满足bean依赖的一种方法

  • spring会在应用上下文中为某个bean寻找其依赖的bean
  • Spring中bean有三种装配机制,分别是:
    1. 在xml中显式配置;
    2. 在java中显式配置;
    3. 隐式的bean发现机制和自动装配。 重点掌握

Spring 的自动装配需要从两个角度实现,或者说是两个操作:

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

  1. - 开启属性注解支持
  2. ``<context:annotation-config/>`
  3. <a name="ToksL"></a>
  4. ### 注解类型
  5. - @Autowired
  6. - 该注解按照类型自动装配,不支持id匹配
  7. - 需要倒入 spring-aop的包
  8. ```java
  9. public class User {
  10. @Autowired
  11. private Cat cat; // 为另外的类,通过注解进行依赖注入
  12. @Autowired // 可以不写set方法直接进行依赖注入
  13. private Dog dog;
  14. private String str;
  15. public Cat getCat() {
  16. return cat;
  17. }
  18. public Dog getDog() {
  19. return dog;
  20. }
  21. public String getStr() {
  22. return str;
  23. }
  24. }
  • 此时配置文件内容 ```java

  1. <a name="eRfh9"></a>
  2. ### 补充
  3. - @Autowired(required=false) 说明 false ,对象可以为null | true则对象必须有值,不能为null
  4. ```java
  5. @Autowired(required=false)
  6. // 如果要允许对象为null,设置为fasle,默认为true
  7. private Cat cat;
  • @Qualifier
    • @Autowired根据类型自动装配,加上@Qualifier则可以根据byName的方式自动装配
    • @Qualifer不能单独使用
    • image.png
  • @Resource

    • @Resource如有制定的name属性,先安该属性进行byName方式查找装配
    • 其次再进行默认的byName方式进行装配
    • 如果以上不成功,则按照byType的方式进行装配
    • 都不成功,则报异常

      小结

  • @Autowired @Resource 异同

    • 都可以用来装配bean ,都可以写在字段上,或者写在setter方法上
    • Autowired默认按照类型装配 ,默认情况下必须要求依赖对戏那个必须存在,如果需要允许null值,可以设置required为fasle ,如果想使用名称装配可使用Qualifier注解进行使用。
  • @Resource
    • 默认按照名称进行装配,名称可以通过name属性进行制定,如果没有制定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配,当找不到名称匹配的bean时才按照类型即逆行装配,但是需要注意的是,如果name属性一旦制定,就只会按照名称进行装配。
  • 它们的作用相同都是用注解方式注入对象,但执行顺序不同。
    • @Autowired先byType,
    • @Resource先byName。