1.之前学过的变量的作用域:是指变量在方法中或者作用域中的某种行为,现在我们来进行了解一下Bean的作用域

咱们的Java中的公共类称之为Bean或者是JavaBean,Spring对象中的生命周期指的是交给SpringIOC容器的对象,所以说咱们的Spring Bean对象在进行使用的时候,无需通过new来进行创建对象,只需要通过依赖注入,从Spring要取出适用的对象即可

Bean的作用域在Spring容器里面默认是单例模式,是为了节省资源,并且没有过多的生命周期的创建和销毁,如果说每一次注入都创建一个新的User对象,系统的开销就会更大的

1)什么是作用域:限定程序中变量的可用范围就叫做作用域,或者在源代码中定义变量的某个区域就叫做作用域,有几种类型;

2 )但是Bean的作用域是指Bean在整个Spring框架容器里面的某种行为模式(重要), 是Bean的类型有哪些 ,比如说singLeton单例作用域,就表示Bean在整个Spring框架里面只有一份,他是全局共享的,那么当其他人修改了这个值之后,那么另一个人读到的就是被修改的值

3)Spring容器在进行初始化一个Bean的实例的时候,同时会指定该实例的作用域,Spring有六种作用域,最后四种是针对SpringMVC生效的

因为单例模式只被初始化一次,初始化一次之后我们可以反复的进行使用,所以使用的性能比较高,所有人都是用的一个对象;

1.Bean的6种作用域:注意后四种是SpringMVC里面的作用范围,是基于SpringMVC来进行生效的,但是普通的Spring项目(非web项目,普通的JAVA项目,SpringCore)只有前两种;也就说明Bean在Spring里面一共有六种类型;

web项目:通过浏览器或者postman的方式来进行访问一个地址的方式来进行发送Http请求,与咱们的在idea中的Spring代码进行交互,是具有上面的5种值;

1.singleton:单例模式

描述:该作用域下的Bean在IOC容器中只存在一个实例:

当我们进行获取Bean(即通过applicationContext.getBean等方法获取以及装配Bean(即通过Autowired注入)这都是一个对象;

场景:通常无状态的Bean的使用该作用域,无状态表示Bean对象的属性不需要进行更新,不会修改Bean,通常我们的Spring默认选择该作用域;

缺点:一个改变了,其他的就都改变了;

2.prototype:原型模式-----多例模式

描述:每次对于该作用域(每一次注入)下面的每一次Bean的请求都会创建新的实例:

1)当我们进行获取Bean的时候(即通过applicationContext.getBean()方法来进行获取Bean对象的时候)或者装配Bean(即通过Autowired或者@Resource来进行注入)都会创建出新的对象实例,针对有状态的Bean作用该作用域

2)这几种方法获取的都是新的对象实例,每一个类中引入的对象都是自己的;

场景:通常有状态的Bean使用该作用域

3.Request

描述:针对每一次HTTP请求都会创建新的Bean实例,就类似于prototype,不管是一次会话还是两次会话,每进行访问一次,都会重新给一个新的对象,就是一次HTTP请求和响应的共享Bean

场景:一次http请求和响应的共享Bean

备注:只限于SpringMVC中使用,在咱们的普通项目是不能进行使用的

4.session

描述:在一个HttpSession中,定义一个Bean实例,一个会话共享一个Bean

场景:用户会话的共享Bean,比如说记录一个用户的登录信息,是针对一个人来进行操作的,只要是这个人操作的,就会对应到这个实例,比如说张三进行登录了,那么在张三进行登录的过程中,使用的都是同一个对象;

备注:只是限于SpringMVC中进行使用

5.application

描述:在一个http servlet context中对应一个Bean实例

场景:Application 的作用范围在服务器一开始执行服务,到服务器关闭为止。 Application 相比于Session、request和page的范围最大、停留的时间也最久。

存入application的信息在Web应用程序运行期间,所有的页面都可以访问这个信息。

备注:只限于SpringMVC进行使用

singletion是作用于整个Spring(IOC容器)容器当中,application是在一个Servlet容器当中(处理WEB请求)

6.WebSocket------网页聊天

描述:在一个Http WebSocket的生命周期中,定义一个Bean实例

场景:WebSocket的每一次对话

备注:限定在Spring WebSocket中使用,WebSocket的每一次对话里面,保存了一个Map结构的头信息,将用来包裹对象头,第一次初始化之后,直到这一次WebSocket结束之后用到的都是同一个Bean;

单例作用域和全局作用域

singletion是Spring Core的作用域,application是Spring Web的作用域(只有在Servlet里面,在SpringMVC里面才有效果的)

singletion是作用域IOC的容器,而application是作用于Servlet的容器

