Spring相关知识

Spring相关知识

事务传播机制

  • Spring框架中的事务传播机制定义了在多个事务操作之间如何传播事务的行为。当一个方法被调用并开启了事务时,如果在该方法内部调用了其他事务性方法,事务传播机制就会决定如何处理这些嵌套事务。

  • 以下是Spring框架中常见的事务传播行为:

  1. PROPAGATION_REQUIRED(默认):如果当前没有事务,就创建一个新的事务;如果当前存在事务,就加入到当前事务中。这是最常用的传播行为。
  2. PROPAGATION_REQUIRES_NEW:每次都创建一个新的事务,并挂起当前事务(如果存在)。即使外部方法已经存在事务,内部方法也会开启一个新的事务。
  3. PROPAGATION_SUPPORTS:如果当前存在事务,就加入到当前事务中;如果当前没有事务,就以非事务方式执行。
  4. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就将其挂起。
  5. PROPAGATION_MANDATORY:必须在一个已有的事务中执行,否则会抛出异常。
  6. PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则开启一个新的事务。嵌套事务是内部事务的一部分,它可以独立于外部事务进行提交或回滚。

事务传播机制允许开发人员根据具体需求来管理事务的边界和行为,确保数据的一致性和完整性。通过配置适当的事务传播行为,可以实现对事务的灵活控制。

  • 示例:
  1. PROPAGATION_REQUIRED: 特点:如果当前没有事务,则创建一个新的事务;如果当前存在事务,则加入到当前事务中。这是最常用的传播行为。 示例:
javaCopy code@Transactional(propagation = Propagation.REQUIRED)
public void performParentOperation() {
    // 执行一些数据库操作
    performChildOperation();
}

@Transactional(propagation = Propagation.REQUIRED)
public void performChildOperation() {
    // 执行一些数据库操作
}

在上述示例中,当performParentOperation()方法被调用时,如果当前不存在事务,则会创建一个新的事务并执行父操作。在执行父操作期间,调用了performChildOperation()方法,它会在父事务的上下文中执行。

  1. PROPAGATION_REQUIRES_NEW: 特点:每次都创建一个新的事务,并挂起当前事务(如果存在)。即使外部方法已经存在事务,内部方法也会开启一个新的事务。 示例:
