文章目录
Spring简介
Spring 框架是一个 Java 平台,为开发 Java 应用程序,提供全面的基础架构支持。 Spring 处理基础结构,因此您可以专注于应用程序。
简单来说,Spring 框架,解决对象创建以及对象之间依赖关系的一种框架。spring 把每个bean(实体类)与bean的关系全部交给第三方容器进行管理。容器就是spring,整个对象的生命周期管理的。Spring 核心就是: IOC/DI/AOP。Spring 还整合了多其他框架,同时还是一个起到整合作用的框架。
Spring组件
Spring Framework 由组成大约 20 个模块的 features 组成。这些模块分为 Core Container,Data Access/Integration, Web,AOP(Aspect Oriented Programming),Instrumentation,Messaging 和 Test,如下图所示。
主要组成部分:
Spring Core
: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。
Spring Aspects
:该模块为与AspectJ的集成提供支持。
Spring AOP
:提供了面向切面的编程实现。
Spring JDBC
: Java数据库连接。
Spring JMS
:Java消息服务。
Spring ORM
: 用于支持Hibernate等ORM工具。
Spring Web
: 为创建Web应用程序提供支持。
Spring Test
: 提供了对 JUnit 和 TestNG 测试的支持。
有兴趣了解的,可以看以下组件的详细解释。
Spring IOC / AOP
IOC:《浅谈Java反射与SpirngIOC原理》
AOP:《浅谈代理模式与SpringAOP原理》
依赖注入(DI)和控制反转(IOC)
Spring IOC
(控制反转),Spring DI
(依赖注入),这两个概念在学习和使用 Spring
当中你一定会接触到,也是 Spring
非常重要的概念。
在我看来,IOC
只是反转了角色,颠倒我们传统手动 new Object();
的方式,担任的是创建对象及解决对象依赖的角色。
而 DI
,则是负责注入,负责把创建的对象注入。
依赖注入(DI)有几种方式?
依赖注入,其实就是 Spring 给对象的属性赋值。大致上是这几种常用的,其他的方式了解即可。
- 构造函数
- set方法为属性注入
- 注解
Set 注入的原理?
前提是对象的属性必须有 Set方法。
关于这个,可以看我这两篇博客《浅谈Java反射与SpirngIOC原理》,IOC 底层实现是 xml 解析技术 + Java 反射技术。而 set注入,是在反射创建实例之后为对象属性赋值。(如果对象的属性不存在set方法自然会报错)
Spring Bean 作用域
Singleton 、Prototype、Request、Session、Global session 五种。
Spring Bean 作用域指的是 Bean 的 Scope 属性,默认是Singleton
单例。
Singleton :容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
Prototype:容器可以创建多个Bean实例,每次返回的都是一个新的实例。
Request:仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
Session:仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
Global-session:仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
Spring Bean 默认是单例,但请不要在Bean中共享变量,这样做会线程不安全。
@Resource 和 @Autowired 方式注入的区别?
@Resource 是由 JDK1.6开始提供,@Autowired 是 Spring 提供的。
JDK 自带的 @Resource 默认是按照名称(byName)来装配。
Spring 的 @Autowired 默认是按照类型(byType)注入,如果想按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
XML文件+@AutoWired方式装配同一个Bean会怎样?
容器会优先装配XML文件中的Bean。
BeanId重复
因为Spring容器默认Bean的Scope是Singleton,当出现两个一样的BeanId是会报错,(XML文件和注解方式分开出现同一个的话不会报错,但一种方式出现重复beanId是会报错的)