我们如何进行设置Bean的作用域呢?保证多例的作用域

1)直接使用@Scope他是可以即应用于类注解上面,又能应用于方法注解上面

2)Scope翻译成中文是作用域的意思,虽然说@Scope是可以进行应用到类注解和方法注解,但是如果应用到类注解,就说明进行设置当前这个类所生效;

3)我们一定要注意,我们如果想要方法的返回值是单例的或者是多例的,我们就可以经这个注解修饰方法,如果我们要使用的是@Bean注解·+@Scope,@Scope一定要放在方法上进行注解,不能放在类上;

4)我们可以直接设置作用域的具体的值通过@Scope("propotype")

5)我们还可以根据ConfigurableBeanFactory和WebApplicationContext提供的Scope_XXX变量来进行设置,我们可以把这个变量放在@Scope里面

@Component
public class GetBean {@Bean(name ="u1")//将当前User对象存储到Spring里面@Scope("prototype")public User GetUser1(){User user=new User();user.setId(1);user.setName("李佳伟");return user;}

2.Bean的大的执行流程-----重要----Spring生命周期

1)启动Spring容器-----执行main方法(执行带有ApplicationContext的main方法,并指定了配置文件)

2)加载Spring配置文件(配置一个组件的扫描路径,通常在resource,web.xml里面或者是使用<Beans>标签)

3)将Bean对象注册到Spring容器里面:加载配置文件中的bean或者根据配置文件中的bean组件的根扫描路径,进行对Bean对象的扫描(会进行扫描五大类注解,那么就会把这五大注解修饰过的类或者是当前加了五大注解的类里面加了@Bean注解的方法返回的类存储到Spring容器里面)

出现了属性注入:(如果说我们在A类里面注入了B类,那么先会把B类给注入到Spring容器里面,在进行A类注册到Spring里面)-------先去装配Bean的属性,再去装配Bean

4)将加载的对象存入到Spring容器里面,进行加载

5)其他需要使用Bean对象的地方就可以直接进行获取并使用了

6)执行完之后所有业务之后,执行销毁操作

Bean的执行流程(Spring的执行流程)-----启动Spring容器-----实例化Bean(分配内存空间,从无到有)-----将Bean进行注册到Spring里面(存储操作)-----我们最后再将Bean装配到需要的类中,取操作;

Bean的生命周期-----重要:是指Bean在整个IOC容器中从创建到销毁的整个过程

所谓的Bean的生命周期是指Bean在整个Spring容器里面,也就是在IOC容器里面从创建到销毁的整个过程

因为SpringBoot是基于Spring来进行创建的,所以Bean在整个Spring和SpringBoot的行为都是一样的

1)实例化Bean,为Bean对象整体分配内存空间-----把二进制的字节码转化成一个类对象

2)进行设置它的属性(进行Bean的注入和装配)

我们一定是要先进行加载属性的,如果先进行初始化方法,很有可能就会在方法里面用到这个类属性(如果这个属性被@Resource或者Autowired所修饰,那么我们就需要对使用的Bean进行初始化注入),一个类是有属性和方法的

3)(Bean初始化,一系列准备工作的统称),执行各种通知方法,比如说在飞机上进行检查工作,检查按钮;

3.1)实现了各种Aware通知的方法,创建一个类,实现了BeanNameAware,BeanFactoryAware,还有ApplicationContext接口的方法

3.2)执行实现BeanPostProcessor接口初始化前置方法

3.3)执行带注解的@PostConstruct修饰的初始化方法,依赖注入操作之后执行

3.4)执行自己所指定的init-method方法,如果有指定的话(最早使用XML的方式,在没有注解之前)---也是初始化方法

3.5)执行实现了BeanPostProcess接口初始化后置方法

4)使用Bean

5)进行销毁Bean

5.1首先会执行@PreDestory这是销毁前置方法,比如说像记录一下时间,日志

5.2如果说实现了DisposableBean接口方法

5.3destory-method:销毁前的执行方法,在XML里面进行设置

初始化前置方法和初始化后置方法是给所有Bean进行服务的,这些方法不能写在某一个Bean中,否则不会执行

如果有的话,就执行(前提是你得重写了前置方法他才会执行)

下面我们写了一些代码来进行演示:

