spring什么情况下用never
-
在Spring中,使用@Scope注解配置Bean的作用域时,可以通过never选项来设置Bean的作用域为“never”。
通常情况下,Spring提供了一些常见的Bean作用域选项,如singleton(单例)、prototype(原型)、request、session等,用于控制Bean的实例化和销毁方式。而never选项则是一种不常用的作用域选择。
当将Bean的作用域设置为never时,意味着Spring容器不会创建该Bean的实例。无论是通过注解配置还是通过XML配置,当Bean的作用域设置为never时,Spring在容器启动时不会自动实例化该Bean,也不会对其进行管理。
使用never作用域的场景比较少见,一般适用于以下情况:
-
对于一些需要手动管理的Bean,可以将其作用域设置为never,这样Spring容器就不会对其进行管理。这样可以避免Spring容器对Bean的生命周期进行管理,可以自行控制Bean的创建和销毁时机。
-
部分特殊的Bean可能只在特定的条件下才需要实例化,而在其他情况下则不需要。如果将这些Bean的作用域设置为never,可以在需要时手动创建实例,而在不需要时避免资源的浪费。
需要注意的是,使用never作用域需要确保在合适的时机手动创建和销毁Bean实例。否则,可能会导致程序出现意料之外的问题。
总之,一般情况下不太建议使用never作用域,因为Spring的作用域选项已经提供了较为全面的选择,能够满足大部分开发需求。只有在特殊的需求下,或者对于特定的Bean需要手动管理时,才会考虑使用never作用域。
1年前 -
-
在Spring中never是一种事务传播行为(PROPAGATION_NEVER)。事务传播行为决定了在一个事务方法被调用期间,如何处理现有的事务。
-
绝不创建一个事务:在PROPAGATION_NEVER情况下,如果当前存在一个事务,那么该方法将会抛出一个异常,表示不允许在一个事务中执行。
-
独立运行:如果当前没有事务正在执行,那么该方法将在没有事务的环境下执行。
-
不会被其他事务要求加入:PROPAGATION_NEVER不会被其他事务所要求加入一个事务中。
-
常用于只读操作:一种常见的用法是在只读操作中使用PROPAGATION_NEVER,以避免在不必要的情况下占用数据库的锁资源,从而提高并发性能。
-
避免不良影响:同时使用PROPAGATION_NEVER和ReadOnly属性可以确保方法不会对数据库的数据进行修改,以避免不良的影响。
总结:never是一种事务的传播行为,用于在不允许在一个事务中执行的情况下,独立运行方法。它可以用于只读操作并且可以避免对数据库数据的修改。
1年前 -
-
在Spring中,@Transactional注解是用来实现事务管理的,用于定义在方法上的事务行为。而其中的参数属性之一就是“never”。
下面我们来详细介绍一下,在什么情况下可以使用“never”属性。
- 事务传播属性
事务传播属性主要用于控制事务在方法调用链中如何传播和管理。Spring提供了多种事务传播属性,包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED等属性。
当在一个事务中调用一个带有“never”属性的方法时,如果当前存在事务,则会抛出异常。这是因为使用了“never”属性后,方法必须在没有事务的上下文中被调用,如果在已经存在事务的上下文中调用,则会抛出异常。
- 示例代码
下面是一个使用了“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属性,表示该方法必须在没有事务的上下文中被调用。
- 应用场景
使用“never”属性的情况主要有以下几种:
- 当一个方法在被调用时,不允许被包含在事务中执行,例如一个查询方法,不需要事务的支持。
- 当一个方法被一个事务方法调用时,可以通过“never”属性来确保该方法在没有事务的上下文中被执行,避免嵌套事务的问题。
- 当我们需要明确要求某个方法在没有事务的上下文中执行,而不论是否已经存在事务。
总结:
- @Transactional注解的“never”属性用于指定方法在没有事务的上下文中被调用;
- 使用“never”属性的方法必须在没有事务的上下文中执行,否则会抛出异常;
- “never”属性常用于不需要事务支持的查询方法,以及避免嵌套事务问题的场景。
1年前 - 事务传播属性