spring基础知识三大块
一、IOC控制反转几个主要的知识点
(IOC:把我们原先手动new对象的控制权交个了spring容器)
1、spring容器
核心优势:轻量级的IOC容器
一致的事务管理
面向切面编程(AOP)
体系结构:核心容器 =(核心 + Bean + 上下文 + 表达是语言)
类型:
1、spring BeanFactory容器
new XmlBeanFactory(new ClassPathResource(“配置文件名”);
2、spring ApplicationContext容器
new ClassPathXmlApplicationContext(“配置文件名”);
new FileSystemXmlApplicationContext(“配置文件名”);
二、Bean的相关操作
1、定义Bean 的属性
属性 | 描述 |
---|---|
Class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类 |
Name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符 |
Scope(是bean标签的数据,它的作用是用来指定作用域的) | 这个属性指定由特定的 bean 定义创建的对象的作用域 |
Constructor-arg | 它是用来注入依赖关系的 |
Properties | 它是用来注入依赖关系的 |
Autowiring mode | 它是用来注入依赖关系的 |
Lazy-initialization mode | 延迟初始化的 bean 告诉 IOC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例 |
Initialization方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法 |
destruction方法 | 当包含该 bean 的容器被销毁时,使用回调方法 |
2、Bean的作用域
概念:当在Spring中定义一个bean时,你必须声明该bean作用域的选 项,例如,为了强制Spring在每次需要时都产生一个新的bean实例,你应该声明bean的作用域的属性为prototype,同理,如果你想让Spring在每次需要时都 返回同一个bean实例,你应该声明bean的作用域属性为singleton
定义Bean的作用域:
作用域 | 描述 |
---|---|
Singleton | 该作用域将bean的定义的限制在每一个 Spring IOC 容器中的一个单一实例(默认)。(通俗来讲创建一个对象) |
Prototype | 该作用域将单一 bean 的定义限制在任意数量的对象实例。 |
Request | 该作用域将 bean 的定义限制为 HTTP 请求。只在web-aware Spring ApplicationContext 的上下文中有效。 |
Session | 该作用域将 bean 的定义限制为 HTTP 请求。只在web-aware Spring ApplicationContext 的上下文中有效。 |
Global-session | 该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
3、 Bean的生命周期与继承
1.生命周期的概述: init-method初始化 destroy-method销毁
当一个bean被实例化时,他可能需要执行一些初始化使他转换成可用状态,同样, 当bean不在需要,并且从容器中移除时,可能需要做一些清除工作,这样状态转换的过程就是bean的生命周期,生命周期体现的两种方式分别为代码方法实现和XML配置文件实现,由于配置文件实现方式更加灵活,所以我们更多采取配置文件
2.继承的概述:
Bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等。子bean的定义继承父定义的配置数据。子bean定义可以根据需要重写一些值,或者添加其他值。Spring Bean定义的继承与Java类的继承无关,但是继承的概念是一样的,你可以定义一个父bean的定义作为模板和其他子bean就可以从父bean中继承所需的配置,但你使用基于XML的配置元数据时,通过使用父属性,指定父bean作为该属性的值来表明子bean的定义
3.补充说明:
定义一个bean时,如果用abstract=”true”属性的话则表明该bean自身不能实例化,仅仅只是作为一个纯粹的模板bean定义来使用的,充当子定义的父定义使用
三、注入的三种方式
1、set方法注入
2、构造器注入(构造器就是构造方法)
3、注解注入
四、spring事件处理
1、概述:
在我们之前的例子中,我们都是使用ApplicationContext,该容器负责管理bean的生命周期,其实,当容器加载管理的bean是会伴随着一系列的事件发生和处理,例如启动、停止、监听等。
ContextStartedEvent 容器启动
ContextStoppedEvent 容器停止
ApplicationEvent 容器事件
Applicationlistener 容器事件监听
2、Spring内置标准事件:
名字 | 描述 |
---|---|
ContextRefreshedEvent | ApplicationContext被初始化或刷新时,该事件被发布,这也可以在ConfigurableApplicationContext接口中使用,refresh()方法来发生 刷新事件 |
ContextStartedEvent | 当使用ConfigurableApplicationContext接口中start()方法启动ApplicationContext时,该事件发布,你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序 开始事件 |
ContextStoppedEvent | ContextClosedEvent 当使用ConfigurableApplicationContext接口中的close()方法关闭ApplicationContext时,该事件被发布,一个已关闭的上下文到达生命周期末端,它不能被刷新或重启 关闭事件 |
RequestHandledEvent | 这是一个Web-specific事件,告诉所有bean HTTP 请求已经被服务 发送请求 |
3、特别注意:
Spring事件处理单线程的,所以如果一个事件被发布,直至所有的接受者得到该消息,或者该进程被阻塞,否则流程将不会停止。
五、spring自动装配
1、基本介绍:
前面我们已经学习了通过元素来声明bean和xml配置文件中和元素来注入bean,其实spring容器可以在不使用注入和元素的情况下自动装配相互协作的bean之间的关系,这有助于减少编写一个大的基于spring的应用程序的xml配置的数量。
2、自动装配的模式
1、用于指示spring容器为来使用自动装配进行依赖注入,使用元素的autowire属性为一个bean定义指定自动装配模式。
2、模式表
模式名称 | 描述 |
---|---|
No | 默认的设置,他意味着没有自动装配 |
byName | 由属性名自动装配,Spring容器看到在XML配置文件中bean的自动装配的属性设置为byName,然后尝试匹配,并且将他的属性与在配置文件中被定义为相同名称的beans的属性进行连接 |
byType | 由属性数据类型自动装配。Spring容器看到在XML配置文件中bean的自动配置的属性设置为byType,然后如果他的类型匹配配置文件中的一个确切的bean名称,他将尝试匹配和连接属性的类型,如果存在不止一个这样的bean,则一个致命的异常将会被抛出 |
Constructor | 类似于byType,但该类型适用于构造函数参数类型,如果在容器中没有一个构造函数参数类型的bean,则一个致命的错误将会发生 |
autodetect | Spring首先尝试通过constructor使用自动装配来连接,如果他不执行,Spring尝试通过byType来自动装配 |
3、自动装配的局限性
1、重写的可能性:可以使用总是重写自动装配的和 设置来指定依赖关系
2、原始数据类型:不能自动装配所需的简单类型包括基本类型
3、混乱的本质:自动装配不如显式装配精确,所以如果可能的话尽可能使用显式装配