java bean作用域,java bean的生命周期

  java bean作用域,java bean的生命周期

  00-1010一、豆二的范围。Spring III的执行过程。豆类的生命周期

  

目录

之前学Java基础的时候,我就有了作用域的概念。一个变量不一定在任何区域都有效,限制这个变量可用性的代码范围就是这个变量的作用域。

 

  但是在这里,Bean的作用域的概念与以前认为的不同。

  Bean的范围是指Spring的整个框架中Bean的某个行为模式。

  接下来会用一个案例来说明什么是作用域,什么是行为模式。

  案例总结:

  创建一个公共Bean,供消费者A和消费者b使用。

  a、当用户使用时,创建一个新的变量来接收注入的Bean,对其进行修改,并返回修改后的结果;

  b .用户直接返回注入的Bean,不需要任何操作。

  代码实现:

  步骤1:创建一个公共Bean。

  @Componentpublic类User component { @ Bean public User getUser(){ User User=new User();user . setid(1);User.setName(张三);user . set password( 111111 );返回用户;}}第二步:用户A获取公共Bean并修改它。

  @ controller public class UserControllerA { @ auto wired private User User;userget user 1(){ system . out . println(用户A获得的原始用户:用户);用户myUser=用户;MyUser.setName(李四);返回myUser}}第三步:用户B直接返回获取的公有Bean。

  @ controller public class UserControllerB { @ auto wired private User User;公共用户get User 2(){ return User;}}步骤4:在main中获取UserControllerA类和UserControllerB类用法视图

  class start { public static void main(string[]args){//Get Spring context application context=newclasspathmlaplicationcontext( Spring . XML );//从Spring容器中获取UserControllerA类(Bean对象)user controller a user controller a=context . getbean( user controller a ,user controller a . class);//使用Bean对象system . out . println( consumer A- usercontrollera . get user 1());//获取Spring容器中的UserControllerA类(Bean对象)UserControllerb UserControllerb=context . getbean( UserControllerb ,UserControllerb . class);//使用Bean对象system . out . println( consumer B- usercontrollerb . get user 2());}}预期结果:

  a .用户修改后,结果被修改;用户b没有被修改,结果应该和原用户一样。

  结果显示:

  与预期结果不同,用户A和用户B获得的结果被修改。

  这是因为在Spring中,Bean默认是单例的,每个人都使用同一个对象,这个对象是全局共享的。当别人修改对象时,另一个人获取的对象被修改,这是Bean的六个作用域之一,3354 singleton。

  在写 WEB 项目的时候,我们知道 DataSource 就是单例模式,使用单例,好处多多,可以确保所有对象都访问唯一实例,而且减少了内存的开支和系统性能的开销,因此 Bean 默认情况下是单例状态。

  若想要按照预期结果输出,就需要将 Bean 的作用域设置成原型作用域,即无论谁来使用 Bean 对象,获取到的都是原始的 Bean 对象,大家各玩各的。

  需要在注入的对象上使用注解修改作用域,有以下两种方法(Scope就是作用域的意思)

  直接将作用域以 String 类型写到()中使用全局参数,类似于枚举

@Componentpublic class UserComponent { //@Scope("prototype") //方法一 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //方法二 @Bean public User getUser() { User user = new User(); user.setId(1); user.setName("张三"); user.setPassWord("111111"); return user; }}

Bean 的 6 种作用域

 

  singleton:单例作用域

  Bean 在 IoC 容器中只存在一个实例当 Bean 对象属性状态无需更新时使用该作用域Spring 支持prototype:原型作⽤域/多例作⽤域

  每次获取该 Bean 时都会创建新的实例,即获取的都是原始的 Bean当 Bean 对象属性状态会更新时使用该作用域Spring 支持request:请求作用域

  每次 HTTP 请求都会创建新的 Bean 实例一次 HTTP 请求和响应共享的 Bean限定 SpringMVCsession:会话作用域

  在一个 HTTP session中,创建一个 Bean 实例用户会话共享一个 Bean限定 SpringMVCapplication:全局作用域

  在一个 HTTP Servlet Context中,创建一个 Bean 实例一个 WEB 上下文中共享一个 Bean限定 SpringMVCwebsocket: HTTP WebSocket 作⽤域(不常用)

  在一个 HTTP WebSocket 中,创建一个 Bean 实例限定 Spring WebSocket单例作用域和全局作用域比较像,但全局作用域范围没有单例作用域大,前者是 Spring 核心的作用域,后者是 Spring Web 中的作用域,前者作用于 IoC 容器,后者作用于 Servlet 容器

  

 

  

二、Spring 的执行流程

Spring 的执行流程也可以说是 Bean的执行流程,主要分成4部分

 

  启动 Spring 容器加载 XML 文件,实例化 Bean(进行内存的分配)Bean 存到 Spring 容器中(五大类注解,方法注解)将存储的 Bean 中的注入的对象属性进行初始化,即进行装配(取出 Bean)

 

  

 

  

三、Bean 的生命周期

Bean 的生命周期即 Bean 从诞生到销毁的整个过程

 

  实例化 Bean 对象,申请内存空间

  设置 Bean 的属性,进行依赖注入和装配

  Bean 的初始化

  各种 Aware 感知:BeanNameAware、BeanFactoryAware、ApplicationContextAware、…执⾏ BeanPostProcessor 初始化前置⽅法初始化方法:构造器方法 @PostConstructor (对象加载完依赖注入后执行)初始化方法:init-method执⾏ BeanPostProcessor 初始化后置⽅法使用 Bean

  销毁 Bean

  销毁方法:@PreDestroy接口方法:DisposableBean销毁方法:destroy-method补充

  实例化和初始化的区别

  实例化:这里的实例化和从前的实例化对象是有区别的,这里的实例化就负责内存的分配,一个从无到有的过程。实例化和属性设置时 Java 级别的系统事件,操作过程是不可人工干预的初始化:是对 Bean 进行填充的过程,程序员可以进行介入,真正的将 Bean 放到 Spring 容器中@PostConstructor 和 @PreDestroy 是注解方式进行初始化和注销,init-method 和 destroy-method 是 XML 方法进行初始化和注销,一般只要使用其中的一种进行初始化

  设置属性一定要在初始化之前,因为初始化也可能需要使用到注入的对象,如果没有进行属性的设置,初始化就会出现问题

  案例:生命周期演示

  

@Componentpublic class BeanLife implements BeanNameAware { @Override public void setBeanName(String s) { System.out.println("BeanName 感知:"+ s); } @PostConstruct public void postConstructor() { System.out.println("执行初始化方法:PostConstructor"); } @PreDestroy public void preDestroy() { System.out.println("执行销毁方法:PreDestroy"); } public void initMethod() { System.out.println("执行初始化方法:init-method"); } public void destroyMethod() { System.out.println("执行销毁方法:destroy-method"); }}

XML

 

  

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置一下:bean注解扫描的根路径(方面后面更简单存储对象到spring容器)--> <content:component-scan base-package="com.bit.beans"></content:component-scan> <beans> <bean id="beanLife" class="com.bit.beans.Component.BeanLife" init-method="initMethod" destroy-method="destroyMethod"></bean> </beans></beans>

调用

 

  

public class Start { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); BeanLife beanLife = context.getBean("beanLife",BeanLife.class); System.out.println("---使用 Bean 对象---"); System.out.println("---注销 Bean 对象--- "); context.destroy();//容器的销毁相当于销毁所有的 Bean }}

结果显示:

 

  

 

  流程图展示:

  

 

  到此这篇关于Java开发学习之Bean的作用域和生命周期详解的文章就介绍到这了,更多相关Bean作用域和生命周期内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: