@Scope bean的实例设置

xml配置介绍

<!-- 向 ioc 容器中注入 Bean -->
<bean id="user" class="com.liuzhihang.domain.User" scope="prototype">
    <property name="id" value="1"/>
    <property name="name" value="liuzhihang"/>
    <property name="age" value="25"/>
</bean>

标签内添加scope属性指定Bean实例类型

注解的方式

@Configuration
@ComponentScan(value = "com.liuzhihang")
public class ApplicationContextConfig {

    /**
     * 默认获取为单实例的
     * Bean 标签中 含有 scope 标签 默认 单实例
     * 单实例: ioc容器启动时 创建对象, 每次获取时时同一个 BeanDefinition.SCOPE_SINGLETON
     * 多实例: BeanDefinition.SCOPE_PROTOTYPE
     *
     * @return
     */
    @Scope
    @Bean
    public User user() {

        System.out.println("********* ioc 容器中创建 user");
        return new User(2L, "liuzhihang", 25);
    }
}

测试

public class IOCTest {

    ApplicationContext applicationContext;

    @Before
    public void before() {
        System.out.println("开始引入配置类");
        applicationContext = new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
    }

    /**
     * 测试 ioc 容器 scope
     */
    @Test
    public void instanceTest() {

        Object object = applicationContext.getBean("user");
        User user = applicationContext.getBean(User.class);

        System.out.println(user == object);
    }
}

1.@Scope(scopeName = BeanDefinition.SCOPE_SINGLETON) 即默认情况下, 控制台输出及结论:

开始引入配置类
********* ioc 容器中创建 user
true

结论: 服务启动, 开始引入配置类, 创建Bean注入ioc, 之后每次获取都是从ioc容器中获取同一个Bean

2.@Scope(scopeName = BeanDefinition.SCOPE_PROTOTYPE) 控制台输出及结论

开始引入配置类
********* ioc 容器中创建 user
********* ioc 容器中创建 user
false

结论: 服务启动时, 开始引入配置类, 此时并未创建Bean, 而是在每次获取的时候, 创建Bean, 从而获取的都是新的


   转载规则


《@Scope bean的实例设置》 liuzhihang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录