美文网首页Java 杂谈JAVA学习记录Java
《Spring实战》-第三章:Bean的高级装配(4)-Bean

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

作者: 廖小明的赖胖子 | 来源:发表于2019-03-17 13:40 被阅读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的作用域分为四种:

    • 单例( Singleton ):在整个应用中,只创建 bean 的一个实例
    • 请求( Rquest ):在 Web 应用中,为每个请求创建一个 bean 实例
    • 会话( Session ):在 Web 应用中,为每个会话创建一个 bean 实例
    • 原型( Prototype ):每次注入或者通过 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两个类中,其代表常量如下:

    • ConfigurableBeanFactory.SCOPE_SINGLETON ="singleton";
    • ConfigurableBeanFactory.SCOPE_PROTOTYPE ="prototype";
    • WebApplicationContext.SCOPE_SESSION = "session";
    • WebApplicationContext.SCOPE_REQUEST = "request";

    Ⅱ、在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>
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/dycumqtx.html