Spring中注解方式下Bean的做用域 #yyds干货盘点#

2021年11月24日 阅读数:4
这篇文章主要向大家介绍Spring中注解方式下Bean的做用域 #yyds干货盘点#,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

简介

Spring bean 做用域默认是 单例 singleton;能够经过配置 prototype实现多例;java

被注入到Spring中的类

  • Account.java
@Scope("singleton")
@Component
public class Account {
}
  • User.java
@Scope("prototype")
@Component
public class User {
}

注:Scope的值,也能够使用下面的方式指定:
image.pngmarkdown

测试代码

public class ScopeTest {

    @Test
    void fun() {
        ApplicationContext act = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

        Account account1 = (Account) act.getBean("account");
        System.out.println(account1);
        Account account2 = (Account) act.getBean("account");
        System.out.println(account2);

        User user1 = (User) act.getBean("user");
        System.out.println(user1);
        User user2 = (User) act.getBean("user");
        System.out.println(user2);
    }

}

结果

结果

image.png

Spring使用注解注入多例的方式

在须要多例调用的类上加@Scope("prototype")
在进行注入时,不能直接使用@Autowired,不然注入的仍是单例,须要使用工厂,最简单的是用app

@Autowired
private ObjectFactory<T> objectFactory;

对象进行注入(T为你要注入的类),想要使用该多例对象时,使用以下方法:ide

T t = objectFactory.getObject();

结论

  • 单例状况下,容器建立时调用方法建立对象到容器中,在程序中调用bean,直接从容器中拿取,且每次拿取的都是同一个对象。若是上一次对bean里的属性作了修改,那下一次拿取的就是修改过的bean。
  • 多例状况下,容器建立完成时不调用方法建立对象到容器中,在程序中获取时,才会将对象加载到容器中,并且每次调用生成的都是不一样的对象。
  • 不要在Spring管理的类中添加状态信息。