Spring注解驱动 @Scope和@Lazy 使用说明

最早期开发spring整合项目,太多的配置文件开发起来效率低,目前企业采用全注解方式进行开发,本章讲解@Configution 和 @Bean的配置使用,达到spring传统的配置文件方式

步骤一:新创建一个maven工程

步骤二:添加依赖


            org.springframework
            spring-context
            4.3.12.RELEASE

步骤三:创建一个实体类

package com.gcxzflgl.bean;

public class User {
        private String username;
        private int age;
        public User() {
        }
        public User(String username, int age) {
            this.username = username;
            this.age = age;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", age=" + age +
                    '}';
        }

}

步骤四:

创建一个配置类,加上@Scope作用域注解,默认是单例

package com.gcxzflgl.annotation;

import com.gcxzflgl.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration2 {
    @Scope
    @Bean("user")
    public User user (){
        return new User("gcx",22);
    }
}

步骤五:运行主类:

Spring注解驱动 @Scope和@Lazy 使用说明_第1张图片

 

@Scope支持的类型

 singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例

prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

  其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new 关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

  如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。 

 

在默认的@Scope在容器初始化时创建对象放到容器中

package com.gcxzflgl.annotation;

import com.gcxzflgl.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration2 {

    @Scope
    @Bean("user")
    public User user (){
        System.out.println("ioc容器加载");
        return new User("gcx",22);
    }
}

运行主类,可看到在容器初始化时已经加载对象到容器中

Spring注解驱动 @Scope和@Lazy 使用说明_第2张图片

 

如果@Scope是prototype,ioc容器不会立即将对象加载到容器中,必须在调用这个bean时才会加载到容器

Spring注解驱动 @Scope和@Lazy 使用说明_第3张图片

@Lazy懒加载用于单实例,在MyConfiguration2中将@Scope去掉,加上@Lazy注解

运行主类后,只有在调用时才会被加载到,并不会在默认的单实例启动后立即加载

你可能感兴趣的:(Spring)