Spring
Spring简介
框架的作用
- 提高开发效率
- 增强可重塑性
- 提供编写规范
- 节约维护成本
- 解耦底层实现原理
Spring是什么
Spring是分层的JavaEE/SE应用 full stack(一站式)轻量级开源框架
Spring体系结构
- 底层是核心容器(Core Container)
- Beans
- Core
- Context
- SpringEI表达式
- 中间层技术
- AOP
- Aspects
- *Instrumentation
- *Messaging
- 应用层技术
- 数据访问及数据集成
- Web集成
- Web实现
- 基于Test测试
IoC简介
耦合与内聚
- 耦合(Coupling):代码书写过程中所使用的技术的结合紧密度,用于衡量软件中各个模块之间的互联程度。
- 内聚(Cohesion):代码书写过程中单个模块内部各组成部分之间的联系,用于衡量软件中各个功能模块内部的功能联系。
程序书写的目标:高内聚,低耦合
IoC
-
IoC(Inversion of Control):控制反转,Spring反向控制应用程序所需要使用的外部资源
-
Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器
HelloSpring
-
导入Spring核心依赖包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.2.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
-
创建一个实现类,里面写一个方法输出“Hello Spring!”;
-
在resources文件包下创建spring的配置文件 applicationContext.xml
-
在 配置文件 applicationContext.xml 中添加下面的代码
<!-- 创建spring控制的资源--> <bean class="org.example.TestHello" id="hello"></bean>
-
在主方法中加载配置文件,获取资源
public class App { public static void main( String[] args ) { // java 创建对象的方式 // TestHello testHello = new TestHello(); // testHello.hello(); // 创建对象的权利发生了变化 // spring来帮我们创建文件 // spring 框架创建对象的方式 // 加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取资源 TestHello testHello1 = (TestHello) applicationContext.getBean("hello"); // 调用方法 testHello1.hello(); } }
-
运行
IoC配置(XML)
bean
-
名称: bean
-
类型: 标签
-
归属: beans标签
-
作用: 定义spring中的资源,受此标签定义的资源将受到spring控制格式:
<beans> <bean /> </beans>
-
基本属性:
<bean id="beanId" name="beanName1 ,beanName2" class="ClassName "></bean>
- id: bean的名称,通过id值获取bean
- class: bean的类型
- name: bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名
bean属性scope
-
名称: scope
-
类型: 属性
-
归属: bean标签
-
作用: 定义bean的作用范围,控制bean创建后的对象是否是单例的
-
格式:
<bean scope="singleton"></bean>
-
取值:
- singleton:设定创建出的对象保存在spring容器中,是一个单例的对象
- prototype:设定创建出的对象保存在spring容器中,是一个非单例的对象
- request、session、application、websocket:设定创建出的对象放置在web容器对应的位置
-
单例与非单例区别:
-
对象创建时机
-
单例对象:加载spring容器时创建
-
非单例对象:获取对象时创建
-
- 非单例:打印出来的三个对象的内存地址不同,且testService1和testService2不是同一个对象
- 单例:打印出来的三个对象的内存地址相同,testService1和testService2是同一个对象
-
bean生命周期
-
名称: init-method,destroy-method
-
类型: 属性
-
归属: bean标签
-
作用: 定义bean对象在初始化或销毁时完成的工作
-
格式:
<!-- init-method 和 destroy-method 用于控制bean的生命周期 --> <bean init-method="init" destroy-method="destroy"></bean>
-
取值: bean对应的类中对应的具体方法名
-
注意事项:
- 当scope= "singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次;
- 当scope= “prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次;
- 当scope= “singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次;
- 当scope= “prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行。
当spring配置的是非单例对象的时候,该对象不归spring容器进行管理
DI-依赖注入
- DI (Dependency Injection) 依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为**注入**
-
IoC与DI的关系:
- IoC和DI是同一件事站在不同角度看待问题
set注入(主流)
-
名称: property类型:标签
-
归属: bean标签
-
作用: 使用set方法的形式为bean提供资源格式:
<bean> <property /> </bean>
-
基本属性:
<property name="propertyName" value="propertyValue" ref="beanId"/>
- name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
- value:设定非引用类型属性对应的值,不能与ref同时使用
- ref:设定引用类型属性对应bean的id,不能与value同时使用
-
步骤
-
对需要进行注入的变量添加set方法
-
将要注入的资源声明为bean
-
使用property属性对资源实现注入
- name属性对应的是set方法对应的要注入的变量名
- ref属性对应的是要注入bean的id
-
。。。。未完待续