版权声明:本文为博主原创文章,未经博主允许不得转载。 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--->配置类中初始化.....