首页 > 其他分享 >Spring中Bean的六大行为模式

Spring中Bean的六大行为模式

时间:2023-10-06 10:34:42浏览次数:25  
标签:六大 作用域 Spring Bean User import public

一、singleton:单例模式(默认)

singleton是Bean在Spring中默认的行为,这个默认的行为模式就是说一个类只有一个Bean对象,所有的用户都使用的同一个对象,如果有一个用户对这个对象进行了修改,那么所有的结果都会发生改变。

  • 如:这样一个User类:
package com.demo.spring.beans;
 
public class User {
    private int Id;
    private String name;
 
    public int getId() {
        return Id;
    }
 
    public void setId(int id) {
        Id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 我们先使用@Bean注解给Spring中注入一个User对象 
package com.demo.spring.beans.Controller.Bean;
 
import com.demo.spring.beans.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
 
@Controller
public class UserBean {
    
    @Bean(name = "user")
    //使用getUser方法返回Bean对象
    public User getUser(){
        User user=new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}
  • 然后使用@Autowired从Spring中获取到该Bean对象并进行修改:
package com.demo.spring.beans.Controller;
 
import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
 
@Controller
public class UserController {
    private User user1;
    @Autowired
    public User getUser1(){
        User user=user1;
        user.setId(1);
        user.setName("李四");
        return user;
    }
 
}
  • 然后再使用@Autowired直接从Spring中获取Bean对象:
package com.demo.spring.beans.Controller;
 
import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
 
@Controller
public class UserController2 {
    @Autowired
    private User user3;
    public User getUser3() {
        return user3;
    }
}
  • 然后我们在App启动类中分别获取一下UserController和UserController2的Bean对象:
import com.demo.spring.beans.Controller.UserController;
import com.demo.spring.beans.Controller.UserController2;
import com.demo.spring.beans.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class App {
    public static void main(String[] args) {
        ApplicationContext context=new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController=  context.getBean("userController", UserController.class);
        User user=userController.getUser1();
        System.out.println("修改后的bean:"+ user);
        UserController2 userController2=context.getBean("userController2",UserController2.class);
        User user1=userController2.getUser3();
        System.out.println("最后获取的bean:"+user1);
    }
}

二、prototype: 原型模式(多例模式)

  • 在Spring框架中,bean的作用域决定了其创建和销毁的方式。其中之一就是prototype作用域,它可以类比于原型模式(Prototype Pattern),也被称为多例模式。
  • 在Spring中,当bean的作用域设置为prototype时,容器在每次请求获取bean的时候都会创建一个新的实例,并且对于该实例的管理(包括初始化和销毁)由应用程序负责。换句话说,每次从容器中获取prototype作用域的bean时,都会创建一个新的对象。
  • 原型模式需要在注入Bean的时候就进行指定,需要在@Bean注解下或者五大类注解的下面指定注解:@Scope,并且在注解中指定一个值为prototype。这样其他地方获取Bean的时候,就不是同一个了,而是一个新的Bean实例。(通常有状态的Bean使用该作用域) 

三、request: 请求作用域(Spring MVC)

  • 每次http请求会创建新的Bean实例,类似于prototype
  • 场景:⼀次http的请求和响应的共享Bean
  • 备注:限定SpringMVC中使⽤

四、session: 会话作用域(Spring MVC)

  • 在⼀个http session中,定义⼀个Bean实例
  • 场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
  • 备注:限定SpringMVC中使⽤

五、application: 全局作用域(Spring MVC)

  • 在⼀个http servlet Context中,定义⼀个Bean实例(这个Bean也是单例的)
  • 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
  • 备注:限定SpringMVC中使⽤

六、websocket: HTTP WebSocket 作用域(Spring WebSocket)

  • 在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bea实例
  • 场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直WebSocket结束都是同⼀个Bean。
  • 备注:限定Spring WebSocket中使⽤

applicationContext和singleton的区别 

1、作用域不一样:singleton是Spring Core的作用域,而application是Spring Web中的作用域。

2、作用的容器不一样:singleton是作用于Spring IOC的容器,而application是作用于Servlet的容器。

标签:六大,作用域,Spring,Bean,User,import,public
From: https://www.cnblogs.com/visioning/p/17744303.html

相关文章

  • Spring Mvc框架环境搭建
    1.创建动态WEB项目本次在IDEA2021.2.1版本中创建SpringMV 出现webapp文件夹则说明文件创建好啦!2.配置TomCat配置完之后,让我们来运行一下! 配置成功了!!!配置Spring前端控制器<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="<http://maven.apache.org/......
  • 认识Spring MVC
    认识SpringMV   工作流程图解析 前端控制器前端控制器是SpringMVC的核心,负责接受Http请求并协调各个组件请求工作。<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN""<http://java.sun.com/dtd/web-app_2_3.dtd>"><web-......
  • 基于Java+SpringBoot+Vue的微信小程序实现民族节日及民间故事推广系统
    一、前言......
  • 分布式事务 —— SpringCloud Alibaba Seata
    Seata简介传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚。随着公司的快速发展、业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的微服务,分别使用独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部......
  • beans头
    MVC全部导入的xml头<!--导入p,c命名空间context注解--><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p&qu......
  • Spring初见
    Spring初见Spring简介Spring是分层的JavaEE轻量级开源框架,以控制反转(IOC)和面向前面编程(AOP)为内核,提供表现层:SpringMVC持久层SpringJDBC的技术。Spring的使命就是简化开发!!Spring特点方便解耦,简化开发:IOC容器可将对象之间的依赖关系交给Spring控制AOP编程的支持:可使用面向......
  • 【SpringBoot】多环境配置和启动
    环境分类,可以分为本地环境、测试环境、生产环境等,通过对不同环境配置内容,来实现对不同环境做不同的事情。SpringBoot项目,通过application-xxx.yml添加不同的后缀来区分配置文件,启动时候通过后缀启动即可。application.yml:公共配置application-xxx.yml:不同环境的差异配......
  • Spring
    Spring是一个开源的Java框架,用于开发企业级应用程序。它提供了一种轻量级的、非侵入式的方式来构建Java应用,以及处理各种应用程序开发中的常见问题。Spring框架具有以下特点和功能:依赖注入(DependencyInjection):Spring通过依赖注入来管理对象之间的依赖关系,减少了代码的耦合度。......
  • SpringMVC
    1、SpringMVC的工作原理?(1)用户向服务器发送请求,请求被springMVC前端控制器捕获;(2)前端控制器对请求URL进行解析,得到请求资源标识符(URL)然后根据该URL调用页面处理器获得该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChai......
  • Spring的Bean生命周期
     1.实例Bean:容器寻找Bean的定义信息并将其实例化,通过doCreateBean()方法实现。protectedObjectdoCreateBean(finalStringbeanName,finalRootBeanDefinitionmbd,final@NullableObject[]args) 2.Bean属性注入:使用依赖注入,Spring按照Bean定义信息配置Bean所有......