javaEE | Bean作用域和生命周期

目录

Bean的作用域定义:

举例singleton

Bean的六种作用域

singleton

prototype

request

session

application

websocket

单例作⽤域(singleton)和全局作⽤域(application)区别

如何设置Bean的作用域

Spring Bean的执行流程

Bean生命周期


Bean的作用域定义:

限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。 ⽽ Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式,⽐如 singleton 单例作⽤域,就表 示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个 ⼈读取到的就是被修改的值。

举例singleton

@Controller
public class UserController8 {

    @Resource
    private User u1;

    public User getUser(){
        User user = u1;
        user.setName("三张");
        return user;
    }
}

@Controller
public class UserController9 {
    @Resource
    private User u1;

    public User getUser(){
        User user = u1;
        return user;
    }
}
public class App {
    public static void main(String[] args) {
//        1.先获取Spring的上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserController8 controller8 = context.getBean("userController8", UserController8.class);
        User user1 = controller8.getUser();
        System.out.println(user1);

        UserController9 controller9 = context.getBean("userController9", UserController9.class);
        User user2 = controller9.getUser();
        System.out.println(user2);
    }
}

javaEE | Bean作用域和生命周期_第1张图片

因为singleton是单例作用域,在Spring中只有一份,是全局共享的 ,所以当其他人改变了这个值,之后的所有人读到这个值时,都是被改后的。

Bean的六种作用域

Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域。Spring有 6 种作⽤域, 最后四种是基于 Spring MVC ⽣效的:

  1. singleton:单例作⽤域
  2. prototype:原型作⽤域(多例作⽤域)
  3. request:请求作⽤域
  4. session:回话作⽤域
  5. application:全局作⽤域
  6. websocket:HTTP WebSocket 作⽤域

singleton

  • 描述:该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过 applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀ 个对象。
  • 场景:通常⽆状态的Bean使⽤该作⽤域。⽆状态表示Bean对象的属性状态不需要更新
  • 备注:Spring默认选择该作⽤域

prototype

  • 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
  • 场景:通常有状态的Bean使⽤该作⽤域

request

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

session

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

application

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

websocket

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

单例作⽤域(singleton)和全局作⽤域(application)区别

  • singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域;
  • singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。

如何设置Bean的作用域

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Scope("prototype")

Spring Bean的执行流程

  1. 启动Spring容器
  2. 加载Spring配置文件
  3. 扫描配置文件,加载配置文件中的或者根据配置文件中的组件(Bean)的根路径,进行对Bean对象的扫描,将添加五大注解的类直接加载.
  4. 加载的对象存储进Spring.
  5. 其他需要使用Bean对象的时候就可以直接获取并使用。
  6. 执行完成之后,执行销毁操作。

Bean生命周期

所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命 周期。

Bean 的⽣命周期分为以下 5 ⼤部分:

  1. 实例化 Bean(为 Bean 分配内存空间)
  2. 设置属性(Bean 注⼊和装配)
  3. Bean 初始化 实现了各种 Aware 通知的⽅法,如 BeanNameAware、BeanFactoryAware、 ApplicationContextAware 的接⼝⽅法; 执⾏ BeanPostProcessor 初始化前置⽅法; 执⾏ @PostConstruct 初始化⽅法,依赖注⼊操作之后被执⾏; 执⾏⾃⼰指定的 init-method ⽅法(如果有指定的话); 执⾏ BeanPostProcessor 初始化后置⽅法。
  4. 使⽤ Bean
  5. 销毁 Bean 销毁容器的各种⽅法,如 @PreDestroy、DisposableBean 接⼝⽅法、destroy-method。 

你可能感兴趣的:(java-ee,java,spring)