Spring框架的基本概念与IOC学习笔记
Spring框架
Spring的概述
1. Spring的概念:
* spring是一个全栈式的轻量级开源框架,以IOC(控制反转)和AOP(面向切面编程)为内核
* 全栈式:
2. Spring家族:
1. Spring Framework
2. SpringBoot
3. SpringData
4. SpringSecurity
5. SpringCloud
3. Spring 的优势
1. 方便解耦,简化开发
2. AOP编程的支持
3. 申明式事务的支持
4. 方便程序的测试
5. 方便集成各种优秀的框架
6. 降低JavaEE API的使用难度
7. Java源码是经典学习范例—>可以学习一下
4. 代码的耦合(程序间的依赖关系)/解耦(降低程序间的依赖)
编译期依赖:
- 解耦的思路(转换成运行时依赖):工厂模式+配置文件+反射
1. 使用反射创建对象,避免使用new关键字
2. 通过配置文件来获取要创建对象的全限定类名
3. 使用工厂模式创建对象
1. 由于每次调用工厂模式都会创建一个新对象-->浪费资源,降低开发效率
2. 我们需要创建一个单例模式的对象
* 定义一个map集合保存创建的对象(该对象可以在类加载的时候创建)
* 通过工厂模式获取对象时,可以从map集合中获取
*
Spring IOC(Inversion Of Control)
1. 概念:
1. IOC(Inversion Of Control):控制反转
2. 把创建对象的权力交给框架
3. 可以解决程序中的耦合
2. IOC入门
- 开发包文件说明
- docs:文档
- libs:jar包
- scheme:约束文件
- 环境搭建
- pom.xml 引入依赖jar包—>Spring-context
- 配置文件
- 加入约束
- 配置
<bean id="唯一标识" class="全限定类名">
- 初始化Spring(IOC)容器
- ApplicationContext context = new ClassPathXmlApplicationContext(“配置文件”);
- context.getBean(“id”);
- context.getBean(“id”,Class)
- context.getBean(class)
- ApplicationContext context = new ClassPathXmlApplicationContext(“配置文件”);
- ApplicationContext 常用实现类
- ClassPathXmlApplicationContext
可以加载类路径的下的配置文件 - FileSystemXmlApplicationContext
可以加载有权限的磁盘路径下的配置文件 - AnnotationConfigApplicationContext
可以读取注解创建
- ClassPathXmlApplicationContext
- ApplicationContext 与 BeanFactory接口的关系
- 联系:BeanFactory是ApplicationContext的顶层父接口
- 区别:创建对象的时机不同
- ApplicationContext : 单例对象适用
- 创建对象采取的策略是立即加载的方式,配置文件读取完就创建对象
- 功能强大
- BeaFactory : 多例对象使用
创建对象采取的策略是延迟加载的方式,使用对象时才会创建对象
- ApplicationContext : 单例对象适用
3. bean对象的实例化
- 创建bean的三种方式
- 使用默认构造函数实例化
- 实例工厂方法实例化(使用某个类中的方法创建,并存入spring容器)
- 静态工厂方法实例化
- 使用默认构造函数实例化
- bean的作用范围
- 默认情况下,Spring容器中配置的bean是单例的
- 通过bean标签的scope属性可以调整bean的作用范围
- singleton : 单例
- prototype : 多例
- request : 作用于web应用的请求范围
- session : 作用于web应用的会话范围
- global-session : 作用于集群环境的会话范围,当不是集群环境时,等同于session
- bean对象的生命周期
bean初始化的方法 : init-method
bean销毁的方法 : destroy-method- 单例对象:单例对象的生命周期与spring容器相同
- 多例对象:当对象使用时创建,由java垃圾回收机制回收
4. Spring-DI(依赖注入)
- 什么是依赖注入?
英文全称: Depedency Injection
在当前类需要用到其他类的对象,由spring提供,需要在配置文件中说明依赖关系的维护–称为依赖注入 - 注入的数据类型
- 基本类型和String
- 其他bean类型
- 复杂类型/集合类型
- 注入的方式
- 经常变化的数据,不适合注入的方式
- 构造函数注入
- 使用的标签:
- 使用的位置: 标签内
- 标签中的属性:
- type : 构造参数的类型
- index :构造参数的索引
- name :构造参数的名称
- value : 注入的数据,简单数据类型
- ref : 注入的数据,是spring容器中声明的bean类型
- setter注入
- 必须提供set方法
- 使用的标签:
<property>
- 使用的位置:
<bean>
标签内 - 标签的属性:
- name:被注入对象的属性名–定位要调用的set方法
- value:注入的数据,简单数据类型
- ref : 注入的数据,是spring容器中声明的bean类型
- 集合类型的注入
- 使用的标签 :
- list结构使用的标签(组内间可以互用)
-
<array>
—注入数组使用 -
<list>
----注入集合使用 -
<set>
-----注入set使用
-
- map结构使用的标签(组内间可以互用)
-
<map>
-----注入map使用 -
<props>
—注入properties使用
-
- list结构使用的标签(组内间可以互用)
- 使用的标签 :
- 注解注入
5. IOC的半注解开发
使用注解开发,需要配置xml
配置包扫描路径—>告知spring容器,在加载配置文件时,扫描那个包下的注解
步骤:
- 引入context约束
- 配置包扫描路径
<context:component-scan base-package=“包路径”>- 用于创建对象的注解
@Component:
作用:用于把当前类的对象保存到容器中
属性:
1. 如果不指定属性,键值默认类名首字母小写
2. 使用value指定键值
衍生的注解:
1. @Controller:一般用在表现层
2. @Service: 一般用在业务层
3. @Repository:一般用在持久层
以上三个功能与@Component基本相同 - 用于注入数据的注解
- @Autowired
-
作用: 自动按照类型注入,
- 如果ioc容器中有唯一的数据匹配,可以注入成功,
- 如果ioc容器中没有匹配的数据,会报错 NoSuchBeanDefinitionException
- 如果ioc容器中有多个匹配的数据,会报错(NoUniqueBeanDefinitionException)
解决方案:
> 可以通过变量名匹配对应对象
> @Qualifier,按照类型注入的前提下再按照名称注入,在给成员注入时不能单独使用
> @Resource,可以直接通过name属性指定bean的id–>JDK1.9失效
-
作用位置: 方法上,类上
-
以上三个注解都只能注入bean类型的数据,简单数据类型不能使用以上注解,另外集合类性只能通过xml来实现
- @Value
- 作用: 用于注入基本类型和String类型的数据
- 属性:
value:用于指定数据的值,它可以使用spring中的SpEL(Spring的EL表达式:${表达式})
- 用于改变作用范围的注解
@Scope:- 作用:指定bean的作用范围
- 和生命周期相关的注解
* @PostConstruct : 初始化注解 * @PreDestroy : 销毁注解
- 用于创建对象的注解
6. IOC的案例
xml-IOC配置
Spring的全注解配置
- @Configuration :
作用: 指定当前类是一个配置类
细节: 当配置类作为AnnotationConfigApplicationContext的参数时,可以省略 - @ComponentScan :指定spring在创建容器中要扫描的包
value/basePackages属性指定要扫描的包
- @Bean :
作用: 用于把当前方法的返回值作为bean对象传入spring容器中
作用位置: 方法上
属性: name用于指定bean的id,当没有指定name值时,默认id是当前方法名称
细节: 当使用注解配置时,在方法声明时,指定了方法的形参,参数需要去ioc容器中查找,查找方式与@Autowired相似 - @Import
作用 :用于导入其他配置类
属性 : value:用于指定其他配置类的字节码对象
当配置类被@Import注解时,该配置类就是主(父)配置类, - @PropertySource
作用 : 加载外部properties配置文件
属性 :
value:指定文件的名称和路径
1. classpath:申明value中的路径是类路径的关键字
2. file:申明value中的路径是file目录的关 - @Qulifier
作用 : 作用在方法的形参上面,指定注入参数的id值
Spring对Junit的整合
-
导入Spring整合junit的jar包–>spring-test.jar
-
使用Junit提供的@Runwith注解将原有的main方法替换成spring提供的SpringJunit4ClassRunner
-
通过@ContextConfiguration注解告知spring的运行器,spring和ioc时基于xml还是注解,并说明位置
locations: 指定xml文件的位置,加上classpaht关键字,表示在类路径下
- @ContextConfiguration(locations=“classpath:配置文件”)
classes: 指定注解类所在位置,指定配置类的字节码对象
- @ContextConfiguration(classes=“配置类字节码对象”)
-
Spring-test如果版本时5.0以上,junit的jar包版本必须高于4.12