SpringIOC和Bean
一、什么是IoC?
控制反转是面向对象编程的设计原则,以减少代码之间的耦合。最重要的方法之一是依赖注入(DI),通过控制逆转,当对象被创建时,调节系统中所有对象的外部实体将所有对象的引用传递给它。
二、IOC的原理
。给定一个字符串可以传输一个例子,并使用它set方法注入实例的依赖性;
关于java前面的文章已经学会了如何创建和执行对象。
在springIOC在中间,我们只需要在配置文件中给出一个类名字字符串,对象就会被创建出来。系统启动后,我们只需要直接声明对象,不需要自己使用new。IOC通过反射调用法setText方法完成依赖注入(赋值对象属性)。
BeanFactory
-
定义:
BeanFactory定义了IOC提供最基本的容器形式IOC容器应遵守的最基本的接口是SpringIOC最底层和最基本的编程规范。spring中,BeanFactory只是一个接口,并不是IOC具体实现容器,如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是对BeanFactory该接口附加了某种功能的实现。
-
界面定义的方法
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-iIiE7Qy7-1653380658875)(C:\Users\Leejie\Desktop\leejie\笔记\image\1653294080502.png)]
-
BeanFactory作用
在spring中间,所有对象bean所有生产beanFactory实例化,beanFactory可以实例化bean的过程中对bean做一些额外的处理。beanFactory会在bean的各阶段中对bean并进行各种管理spring通过各种接口将这些阶段暴露给我们,让我们对bean做各种处理,我们只需要让bean实现相应的接口,然后spring就会在bean生命周期调用我们实现的理生命周期bean。
关于BeanFactory生成bean看看这篇文章的过程:https://blog.csdn.net/qq_36688143/article/details/84968036
ApplicationContext
应用上下文,继承BeanFactory接口,它是Spring更先进的容器提供了更多的功能。
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-P84MD1v9-1653380658876)(C:\Users\Leejie\Desktop\leejie\笔记\image\0524ApplicationContext.png)]
ApplicationContext继承了和在此基础上,界面也通过其他界面扩展BeanFactory的功能。
:允许容器具有发布和应用上下文事件的功能,包括启动和关闭容器事件。
:为应用提供i18N国际新闻访问功能。
:通过带前缀的资源加载资源Ant资源文件路径装载风格Spring配置文件。
ApplicationContext两大实现类:
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
通过这两个实现类可以读取配置bean的xml并获得文件bean对象。
装载bean的区别:
BeanFactory在初始化容器中,没有实例化Bean,直到第一次访问某个Bean实例化目标的时间Bean。 ApplicationContext所有单实例将在初始化应用上下文中实例化Bean,还可以为Bean配置lazy-init=true来让Bean延迟实例化。
Bean生命周期
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-b5ZWYQ5U-1653380658876)(C:\Users\Leejie\Desktop\leejie\笔记\image\bean生命周期.jpg)]
- 实例化bean对象(通过结构或工厂)
- 设置对象属性(setter等)(依赖注入)
- 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
- 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂本身
- 将Bean实例传递给Bean前置处理器postProcessBeforeInitialization(Object bean, String beanname)方法
- 调用Bean初始化方法
- 将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
- 使用Bean
- 调用前关闭容器Bean的销毁方法
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-NtPGSRBT-1653380658877)(C:\Users\Leejie\Desktop\leejie\笔记\image\bean.png)]
Bean作用域
Spring中的bean默认是单例,对Web应用来说,Web为每个用户的请求创建一个单独的容器Servlet引入线程处理请求Spring每个框架后面Action都是单例,所以对spring托管的单例Service bean,Spring的单例是基于BeanFactory的,单例bean在spring只有一个容器,Java以单例为基础JVM,每个JVM里面只有一个例子。
类别 | 说明 |
---|---|
singleton | 在spring IOC容器中只有一个bean实例,bean以单例的形式存在,默认值 |
prototype | 每次从容器中调用bean回到一个新的例子。 |
request | 每次HTTP所有的请求都会创造新的bean,该功能域只适用于WebApplicationContext环境 |
session | 同一个HTTP Session 共享一个bean,不同Session使用不同bean,仅适用于WebApplicationContext环境 |
globalSession | 一般用于Protlet该功能域仅适用于应用环境WebApplicationContext环境 |
- 当一个bean的作用域为singleton,那么Spring IOC容器只有一个共享bean例子,而且都是对的bean请求,只要id与该bean定义匹配只会返回bean同样的例子。
- 当一个bean的作用域为Prototype,表示一个bean对应多个对象实例的定义。Prototype作用域的bean每次都会导致这个bean请求(注入另一个请求)bean以程序的形式调用容器getBean()方法)创建新的bean实例。Prototype它是一种原型,当我们创建容器时,它不是实例化的,而是当我们获得它时bean只有创建一个对象,我们每次得到的对象都不是同一个对象。
<bean id
=
"life_singleton
"
class="com.bean.LifeBean" scope="singleton" init-method="init" destroy-method="destory" lazy-init="true"/>