@Controller
public class BeanStart implements BeanNameAware {@Overridepublic void setBeanName(String s) {System.out.println("执行通知方法"+s);}@PostConstruct//出生于注解时代public void start(){System.out.println("执行被注解@PostConstruct修饰的方法");}public void init()//直接这么写,是无法进行执行的,我们必须要在XML里面进行相应的配置,这里面的方法名字是可以随便取的,只要和XML里面的名字相匹配就可以了{System.out.println("执行init方法");}public void destory(){System.out.println("执行destory方法");}@PreDestroypublic void predestory(){System.out.println("执行被注解修饰的");}
}
class HelloServlet{public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("web.xml");UserController userController=context.getBean("beanStart",BeanStart.class);userController.destory();}
}
web.xml配置文件:
<beans><bean id="userController" class="APP.Controller.UserController" init-method="init(方法名)" destroy-method="destory"></bean>
</beans>
打印结果:执行通知方法userController
执行被注解@PostConstruct修饰的方法
执行通知方法userinit
执行被注解@PostConstruct修饰的方法
执行init方法
执行destory方法

可不可以先执行初始化方法,在进行设置属性?

假设现在@Controller里面进行属性注入了UserService,先进行初始化操作,就会出现空指针异常,所以要先进行属性注入,在进行初始化

咱们的初始化前置方法和后置方法是为所有的Bean来进行服务的,而不是给某一个Bean来进行服务的,这一系列的方法不可以写在某一个具体的Bean里面,否则不会执行

Bean的作用域和生命周期-----Spring相关推荐

  1. Spring【Bean的作用域与生命周期】

    Spring[Bean的作用域与生命周期]

  2. session作用域_看完这篇Bean的作用域与生命周期,问到面试官不敢问-乐字节java...

    Bean的作用域与生命周期 Bean的作用域 默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean的作用域类型如下: singleton 作用域 注意: lazy-init是懒加载, ...

  3. 学习Spring(六) -- Spring中Bean的作用域以及生命周期

    2019独角兽企业重金招聘Python工程师标准>>> Bean的作用域 默认情况下,bean的作用域为单例模式(singleton): 在applicationContext创建时 ...

  4. Spring Bean的作用域及生命周期

    Bean的作用域 在bean声明时它有一个scope属性,它是用于描述bean的作用域. 可取值有: singleton:单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope ...

  5. spring bean的作用域和生命周期

    一.spring bean的作用域 五种作用域:singleton.prototype.request.session.globalSession request.session和global ses ...

  6. Spring从入门到入土——Bean的作用域与生命周期

    Bean的作用域 ​ 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean.简单地讲,bean就是由IoC容器初始化.装配及管理的对象 类别 说明 sin ...

  7. bean的作用域和生命周期

    一.Bean作用域 二.生命周期 其中,这个类实现各种接口重写各种方法,会按bean的声明周期按序执行: 其中,自定义的初始化和自定义销毁的方法不是实现接口重写,而是成员方法,并且在装配bean即在x ...

  8. Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

    说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...

  9. Spring框架学习day_02:组件扫描 / 注解内部读解 / 组件扫描中配置作用域和生命周期 / 解耦 / 自动装配(两种方式) / 读取文件

    1. 组件扫描 首先,必须让Spring扫描组件所在的包,并且,组件类的声明之前必须添加@Component注解! 其实,除了@Component注解以外,还可以使用以下注解实现同样的效果: @Con ...

最新文章

  1. java实现多线程断点续传,上传下载 分享
  2. JS组件系列——表格组件神器:bootstrap table
  3. iis mysql5.7_手动配置网站环境 IIS 10+PHP 7.1+MySQL 5.7
  4. 巨坑!这公司的行为,挺适合清明节!
  5. 数据结构(二)——堆
  6. Hadoop无法上传文件查找原因
  7. 页面加载完就执行的设置?
  8. ubunt18 mysql_Ubuntu18.04下安装MySQL教程
  9. 实验:学习GET注入
  10. 一个类的属性调用另一个类的实例
  11. 微信开发MySQL篇(一)
  12. Unity中ComputeShader入门
  13. 3.3 Apache的管理及优化
  14. python编程入门书-最适合Python初学者的6本书籍推荐「必须收藏」
  15. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。
  16. 【C++算法题】求三角形边长
  17. JavaScript实现调查问卷
  18. 国仁网络资讯:微信视频号运营中常遇见的10大问题;新手必知的疑难杂症。【建议收藏】
  19. 数据库优化方法 (一)
  20. Shell脚本撰写指南

热门文章

  1. centos7.4安装
  2. MySQL技术总结第一篇
  3. configure: error: C preprocessor “/lib/cpp“ fails sanity check错误解决办法
  4. 阿里云ACP云计算错题集41-70
  5. 超多趣味测评测试微信小程序源码 可插入流量主广告位
  6. 数据库的增删改查的一个例题
  7. 电脑QQ登录测试用例
  8. 百度网盘搜索引擎神器哪些网站比较好用
  9. 金海佳学C++primer 练习9.15/9.16
  10. 马云用大数据力证女性让世界更美好