Spring第一天学
Spring概述
- Spring是什么
- Spring介绍
Spring是分层的Java SE/EE应用full-stack轻量级开源框架 - Spring中的两大核心
IoC(Inverse Of Control)反转控制
AOP (Object Oriented Programming)面向切面编程
- Spring介绍
- 为什么选用Spring
- Spring发展历程及优势
- 方便解耦,简化开发
- AOP编程的支持
- 声明式事务的支持
- 方便程序的测试
- 方便集成优秀框架
- 降低JavaEE API使用难度
- 源码是经典的范例
- Spring发展历程及优势
- Spring是怎么做的
- Spring体系结构
IoC是Spring的核心
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BLhARD7-1581392182625)(en-resource://database/2990:2)]
- Spring体系结构
程序的耦合及解耦
- 耦合及解耦
做到编译器不依赖,运行时才依赖,- 可以通过反射的方式创建对象
- 通过配置获取穿件对象的权限类名
- 工厂模式解耦
IOC及Spring中的IOC
- IoC 把创建对象的权利交给框架或工厂,是框架的重要特征,并非面向对象编程的术语。包括依赖注入(Dependency Injection)和依赖查找(Dependency lookup),削减程序耦合。
Spring基于XML的IoC
- Spring中基于XML的IOC环境搭建
- Spring中的IoC
只能解决程序耦合,没有其他的作用。 - Spring核心容器的两个接口
- ApplicationContext
在构建核心容器时,创建对象采用的策略是立即加载方式,即读取配置文件后立即创建配置中的对象。适用于单例对象 - BeanFactory
创建对象的策略是延迟加载的方式,即再用到对象的地方创建对象,适用于多例对象
- ApplicationContext
- Spring中的IoC
- spring管理对象
-
创建bean的三种方式
- 使用默认构造方式创建
spring配置文件中只有id
和class
属性,采用默认构造函数创建bean对象,此时如果类中没有默认构造函数则对象创建失败。
<bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBeanTwo"/>
- 使用某个类中的方法创建对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KZCCHJ5D-1581392182636)(en-resource://database/2994:1)] - 使用某个类中的静态方法创建对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjC8MyOS-1581392182638)(en-resource://database/2996:1)]
- 使用默认构造方式创建
-
bean对象的作用范围
bean标签的scope属性指定作用范围
取值有
singleton :单例的(默认值)
prototype:多例的
request:作用于应用的请求范围
session:作用于web的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),不是集群环境通session,具体的应用案例是登陆网页时,请求经过负载均衡后,可能访问到多台服务器,此时如果只有某台服务器上有session,那么在响应请求做验证码比较时,同时存在多台服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UVFBTmd-1581392182640)(en-resource://database/3002:1)] -
bean对象的生命周期
- 单例对象
出生:创建容器时出生
活着:只要容器在,对象一直或者
死亡:容器销毁,对象销毁
总结:单例对象生命周期和容器相同 - 多例对象
出生:使用对象是创建
活着:使用过程中一直或者
死亡:由java垃圾回收机制回收
-
依赖注入(Dependency Injection)
什么是依赖注入
IoC作用是程序间的耦合,管理程序之间的依赖关系,由Spring提供依赖,只需要在配置文件中配置
依赖关系的维护就称之为依赖注入
能注入的数据
1. 基本类型和String
2. 其他的Bean类型(配置文件中或注解中配置过的bean)
3. 复杂类型/集合类型
注入的方式
1. 使用构造函数提供
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6Eghiuf-1581392182643)(en-resource://database/3008:1)]
在bean标签中内部使用constructor-arg
标签,标签中可以有如下属性
type
用于指定注入的数据的数据类型,该数据类型是构造函数中某个或某些参数的类型
index
用于为构造函数中指定索引位置的参数注入数据,索引从0开始
name
用于指定构造函数中指定名称的参数注入数据
value
提供数据,可以提供基本类型或者Stirng类型
ref
提供其他bean类型的数据,指的是在spring的IoC容器中出现过的bean对象
特点
使用该种方式创建对象时,必须注入数据,否则无法创建bean对象。
弊端:改变了bean对象实例化的方式,在创建对象时,即使用不到这些数据也必须提供。
2. 使用set方法提供
在bean标签内部使用property
标签,包含如下属性
name
指定set方法名称
value
提供数据,可以提供基本类型或者Stirng类型
ref
提供其他bean类型的数据,指的是在spring的IoC容器中出现过的
特点
创建对象时没有明确的限制,可以直接使用默认构造方法创建对象
弊端:如果某个成员数据必须初始化值,使用该方法不能强制进行限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNkUtVW9-1581392182644)(en-resource://database/3012:1)]
3. 使用注解提供
复杂类型数据的注入
在property
标签或者constructor-arg
标签下添加子标签
例如array
标签添加数组类型的数据,每个数据用value
标签指定
list
添加list类型数据
set
添加set类型数据
map
添加map类型数据,通过entry
标签指定键值
<map>
<entry key="" value=""></entry>
<entry key="">
<value> AAA <value>
</entry>
</map>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWR0L0OC-1581392182646)(en-resource://database/3014:1)]
用于list结构集合注入的标签 list
array
set
用于Map结构集合注入的标签 map
properties
结构相同,标签可互换
业务层调用持久层
Bean在计算机领域有可重用组件的意思
JavaBean 用java语言编写的可重用组件
Spring第二天学习
Spring基于注解的IcO
实现的功能和基于XML的方式是一样的,都是为了降低程序间的耦合
使用基于注解方式的IoC,需要在XML文件中配置注解相应的属性,并指定要扫描的包。
-
Spring中常用的注解
-
用于创建对象的注解
@Component
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8R4xhVv-1581392330112)(en-resource://database/3016:1)]作用:用于把当前类对象存入Spring容器
属性:
value:用于指定bean中的id,缺省时为当前类名,且首字母小写``` @Cimponent(value = "id") @Component("id") //只有一个value可以省略`value` ```
@Controller 一般用在表现层
@Service一般用在业务层
@Repository一般用于持久层
上述三者的功能与@Component
作用相同-
用于注入数据的
@Autowired
作用:按照类型注入,只要容器中有唯一的一个bean对象和注入的变量类型匹配,则可以注入成功
如果容器中没有可以匹配类型的对象,则报错
如果容器中包含多个可以匹配的对象,则根据注入变量的变量名尝试匹配筛选出的对象id注入
位置:可以在变量上,也可以在方法上
细节:在使用注解注入时,set方法就不是必须的了@Qualifier
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmgE7OEm-1581392330114)(en-resource://database/3020:1)]作用:在按照类型注入的基础上再按照名称注入。在给类成员注入时不能单独使用,但是给方法参数注入时可以单独使用
属性:
value:指定注入bean的id
使用:再给类成员注入时,需要结合@Autowired
@Resource
作用:根据bean的id直接注入,可以独立使用
属性:
name:用于指定bean的id
@Value
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCdWey36-1581392330115)(en-resource://database/3018:1)]作用:注入基本类型、String类型的数据
属性:
value:注入的数据,可以使用spring中的SpEL(spring 的el表达式)@Autowired
@Qualifier
@Resource
以上三种注解只能注入其他bean类型的数据,不能注入基本数据类型以及String类型的数据
集合类型的注入只能通过xml方式实现 -
改变作用范围的
@Scope
作用:指定bean的作用范围
属性:
value:singleton
prototype
缺省值singleton -
生命周期相关
@PostConstruct
作用:指定初始化方法
@PreDestroy
作用:指定销毁方法
-
-
使用XML及注解方式实现表单的CRUD操作
持久层技术选择:dbutils -
Spring和Iunit整合
Junit单元测试中,没有main
方法
Juni集成了一个main方法,该方法会判断当前类中哪些方法有@Test
注解,有注解的方法自动运行
Spring导入Junit配置步骤- 导入Spring整合的Junit的jar包(坐标)
- 使用Junit提供的一个注解替换原有的main方法,替换为Spring提供的
@Runwith
- 告知Spring的运行器,Spring和IoC的创建是基于xml还是注解的,并且说明位置
@ContextConfiguration
location
指定xml文件的位置,加上classpath关键字,表示在类路径下
classes
指定注解类所在位置
使用Spring5.x版本的时候,要求Junit的版本必须是4.12及以上
-
基于注解的配置类取代XML配置
@Configuration
作用:指定当前类是一个配置类
@ComponentScan
作用:通过注解指定spring在创建容器时要扫描的包
属性:value
basePackages
用于指定要扫描的包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKKj4JF3-1581392330129)(en-resource://database/3024:1)]
@Bean
作用:将当前方法的返回值作为bean对象存入到spring的IoC容器中
属性:name
对象的id,默认值为当前方法的名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UhjXApu-1581392330131)(en-resource://database/3028:1)]
@Import
作用:导入其他的配置类到当前配置类,当前的类为父配置类
属性:value
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBBCPkzQ-1581392330135)(en-resource://database/3032:1)]
@PropertySouorce
作用:指定properties文件路径
属性:value
指定文件名称及路径,关键字classpath
表示类路径下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-suzzFGiK-1581392330136)(en-resource://database/3036:1)]
采用SpEL表达式读取配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-leUVX51w-1581392330139)(en-resource://database/3040:1)]其他细节:
- @Configuration注释的省略
在如下方式创建容器时,即显示地声明配置类,可以省略标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-igjB56vo-1581392330140)(en-resource://database/3030:1)]
- @Configuration注释的省略