【Spring注解系列03】@Scope与@Lazy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_37107022/article/details/88878472

1.@Scope与@Lazy

@Scope

对象实例作用域,默认是单实例的。

取值有四个:
/**
 * @see ConfigurableBeanFactory#ConfigurableBeanFactory#SCOPE_PROTOTYPE    
 * @see ConfigurableBeanFactory#SCOPE_SINGLETON  
 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST  request
 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION     sesssion
 *
 * @Scope:调整作用域
 * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
 *                 每次获取的时候才会调用方法创建对象;
 * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
 *           以后每次获取就是直接从容器(map.get())中拿,
 * request:同一次请求创建一个实例
 * session:同一个session创建一个实例
 */

@Lazy

懒加载只针对单实例bean,对于单实例bean默认在容器启动的时候创建对象;

标注@Lazy后,容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;

lazy和scope等价于

    <beans>
        <bean id="person" class="com.java.model.Person" scope="singleton" lazy-init="false">
            <property name="id" value="11111"></property>
            <property name="name" value="vhsj"></property>
        </bean>
    </beans>

2.实例

配置类:

@Configuration
public class BeanScopeLazyConfig {

    //单例注入
    @Scope
    @Bean
    public Person single(){
        return new Person("id111","初始化111");
    }

    //多实例
    @Scope("prototype")
    @Bean
    public Person many(){
        return new Person("id222","初始化222");
    }

    //----------------------测试@Lazy在单例注入中的作用
    @Scope
    @Bean
    public Person noLazy(){
        System.out.println("noLazy--->配置类中初始化.....");
        return new Person("id3","初始化3");
    }

    @Lazy
    @Scope
    @Bean
    public Person lazy(){
        System.out.println("lazy--->配置类中初始化.....");
        return new Person("id4","初始化4");
    }
}

测试类:

public class BeanScopeLazyConfigTest {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanScopeLazyConfig.class);
        System.out.println("env----->容器初始化完毕.......");

        System.out.println();

        System.out.println("----------------------------->验证单例和多实例----------------------");
        Person single = (Person) applicationContext.getBean("single");
        Person single2 = (Person) applicationContext.getBean("single");
        System.out.println("single---->" + single);
        System.out.println("single2---->" + single2);
        System.out.println("single==single2---->" + (single == single2));

        Person many = (Person) applicationContext.getBean("many");
        Person many2 = (Person) applicationContext.getBean("many");
        System.out.println("many---->" + many);
        System.out.println("many2---->" + many2);
        System.out.println("many==many2---->" + (many == many2));
        System.out.println("----------------------------->验证单例和多实例----------------------");

        System.out.println();
        System.out.println("----------------------------->验证单例懒加载@Lazy----------------------");
        Person noLazy = (Person) applicationContext.getBean("noLazy");
        Person lazy = (Person) applicationContext.getBean("lazy");
    }
}

测试结果:

 我们可以看到,在容器初始化完成前就加载了非懒加载的实例noLazy,而标有@Lazy的类,在获取时才加载。

对于单例和多实例,可以看到单例对象是相等的,而多实例中是不相等的

noLazy--->配置类中初始化.....
env----->容器初始化完毕.......

----------------------------->验证单例和多实例----------------------
single---->Person{id='id111', name='初始化111'}
single2---->Person{id='id111', name='初始化111'}
single==single2---->true
many---->Person{id='id222', name='初始化222'}
many2---->Person{id='id222', name='初始化222'}
many==many2---->false
----------------------------->验证单例和多实例----------------------

----------------------------->验证单例懒加载@Lazy----------------------
lazy--->配置类中初始化.....

猜你喜欢

转载自blog.csdn.net/baidu_37107022/article/details/88878472
今日推荐