spring什么情况下用never

fiy 其他 24

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring中,使用@Scope注解配置Bean的作用域时,可以通过never选项来设置Bean的作用域为“never”。

    通常情况下,Spring提供了一些常见的Bean作用域选项,如singleton(单例)、prototype(原型)、request、session等,用于控制Bean的实例化和销毁方式。而never选项则是一种不常用的作用域选择。

    当将Bean的作用域设置为never时,意味着Spring容器不会创建该Bean的实例。无论是通过注解配置还是通过XML配置,当Bean的作用域设置为never时,Spring在容器启动时不会自动实例化该Bean,也不会对其进行管理。

    使用never作用域的场景比较少见,一般适用于以下情况:

    1. 对于一些需要手动管理的Bean,可以将其作用域设置为never,这样Spring容器就不会对其进行管理。这样可以避免Spring容器对Bean的生命周期进行管理,可以自行控制Bean的创建和销毁时机。

    2. 部分特殊的Bean可能只在特定的条件下才需要实例化,而在其他情况下则不需要。如果将这些Bean的作用域设置为never,可以在需要时手动创建实例,而在不需要时避免资源的浪费。

    需要注意的是,使用never作用域需要确保在合适的时机手动创建和销毁Bean实例。否则,可能会导致程序出现意料之外的问题。

    总之,一般情况下不太建议使用never作用域,因为Spring的作用域选项已经提供了较为全面的选择,能够满足大部分开发需求。只有在特殊的需求下,或者对于特定的Bean需要手动管理时,才会考虑使用never作用域。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中never是一种事务传播行为(PROPAGATION_NEVER)。事务传播行为决定了在一个事务方法被调用期间,如何处理现有的事务。

    1. 绝不创建一个事务:在PROPAGATION_NEVER情况下,如果当前存在一个事务,那么该方法将会抛出一个异常,表示不允许在一个事务中执行。

    2. 独立运行:如果当前没有事务正在执行,那么该方法将在没有事务的环境下执行。

    3. 不会被其他事务要求加入:PROPAGATION_NEVER不会被其他事务所要求加入一个事务中。

    4. 常用于只读操作:一种常见的用法是在只读操作中使用PROPAGATION_NEVER,以避免在不必要的情况下占用数据库的锁资源,从而提高并发性能。

    5. 避免不良影响:同时使用PROPAGATION_NEVER和ReadOnly属性可以确保方法不会对数据库的数据进行修改,以避免不良的影响。

    总结:never是一种事务的传播行为,用于在不允许在一个事务中执行的情况下,独立运行方法。它可以用于只读操作并且可以避免对数据库数据的修改。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring中,@Transactional注解是用来实现事务管理的,用于定义在方法上的事务行为。而其中的参数属性之一就是“never”。

    下面我们来详细介绍一下,在什么情况下可以使用“never”属性。

    1. 事务传播属性
      事务传播属性主要用于控制事务在方法调用链中如何传播和管理。Spring提供了多种事务传播属性,包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED等属性。

    当在一个事务中调用一个带有“never”属性的方法时,如果当前存在事务,则会抛出异常。这是因为使用了“never”属性后,方法必须在没有事务的上下文中被调用,如果在已经存在事务的上下文中调用,则会抛出异常。

    1. 示例代码
      下面是一个使用了“never”属性的示例代码:
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        @Transactional(propagation = Propagation.REQUIRED)
        public void createUser(User user) {
            // do something
            userRepository.save(user);
            updateUserScore();
        }
    
        @Transactional(propagation = Propagation.NEVER)
        public void updateUserScore() {
            // do something
            userRepository.updateScore();
        }
    }
    

    在上面的示例中,createUser方法使用了REQUIRED属性,表示如果当前存在事务,则在现有事务中执行;如果当前没有事务,则创建一个新的事务并在其中执行。而updateUserScore方法使用了NEVER属性,表示该方法必须在没有事务的上下文中被调用。

    1. 应用场景
      使用“never”属性的情况主要有以下几种:
    • 当一个方法在被调用时,不允许被包含在事务中执行,例如一个查询方法,不需要事务的支持。
    • 当一个方法被一个事务方法调用时,可以通过“never”属性来确保该方法在没有事务的上下文中被执行,避免嵌套事务的问题。
    • 当我们需要明确要求某个方法在没有事务的上下文中执行,而不论是否已经存在事务。

    总结:

    • @Transactional注解的“never”属性用于指定方法在没有事务的上下文中被调用;
    • 使用“never”属性的方法必须在没有事务的上下文中执行,否则会抛出异常;
    • “never”属性常用于不需要事务支持的查询方法,以及避免嵌套事务问题的场景。
    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部