spring怎么让一个类不是单例

不及物动词 其他 66

回复

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

    在Spring中,默认情况下,所有的Bean都是单例的,即每次获取该Bean都会返回同一个实例。但是,如果我们希望某个类不作为单例,即每次获取该Bean都返回一个新的实例,可以采取以下几种方式:

    1. 更改Bean的作用域:
      在Spring中,Bean的作用域可以通过@Scope注解进行配置。默认的作用域是"singleton",即单例。我们可以将作用域设置为"prototype",表示每次获取该Bean都会返回一个新的实例。

    例如,定义一个类MyClass,将其作用域设置为"prototype":

    @Component
    @Scope("prototype")
    public class MyClass {
        // ...
    }
    
    1. 使用方法注入:
      可以在需要获取Bean的地方,通过方法注入的方式获取一个新的实例。

    例如,在需要使用MyClass的地方,定义一个方法,并使用@Lookup注解标注该方法:

    @Component
    public class MyConsumer {
        private MyClass myClass;
    
        @Lookup
        public MyClass getMyClass() {
            return null;  // 由容器通过CGLIB动态生成的子类实现
        }
    
        public void doSomething() {
            myClass = getMyClass();
            // ...
        }
    }
    

    每次调用getMyClass()方法时,都会返回一个新的MyClass实例。

    1. 手动创建Bean:
      手动创建Bean是一种比较直接的方式,即不通过Spring容器获取Bean,而是在需要使用的地方手动创建一个新的实例。

    例如,可以使用关键字new直接创建一个新的实例:

    public void doSomething() {
        MyClass myClass = new MyClass();
        // ...
    }
    

    请注意,手动创建的对象将不受Spring容器管理,无法享受到Spring的依赖注入、自动装配等特性。

    以上是三种常见的让一个类不是单例的方式,根据实际需求选择适合的方式即可。

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

    在Spring中,默认情况下,所有通过容器创建的bean都是单例的,意味着在整个应用程序中只会有一个实例存在。但是,在某些情况下,我们可能希望某个类不是单例,即在每次请求时,都创建一个新的实例。为了实现这个目的,可以采取以下方法:

    1. 使用原型作用域
      在Spring中,我们可以通过将bean的作用域设置为"prototype"来实现原型的行为。使用原型作用域创建的bean在每次请求时都会创建一个新的实例。可以通过在bean的配置中添加scope="prototype"来指定bean的作用域为原型。
    <bean id="myBean" class="com.example.MyBean" scope="prototype"/>
    
    1. 使用对象工厂
      可以自定义一个对象工厂,该工厂在每次请求时创建一个新的实例。通过实现org.springframework.beans.factory.ObjectFactory接口,我们可以定义一个返回新实例的方法。然后,我们可以将该对象工厂与bean关联起来。
    public class MyBeanFactory implements ObjectFactory<MyBean> {
    
        @Override
        public MyBean getObject() {
            return new MyBean();
        }
    
    }
    
    <bean id="myBean" class="com.example.MyBean" factory-bean="myBeanFactory" factory-method="getObject"/>
    
    <bean id="myBeanFactory" class="com.example.MyBeanFactory"/>
    
    1. 使用Java配置
      如果使用Java配置的方式来配置Spring,可以使用@Scope注解将bean的作用域设置为原型。
    @Configuration
    public class AppConfig {
    
        @Bean
        @Scope("prototype")
        public MyBean myBean() {
            return new MyBean();
        }
    
    }
    
    1. 使用ObjectProvider
      在Spring 4.3及更高版本中,可以使用org.springframework.beans.factory.ObjectProvider类来获取bean的实例。通过使用ObjectProvider,我们可以在每次请求时获取一个新的实例。
    @Autowired
    private ObjectProvider<MyBean> beanProvider;
    
    public void someMethod() {
        MyBean myBean = beanProvider.getObject();
        // 使用myBean实例进行操作
    }
    
    1. 使用自定义注解
      可以创建一个自定义的注解,用于标记需要多实例的类。然后,可以使用自定义的注解来限定bean的作用域。
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface PrototypeBean {
        
    }
    
    @Component
    @PrototypeBean
    public class MyBean {
    
        // 类的实现
    }
    
    @Configuration
    public class AppConfig {
    
        @Bean
        @Scope("prototype")
        @PrototypeBean
        public MyBean myBean() {
            return new MyBean();
        }
    
    }
    

    上述方法提供了多种在Spring中让一个类不是单例(原型)的方式。根据具体的需求和使用场景,可以选择其中一种方法来实现。

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

    在Spring中,默认情况下,Bean是以单例的方式被创建和管理的,也就是说当我们在一个ApplicationContext容器中获取同一个Bean的实例时,Spring会返回同一个对象的引用。但是有时候我们需要让某个类不以单例的方式被创建,下面是三种方式可以实现这个目的。

    1. 通过配置文件设置作用域为非单例:
      在Spring的配置文件中,可以通过设置bean的scope属性来指定Bean的作用域。默认的作用域是singleton(单例),如果想让某个bean不是单例,可以将scope的值设置为prototype(原型)。
      示例配置文件:
    <bean id="myBean" class="com.example.MyBean" scope="prototype"/>
    
    1. 使用Java配置注解:
      在使用Java配置的方式创建Bean的时候,可以使用@Scope注解来指定Bean的作用域。
      示例Java配置类:
    @Configuration
    public class AppConfig {
        @Bean
        @Scope("prototype")
        public MyBean myBean() {
            return new MyBean();
        }
    }
    
    1. 在Java类中手动创建非单例的Bean:
      在某些情况下,我们可能需要手动创建一个非单例的Bean。可以在需要非单例的类中使用注解@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)来指定作用域。
      示例代码:
    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class MyBean {
        // 类的内容
    }
    

    需要注意的是,使用非单例的Bean时,需要考虑线程安全问题。因为每次获取Bean时,都会创建一个新的实例,所以需要确保该类的实现是线程安全的。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部