Java 杂谈JAVA学习记录Java

《Spring实战》-第三章:Bean的高级装配(4)-Bean

2019-03-17  本文已影响0人  廖小明的赖胖子

慢慢来比较快,虚心学技术

1、什么是Bean的作用域?

默认情况下,Spring容器装配的Bean都是单例的,也就是说,不管什么情况下,在同一应用中通过Spring容器获取的都是同一个对象,也就导致了这个对象携带了很多可变的属性,有时候会很不方便。

比如:我们通过ApplicationContext先后获取BaseBean进行设值和取值,可以看到他们是同一个对象

@Component
public class BaseBean {
    private String name="BaseBean";
}

public class ScopeTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentConfig.class);

        //从Spring容器获取BaseBean并进行属性设置
        BaseBean baseBean = applicationContext.getBean(BaseBean.class);
        baseBean.setName("My Name");

        //从Spring容器获取BaseBean并进行属性比对
        BaseBean baseBean1 = applicationContext.getBean(BaseBean.class);
        System.out.println(baseBean.equals(baseBean1));
        System.out.println(baseBean1.getName());
    }
}

测试结果:
true
My Name

Spring中Bean的作用域分为四种:

2、如何限制Bean的作用域?

Ⅰ、在自动化配置中,我们通过@Scope结合@Component注解限制被注解Bean的作用域

如下我们将BaseBean的作用域设置为原型作用域,即每次获取都会重新创建一个新的BaseBean

@Component
@Scope("prototype")
public class BaseBean {
    private String name="BaseBean";
}

//执行ScopeTest测试结果如下:
false //baseBean和baseBean1不是同一个BaseBean
BaseBean

其实,Spring将Bean的作用域常量封装在ConfigurableBeanFactory和WebApplicationContext两个类中,其代表常量如下:

Ⅱ、在JavaConfig显式配置中,我们通过@Scope注解结合@Bean注解限制被注解Bean的作用域

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BaseBean baseBean{
    return new BaseBean();
}

Ⅲ、在XML显式配置中,我们通过限制bean节点的scope属性限制装配bean的作用域

<bean id="baseBean" class="com.my.spring.bean.BaseBean" scope="prototype">
     <constructor-arg name="name" value="baseBeanOne"></constructor-arg>
</bean>
上一篇下一篇

猜你喜欢

热点阅读