免费网站优化怎么做,新上市手机,宣传片拍摄流程文案,坡头网站建设公司目录 Spring原理一. 知识回顾1.1 回顾Spring IOC1.2 回顾Spring DI1.3 回顾如何获取对象 二. Bean的作用域三. Bean的生命周期 Spring原理
一. 知识回顾
在之前IOC/DI的学习中我们也用到了Bean对象#xff0c;现在先来回顾一下IOC/DI的知识吧#xff01; 首先Spring IOC现在先来回顾一下IOC/DI的知识吧 首先Spring IOC也叫控制反转简单来说就是依赖添加5大注解把该对象交给Spring来管理Spring会把该对象放入IOC容器中在接下来的调用中直接注入即可注入也就是Spring DI操作了。 回顾一下一共有以下五大注解
1.1 回顾Spring IOC
类注解
Controller控制层注解Service逻辑层注解Repository数据层注解Component总注解Configuration(插件注解)
然后就是有一点要注意的就是Component注解可以说是其他四个注解的父注解就是其他注解底层都是依赖Component来实现的都可以使用Component注解来代替使用但是不能代替Controller,因为别忘了Controller注解还有返回视图的作用这是Component注解所不具备的
方法注解
Bean方法注解
该注解用于把方法交给Spring进行管理但是必须和类注解连用
1.2 回顾Spring DI
Spring DI就是把IOC容器里的东西拿出来进行使用主要是Autowired注解主要有三种注入方式
属性注入(就是通过给成员变量进行注入)构造注入(就是通过构造方法注入)Set方法注入
其实在实际运用中,使用属性注入基本上能满足90%的需求了.
Spring DI主要面试考的主要是拥有多个相同对象,注入时该如何保证?
主要提供了以下三大注解
Primary默认注入的方法Qualifier加入要注入对象的方法名称Resource要注入对象的名称
Autowird与Resource的区别
Autowired是spring框架提供的注解⽽Resource是JDK提供的注解Autowired默认是按照类型注⼊⽽Resource是按照名称注⼊.相⽐于Autowired来说Resource⽀持更多的参数设置例如name设置根据名称获取Bean。
1.3 回顾如何获取对象
Spring主要提供了两种方法获取Bean对象
ApplicationContext上下文Autowired
第二种是注入方式就不一一叙述了主要是ApplicationContext获取Bean对象其实就是调用了分类BeanFactory工厂来获取对象。 两者主要有以下两点区别 继承关系和功能方⾯来说Spring容器有两个顶级的接口BeanFactory和 ApplicationContext。其中BeanFactory提供了基础的访问容器的能⼒⽽ ApplicationContext属于BeanFactory的⼦类它除了继承了BeanFactory的所有功能之外 它还拥有独特的特性还添加了对国际化⽀持、资源访问⽀持、以及事件传播等方⾯的⽀持. 从性能方⾯来说ApplicationContext是⼀次性加载并初始化所有的Bean对象也就是饿加载⽽ BeanFactory是需要那个才去加载那个也就是懒加载因此更加轻量.(空间换时间)
好了回顾完了Spring IOC/DI的知识点了就该进入正题了。
二. Bean的作用域
Bean的作用域是指Bean在Spring框架中的某种行为模式.
主要有以下6种作用域
singleton单例作用域prototype原型作用域多例作用域request请求作用域session会话作用域Application:全局作用域websocketHTTPWebSocket作用域
作用域说明singleton每个SpringIoC容器内同名称的bean只有⼀个实例(单例)(默认)prototype每次使用该bean时会创建新的实例(⾮单例)request每个HTTP请求生命周期内,创建新的实例(web环境中)session每个HTTPSession生命周期内,创建新的实例(web环境中)application每个ServletContext生命周期内,创建新的实例(web环境中)websocket每个WebSocket生命周期内,创建新的实例(web环境中)
单例作用域:多次访问,得到的都是同⼀个对象,并且 Autowired 和 applicationContext.getBean() 也是同⼀个对象.
多例作用域:观察ContextDog,每次获取的对象都不⼀样(注⼊的对象在Spring容器启动时,就已经注⼊了,所以多次请求也不会发生变化)
请求作用域:在⼀次请求中, Autowired 和 applicationContext.getBean() 也是同⼀个对象. 但是每次请求,都会重新创建对象
会话作用域:在⼀个session中,多次请求,获取到的对象都是同⼀个换⼀个浏览器访问,发现会重新创建对象.(另⼀个Session)
Application作用域:在⼀个应用中,多次访问都是同⼀个对象
注意Applicationscope就是对于整个web容器来说,bean的作用域是ServletContext级别的.这个和 singleton有点类似区别在于:Applicationscope是ServletContext的单例,singleton是⼀个 ApplicationContext的单例.在⼀个web容器中ApplicationContext可以有多个
三. Bean的生命周期
生命周期指的是⼀个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做⼀个对象的生命周期. Bean的生命周期分为以下5个部分: 实例化(为Bean分配内存空间) 属性赋值(Bean注⼊和装配,⽐如 AutoWired ) 初始化 执行各种通知,如 BeanNameAware , BeanFactoryAware ,ApplicationContextAware 的接口方法. 使用Bean 销毁Bean 销毁容器的各种方法,如 PreDestroy , DisposableBean 接口方法, destroymethod. 实现的代码如下
Component
public class BeanLifeComponent implements BeanNameAware {private UserComponent userComponent;public BeanLifeComponent() {System.out.println(执行构造函数);}Autowiredpublic void setUserComponent(UserComponent userComponent) {System.out.println(设置属性userComponent);this.userComponent userComponent;}Overridepublic void setBeanName(String s) {System.out.println(执行了 setBeanName 方法 s);}/*** 初始化*/PostConstructpublic void postConstruct() {System.out.println(执行 PostConstruct());}public void use() {System.out.println(执行了use方法);}/*** 销毁前执行方法*/PreDestroypublic void preDestroy() {System.out.println(执行preDestroy());}
}