189 8069 5689

SpringBean作用域-创新互联

目录

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的敦煌网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

什么是作用域呢 ?

那什么又是Spring Bean的作用域呢 ?

Spring框架默认Bean作用域是什么呢 ?

Spring Bean的作用域都有哪些呢 ?

如何设置Bean作用域


什么是作用域呢 ?

在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围,只在方法内部生效.

那什么又是Spring Bean的作用域呢 ?

我来给一下官方的定义: Spring Bean的作用域是指Bean在整个框架中的某种行为模式.

看着这官方定义是有点懵 啥叫行为模式.

那就在举一个例子 : Singleton是单例作用域,那就是指对于一个Bean,它在整个Spring框架中只存在一份,是全局的共享的,如果要操作这个Bean,所有人都操作这一份Bean.

也就是当一个人将这个Bean被修改了,其他人读取到的就是被修改之后的值.

Spring框架默认Bean作用域是什么呢 ?

我们来实战演练一把,通过这个示例就可以知道Spring默认Bean 作用域是什么了.

有一个Bean为commonBean,假设张三来写一个类来初始化这个Bean然后将Bean存储到Spring中,李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改,王五要使用这个公共的Bean.

commonBean

public class CommonBean {
    //创建一个公共的对象供给两个人去使用
    private String name;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "CommonBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}

张三来写一个类来初始化这个Bean然后将Bean存储到Spring中

@Controller
public class CommonScope {
    //公共的类->供给其他人使用
    //使用Bean注解将公共类返回的公共Bean存到Spring中
    @Bean
    public CommonBean doCommonBean(){
        CommonBean commonBean = new CommonBean();
        commonBean.setName("Java");
        commonBean.setAge(19);
        commonBean.setId(2000);
        return commonBean;
    }
}

李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改

@Controller
public class ScopeController1 {
    @Autowired
    private CommonBean commonBean;

    public void doScopeController1() {
        //李四自己创建一个对象引用公共的Bean
        CommonBean commonBean1 = commonBean;
        System.out.println("修改前的数据" + commonBean);
        commonBean1.setName("C++");
        System.out.println("修改后的数据" + commonBean1);
    }
}

王五要使用这个公共的Bean.

@Controller
public class ScopeController2 {

    @Autowired
    private CommonBean commonBean;

    public void doScopeController2(){
        System.out.println("使用公共的Bean信息为 : " + commonBean);
    }
}

启动类进行使用

public class App {
    //启动类
    public static void main(String[] args) {
        //获取到SpringContext上下文对象
        ApplicationContext context1 = new ClassPathXmlApplicationContext
                ("spring-config.xml");
        System.out.println("=================================");
        ScopeController1 scopeController1 = context1.getBean("scopeController1", ScopeController1.class);
        scopeController1.doScopeController1();
        System.out.println("=================================");
        ScopeController2 scopeController2 = context1.getBean("scopeController2", ScopeController2.class);
        scopeController2.doScopeController2();
    }
}

这个时候就会有情况发生我们接下来看运行结果

所以从这里就可以知道Spring框架默认Bean的作用域就是单例作用域.

Spring Bean的作用域都有哪些呢 ?

Spring一共有6种作用域.Spring在为Bean初始化的时候就会设置作用域.

分别为下面6种作用域

  • 单例作用域(singleton)

单例作用域是Spring默认的作用域.

单例作用域下 : Bean在SpringIOC容器只存在一个实例,也就是获取Bean(context.getBean())和注入/装配Bean(比如AutoWired注入3)操作Bean的都是同一个Bean

适用场景 : 单例作用域一般适用于无状态的Bean(Bean的状态不需要更新).

  • 多例作用域(prototype)

多例作用域也叫原型作用域

对于一个Bean,每次访问这个Bean都会创建新的实例.

也就是在Spring中获取Bean(context.getBean())或者注入Bean(AutoWired注入Bean)操作的这个Bean都是新创建的Bean

适用场景 : 多例作用域一般适用于有状态的Bean(Bean的状态需要更新).

  • 请求作用域(request)

在请求作用域下,每次HTTP请求都会创建新的Bean实例.

这个与prototype类似 但是不相同 prototype是每次访问Bean就创建,而request是每次HTTP请求创建新的实例(每次HTTP请求也可能访问多个Bean)

适用场景 : 请求作用域在Spring MVC场景下才能够生效 适用于一次HTTP请求共享Bean

  • 会话作用域(session)

在会话作用域下,每次session会话都会创建一个新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于在一次会话共享Bean

  • 全局作用域(Application)

在一个Http Servlet Context 中创建一个实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于Web应用的上下文信息

  • WebSocket(了解即可)

在一个HTTP WebSocket的生命周期中,创建新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean

在Bean初始化的时候,就会为Bean设置其作用域.

Spring共有6种作用域

其中单例作用域和多例作用域在Spring框架中使用

请求作用域,会话作用域,全局作用域,WebSocket 只有在SpringMVC框架中才会生效.

如何设置Bean作用域

有两种方式设置Bean的作用域

第一种是直接设置值

比如我们来设置多例作用域

第二种是通过枚举的方式

比如我们来设置多例作用域

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:SpringBean作用域-创新互联
URL标题:http://cdxtjz.cn/article/ddjogc.html

其他资讯