javaCopy code@Transactional(propagation = Propagation.REQUIRED)
public void performParentOperation() {
    // 执行一些数据库操作
    performChildOperation();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performChildOperation() {
    // 执行一些数据库操作
}

在上述示例中,当performParentOperation()方法被调用时,如果当前存在事务,则会挂起该事务并创建一个新的事务执行performChildOperation()方法。内部方法的事务是独立于外部方法的,即使外部方法的事务回滚,内部方法的事务也可以提交。

  1. PROPAGATION_SUPPORTS: 特点:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则以非事务方式执行。 示例:
javaCopy code@Transactional(propagation = Propagation.SUPPORTS)
public void performOperation() {
    // 执行一些数据库操作
}

在上述示例中,如果该方法被在事务上下文中调用,则会加入到当前事务中执行。如果没有事务上下文,它将以非事务方式执行。

  1. PROPAGATION_NOT_SUPPORTED: 特点:以非事务方式执行操作,如果当前存在事务,则将其挂起。 示例:
javaCopy code@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void performOperation() {
    // 执行一些数据库操作
}

在上述示例中,该方法将以非事务方式执行,即使在调用该方法时存在事务,事务将被挂起。

  1. PROPAGATION_MANDATORY: 特点:必须在一个已有的事务中执行,否则会抛出异常。 示例:
javaCopy code@Transactional(propagation = Propagation.MANDATORY)
public void performOperation() {
    // 执行一些数据库操作
}

在上述示例中,如果该方法被调用时不存在事务,则会抛出异常。它要求在已有的事务上下文中执行。

  1. PROPAGATION_NEVER: 特点:以非事务方式执行操作,如果当前存在事务,则抛出异常。 示例:
javaCopy code@Transactional(propagation = Propagation.NEVER)
public void performOperation() {
    // 执行一些数据库操作
}

在上述示例中,该方法将以非事务方式执行。如果在调用该方法时存在事务,则会抛出异常。

  1. PROPAGATION_NESTED: 特点:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则开启一个新的事务。嵌套事务是内部事务的一部分,它可以独立于外部事务进行提交或回滚。 示例:
javaCopy code@Transactional(propagation = Propagation.NESTED)
public void performParentOperation() {
    // 执行一些数据库操作
    performChildOperation();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performChildOperation() {
    // 执行一些数据库操作
}

在上述示例中,当performParentOperation()方法被调用时,如果当前存在事务,则在嵌套事务内执行performChildOperation()方法。嵌套事务是外部事务的一部分,但它可以独立于外部事务进行提交或回滚操作。

Spring七大模块

Spring框架是一个综合性的开发框架,提供了多个模块来支持不同方面的应用开发。以下是Spring框架的七大模块:

  1. Spring Core(核心模块): Spring核心模块提供了依赖注入(Dependency Injection)和控制反转(Inversion of Control)的功能,通过容器管理和组织应用程序的组件。它包括Bean容器、Bean定义、Bean的生命周期管理等。
  2. Spring AOP(面向切面编程模块): Spring AOP模块支持面向切面编程,提供了在应用程序中使用切面和通知的能力。它允许开发人员将横切关注点(如事务管理、日志记录等)从核心业务逻辑中分离出来,并通过声明式方式进行配置和管理。
  3. Spring MVC(Web模块): Spring MVC模块是基于MVC(Model-View-Controller)设计模式的Web框架,用于构建Web应用程序。它提供了处理HTTP请求、控制器、视图解析、数据绑定等功能,使开发人员能够更轻松地开发灵活和可扩展的Web应用程序。
  4. Spring Data(数据访问模块): Spring Data模块简化了与不同数据访问技术(如关系数据库、NoSQL数据库、键值存储等)的集成和操作。它提供了统一的API和模板,使开发人员能够更方便地进行数据持久化和查询。
  5. Spring Security(安全模块): Spring Security模块提供了全面的安全性解决方案,用于保护应用程序免受各种安全威胁。它支持身份认证、授权、访问控制、加密解密等功能,帮助开发人员构建安全可靠的应用程序。
  6. Spring Integration(集成模块): Spring Integration模块支持企业级应用程序的消息传递和集成,通过提供消息通道、消息转换、消息路由等功能,简化了不同系统之间的集成开发。
  7. Spring Testing(测试模块): Spring Testing模块提供了对Spring应用程序进行单元测试和集成测试的支持。它包括对依赖注入、AOP、Web请求、数据库操作等的测试框架和工具。

这些模块构成了Spring框架的核心组成部分,各自专注于不同的领域,为开发人员提供了丰富的功能和灵活性,使得应用开发更加简单、高效和可维护。

Bean工厂和applicationContext的区别:

在Spring框架中,Bean工厂(BeanFactory)和ApplicationContext都是用于管理和提供应用程序中的Bean对象的容器。它们之间的主要区别如下:

  1. 功能:
    • Bean工厂:Bean工厂是Spring的最基本容器,提供了基本的IOC(控制反转)和DI(依赖注入)功能。它是Spring IOC容器的核心,负责创建、配置和管理Bean对象。
    • ApplicationContext:ApplicationContext是Bean工厂的一个扩展,提供了更多的企业级功能和附加特性。除了Bean工厂的功能外,它还提供了国际化支持、事件发布、资源加载、AOP集成、事务管理等功能。
  2. 预实例化:
    • Bean工厂:Bean工厂采用延迟实例化策略,即在需要获取Bean时才进行实例化。
    • ApplicationContext:ApplicationContext默认采用预实例化策略,即在容器启动时即实例化所有的单例Bean对象。
  3. 配置文件加载:
    • Bean工厂:Bean工厂通常使用XMLBean配置文件进行配置。
    • ApplicationContext:ApplicationContext除了支持XMLBean配置外,还支持多种其他配置方式,如注解配置、Java配置等。
  4. 扩展接口:
    • Bean工厂:Bean工厂实现了基本的BeanFactory接口,提供了基本的IoC和DI功能。
    • ApplicationContext:ApplicationContext扩展了BeanFactory接口,并实现了更多的接口,如ApplicationEventPublisher、MessageSource、ResourceLoader等,以支持更多的功能和附加特性。

总体而言,Bean工厂是Spring IOC容器的基础,提供了基本的Bean管理功能,而ApplicationContext是Bean工厂的扩展,提供了更多的企业级功能和特性。如果只需要基本的IOC和DI功能,可以使用Bean工厂;如果需要更多的企业级功能,如国际化支持、事件发布、资源加载等,可以使用ApplicationContext。

基于注解的容器配置

基于注解的容器配置是一种在软件开发中使用注解来配置和管理应用程序组件的方式。在传统的容器配置中,我们需要通过XML或其他配置文件来显式地定义组件之间的依赖关系和配置信息。而基于注解的容器配置则将这些配置信息嵌入到组件的代码中,通过解析注解来完成配置的自动化。

使用基于注解的容器配置可以带来多种好处。首先,它简化了配置的过程,减少了繁琐的XML或其他配置文件的编写。其次,它使得配置信息与组件的实现代码紧密结合,提高了代码的可读性和可维护性。此外,注解可以提供更丰富的配置选项,例如依赖注入、作用域管理和切面等功能。

在基于注解的容器配置中,通常使用特定的注解来标记组件类或方法,以指示其在容器中的角色和配置信息。常见的注解包括:

  1. @Component:用于标记一个类作为组件,表示它将由容器进行管理。
  2. @Autowired:用于自动注入依赖关系,让容器自动为标记了该注解的属性或构造函数参数提供相应的实例。
  3. @Qualifier:用于在存在多个实例时指定注入的具体实例。
  4. @Configuration:用于标记一个类作为配置类,其中定义了容器的配置信息和组件的创建方式。
  5. @Bean:用于在配置类中声明一个Bean,表示容器将通过调用该方法来创建并管理相应的组件实例。
  6. @Scope:用于指定组件的作用域,例如单例(Singleton)或原型(Prototype)。
  7. @Aspect:用于定义切面类,其中包含了切点和通知的信息,用于实现面向切面编程(AOP)。

通过使用这些注解,开发人员可以更方便地进行组件的配置和管理,使得应用程序的开发和维护更加高效和灵活。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值