3-Spring核心概念
1、SpringIOC容器:
相关概念:
Spring 容器是 Spring 框架的核心
容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁
IOC 容器具有依赖注入功能的容器,它可以创建对象,这些对象被称为 Spring Beans,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
[通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做]
SpringIOC容器的两个代表:
关于BeanFactory:老版本的工厂,当程序调用getBean的时候,才会生成类的实例
关于ApplicationContext:
1)、相关概念:
ApplicationContext:新版本的工厂,当程序加载配置文件的时候,就会将Spring管理的类都实例化
ApplicationContext是BeanFactory的子接口,也被称为Spring上下文
ApplicationContext容器包括 BeanFactory 容器的所有功能,一般情况下,相对于 BeanFactory,ApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序
2)、ApplicationContext下的两个实现类:
FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可(IDEA不用配置),因为,容器会从 CLASSPATH 中搜索 bean 配置文件
2、SpringBean
相关概念:
bean 是一个被实例化,组装,并通过 Spring IOC容器所管理的对象
Spring容器根据与bean相关的配置信息(元数据)创建bean对象
SpringIOC容器与SpringBean之间的关系:
从上图可看到与Bean配置信息有关的三种方式
Bean的作用域:
当在 Spring 中定义一个 bean 时,你应该声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton(默认)
Spring 框架支持以下五个作用域,分别为singleton、prototype、request、session和global session,5种作用域说明如下所示,注意,如果使用 web-aware ApplicationContext 时,其中三个是可用的
注:
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型(多例)类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
当类A依赖类B时,取出A/B的情况:
Bean的生命周期:
生命周期只谈其初始化和销毁方法的配置
1、在Spring核心配置文件bean标签上进行配置:
init-method:bean被初始化后立即执行的方法
destroy-method:bean被销毁前立即执行的方法
2、让类实现两个接口:InitializingBean,DisposableBean,重写其中的两个方法:afterPropertiesSet()和destroy()
3、使用注解方式(待)
补:全局默认配置:在beans开始标签中添加:default-init-method=“” 和 default-destroy-method=“”
Bean的懒加载:
应用于作用域为单例模式的bean
1、在Spring核心配置文件bean标签上进行配置:lazy-init="true"
2、全局默认配置:default-lazy-init="true"
优点:节省资源空间
缺点:可能会导致某些操作响应时间增加