Spring 5 笔记 - 入门与IOC
1. Spring 入门简介
Spring:轻量级、开源的JavaEE框架, 解决企业应用的复杂性。包括IOC和AOP两个核心部分。
IOC: 控制反转,把创建对象和对象之间的调用的过程都交给Spring 进行管理,使耦合度降低。
AOP:面向切面,不修改源代码进行功能增强。
Spring特点:1. 解耦; 2. AOP编程支持; 3.方便测试(Junit); 4.方便整合; 5.方便事务操作; 6.降低API开发难道。
选取Spring版本5.X
相关包下载:
进入Spring官网:Spring | Home
获得下载地址:https://repo.spring.io/artifactory/release/org/springframework/spring/
下载完后解压:
2. IOC实例
1.建Java项目
- 引入Jar包, 新建lib文件夹,copy相关包:
引入如下基础包:
common-logging-xxx.jar 包下载地址:
Apache Commons Logging - Download Apache Commons Logging
- 把上面的Jar包导入到项目中。
点击“File --> Project Structure”, 然后:
点“+”号,选 "Attach Files or Directories", 导入上面的5个Jar包:
4.创建普通类
5.创建Spring配置文件
- 测试代码
实例完成。
3. IOC 原理
3.1 IOC 底层原理:xml解析、工厂模式、反射。
xml解析:读取配置文件
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂。Spring 提供IOC容器实现的两种方式(两个接口):
(1) BeanFactory: IOC容器的基本实现,是Spring内部使用的接口,不提供开发人员进行使用。
特点:加载配置文件时不会创建对象,在获取对象或者使用对象的时候才创建对象。
BeanFactory实现类:在“BeanFactory” 上 “Ctrl + H”打开:
(2) ApplicationContext:BeanFactory接口的子接口,提供更多强大的功能,一般由开发人员使用。
特点:加载配置文件的时候就把配置文件中的对象进行创建。(有些对象可以运用于服务器启动时创建,加快运用是的速度)
ApplicationContext的实现类:在 “ApplicationContext”上“Ctrl + H”打开:
4. IOC 操作(Bean管理, 基于xml)
4.1 IOC操作(创建对象,注入属性)
(1)创建对象
(2)注入属性
Bean管理操作有两种方式:
(1)基于xml配置文件方式实现
(2)基于注解方式实现
基于xml创建对象
- 创建对象时候,默认是执行无参构造方法完成对象创建。
基于xml注入属性
(1)DI:依赖注入,就是注入属性
第一种方式,使用set方法注入。
第二种方式,有参构造方式注入。
P名称空间注入,简化xml属性注入(实践中用得少):
发现识别不了p命名空间得URL,如下:
可以参考: IntellijIdea解决xml文件中出现“uri is not registered”_sfhappy23的博客-CSDN博客
此问题尚未解决。。。
4.2 IOC操作(注入其它类型的属性)
4.2.1 字面量
(1)null值
(2)属性中包含特殊符号
方法一:把特殊字符进行转义
方法二:如下:
4.2.2 注入属性-外部bean
4.2.3 注入属性-内部bean
4.2.4 注入属性-级联赋值
(1)第一种实现方式
其它同上面外部bean一样,就配置文件不同:
(2)第二种实现方式
记得要加入如下的get方法才可以用这个种级联赋值:
4.3 IOC操作(xml注入集合属性)
- 注入数组类型属性
- 注入List集合类型属性
- 注入Map集合类型属性
- 注入Set集合类型属性
实例:
- 在集合里面注入对象类型值
- 把集合注入部分提取出来
(1)在Spring配置文件中引入名称空间,和配置bean
(2)其它文件同上面的例子,执行结果:
4.4 IOC操作(Bean管理:FactoryBean)
- Spring 有两种类型的Bean,一种是普通Bean,一种是工厂Bean(FactoryBean)
- 普通Bean:在配置文件中定义的Bean类型就是返回类型
- 工厂Bean:在配置文件中定义的Bean类型可以和返回的类型不一样。
工厂Bean例子:
(1)第一步,创建类,让这个类作为工厂Bean,实现接口FactoryBean
(2)第二步,实现接口里面的方法,在实现的方法中定义返回的bean类型
4.5 IOC操作(Bean作用域)
在Spring里面,可以设置创建bean实例时单实例还是多实例
(1)在Spring 里, 默认情况下bean是单实例对象。
(2)设置多实例:在Spring 的配置文件bean标签里面有属性(scope)用于设置单实例还是多实例。
scope属性值:
- singleton, 默认值,表示单实例对象,在加载Spring配置文件时候就会创建单实例对象。
- prototype,表示多实例对象,不是在加载Spring配置文件时候创建对象,在调用getBean方法时候创建多实例对象。
- request,表示一次请求, 每次请求时创建对象。
- session,表示一次会话, 每次会话时创建对象。
例子(同上,差别如下):
4.6 IOC操作(Bean生命周期)
Bean生命周期:对象从创建到销毁的过程:
(1)通过构造器创建bean实例(无参构造器)
(2)为bean的属性设置值和对其它bean引用(调用set方法)
(3)调用bean的初始化的方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
例子:
加上Bean的后置处理器后,bean的生命周期一共有7步:
(1)通过构造器创建bean实例(无参构造器)
(2)为bean的属性设置值和对其它bean引用(调用set方法)
(3)把bean的实例传递给bean的前后置处理器的方法(postProcessBeforeInitialization方法)
(4)调用bean的初始化的方法(需要进行配置初始化的方法)
(5)把bean的实例传递给bean的后后置处理器的方法(postProcessAfterInitialization方法)
(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
例子(创建类,实现接口BeanPostProcessor,创建后置处理器):
同上面的例子,变动如下:
4.7 IOC操作(xml自动装配,实际中用得不多。)
(1)概念:根据指定装配规则(属性名称或者属性类型),Spring自动将匹配地属性值进行注入。
(2)实现自动装配:在bean标签中加入属性autowire配置自动装配,autowire属性常用两个值:
- byName:根据属性名称注入,注入值bean的id值和类属性名称一样。
- byType:根据属性类型注入, 如果有两个同类型的bean,那么注入会报错
属性名称注入例子:
属性类型注入例子:
其它文件一样,不同的如下:
4.8 IOC操作 (外部属性文件)
例子:
下载德鲁伊连接池的jar包
Druid(德鲁伊) 数据库连接池,是阿里巴巴开源的数据库连接池项目。下载地址:
Central Repository: com/alibaba/druid
(2)引入德鲁伊Jar包到项目
(3)配置properties属性文件
(4)引入外部属性文件配置德鲁伊数据库连接池(需要引入名称空间context)
5. IOC 操作 (Bean管理,基于注解)
IOC操作Bean管理(基于注解方式)
(1)格式:@注解名称(属性名称=属性值,属性名称=属性值)
(2)注解作用在类上面、方法上面和属性上面
(3)使用注解可以简化xml配置
(4)Spring针对Bean管理中创建对象提供的注解:
- @Component, 普通的组件上
- @Service, 一般用在业务层上
- @Controller, 一般用在Web层上
- @Repository,一般用在DO层上
- 上面的四个注解功能是一样的,都可以用来创建Bean实例,只是方便用于区分用到不同的地方。
5.1 基于注解方式实现对象创建
(1)引入aop依赖
(2)开启组件扫描(需要引入名称空间context)
(3)创建类,在类上面添加创建对象的注解
5.2 开启组件扫描细节配置
- 示例1:
use-default-filters 的默认值是"true",表示默认情况下会扫描
- 示例2:
5.3 基于注解方式实现属性注入
(1)@AutoWired, 根据属性类型进行自动装配
存在弊端: 如果存在多个同类型的实现类,无法确定注入哪个, 会报错.
例子:
(2)@Qualifier,根据属性名称进行注入
@Qualifier注解要和上面的@AutoWired一起使用。
解决弊端: 结合@AutoWired使用, 可以明确哪个实现类.
示例:
其它同上,不同部分如下:
(3)@Resource, 可以根据类型注入,也可以根据名称注入
@Resource注解不是Spring中的, 而是javax中的对象.
示例:其它同上,不同如下
- 根据类型进行注入
- 根据名称进行注入
(4)@Value,注入普通类型属性
示例,其它同上,不同如下
5.4 完全注解开发(用配置类代替xml配置文件)
例子:其它同上,不同如下
(1)创建配置类,替代xml配置文件,删除了原来的xml配置文件
(2)编写测试类