欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2025/3/20 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【Spring注解系列03】@Scope与@Lazy 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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@Beanpublic Person single(){return new Person("id111","初始化111");}//多实例@Scope("prototype")@Beanpublic Person many(){return new Person("id222","初始化222");}//----------------------测试@Lazy在单例注入中的作用@Scope@Beanpublic Person noLazy(){System.out.println("noLazy--->配置类中初始化.....");return new Person("id3","初始化3");}@Lazy@Scope@Beanpublic 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--->配置类中初始化.....

 

总结

以上是生活随笔为你收集整理的【Spring注解系列03】@Scope与@Lazy的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。