1、Spring5
1.1 简介
-
Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world’s most popular Java framework.
-
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
-
2002,首次推出了Spring框架的雏形:interface21框架
-
spring理念:使现在的技术更加简化,解决企业应用开发的复杂性
-
SSH:Struct2+Spring+Hibernate
-
SSH:SpringMVC+Spring+Mybatis
官网:https://docs.spring.io/spring/docs/current/spring-framework-reference/overview.html#overview
官方下载地址:https://repo.spring.io/release/org/springframework/spring/
GitHub:https://github.com/spring-projects/spring-framework
使用Spring需要导入的依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<!--spring事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
1.2 优点
- Spring是一个开源的免费的框架(容器)
- Spring是一个轻量级的、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持
总结一点:Spring就是一个轻量级控制反转(IOC),面向切面编程(AOP)的框架
1.3 组成
1.4 拓展
现代的Java开发,说白了就是基于Spring的开发
- SpringBoot
- 一个快速开发的脚手架
- 基于SpringBoot可以快速开发某个微服务
- 约定大于配置
- SpringCloud
- SpringCloud是基于SpringBoot实现的
SpringBoot是关键,而要学会SpringBoot的前提就是要掌握Spring和SpringMVC
2、IOC理论
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
依赖注入理解:使用Set方法动态的注入接口,然后将接口具体的实现控制权交给用户,这样程序的耦合性大大降低!程序员也就能更加专注业务层的实现。
个人理解:当Dao层的一个接口包含多个实现类时,在业务层直接调用这些实现类是十分繁琐的,因为随着用户要求增多,改动业务层代码非常麻烦,所以我们可以写一个set方法动态注入dao接口,然后将接口的具体实现交给用户来实现,这样就会简化程序的耦合。
3、HelloSpring
步骤:
-
编写实体类
package com.xiaojing.pojo; public class Hello { private String str; public void setStr(String str) { this.str = str; } public String getStr() { return str; } @Override public String toString() { return "Hello " + str; } }
-
配置beans.xml
<?xml version="1.0" encoding="UTF8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- id:变量名 class:new的对象 property:配置属性 --> <bean id="hello" class="com.xiaojing.pojo.Hello"> <property name="str" value="Spring"/> </bean> <!-- ref:在Spring容器里创建好的对象 value:具体的值 --> </beans>
-
测试
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello bean = (Hello) context.getBean("hello"); System.out.println(bean.toString());
在整个过程中,hello对象的创建和其属性的设置都由Spring容器来实现
这个过程就叫控制反转:
控制:在传统程序中,对象的创建由程序自身来创建,使用Spring后,对象由Spring容器来创建
反转:程序不创建对象,而是被动的接收对象,即从Spring容器中取出对象
依赖注入:使用set方法来注入
4、IOC创建对象的方式
-
默认使用无参构造
-
假设需要使用有参构造
-
下标赋值
<!--第一种方法:下标赋值--> <constructor-arg index="0" value="张小敬"/>
-
类型赋值
<!--第二种方式:(不推荐使用) 类型赋值--> <constructor-arg type="java.lang.String" value="张小敬"/>
-
属性名赋值
<!--第三种方式:属性名赋值--> <constructor-arg name="name" value="张小敬"/>
-
总结:在加载beans.xml文件的时候,对象就已经创建了,我们可以直接在容器里取
5、Spring配置
5.1 bean
- id:bean的唯一标识符,相当于变量名
- class:bean对象所对应的类全名
- name:别名,可以同时取多个别名
5.2 import
使用import将多个beans.xml文件合并为一个,多用于协同开发
6、依赖注入
6.1 构造器注入
IOC创建对象的方式
中已说过
6.2 Set方法注入(重点)
- 依赖:对象的创建依赖Spring容器
- 注入:对象的属性依赖Spring容器注入
测试一下各种注入方式:
-
写一个含多种数据类型的实体类
public class Address { private String addr; private int code; }
public class Student { private String name; private Address addr; private String[] books; private List<String> hobbies; private Map<String,Integer> grades; private Set<String> relation; private Properties info; }
-
注入方式杂烩
<bean name="student" class="com.xiaojing.pojo.Student"> <!--1、普通值注入--> <property name="name" value="张小敬"/> <!--2、引用对象注入--> <property name="addr"> <bean class="com.xiaojing.pojo.Address"> <constructor-arg name="addr" value="Sichuan University"/> <constructor-arg name="code" value="519"/> </bean> </property> <!--3、数组注入--> <property name="books"> <array value-type="java.lang.String"> <value>大泼猴</value> <value>三体</value> <value>剑来</value> </array> </property> <!--4、Map注入--> <property name="grades"> <map> <entry key="数学" value="125"/> <entry key="语文" value="108"/> <entry key="英语" value="132"/> <entry key="理综" value="250"/> </map> </property> <!--5、List注入--> <property name="hobbies"> <list> <value>打游戏</value> <value>听音乐</value> <value>看剧</value> <value>唱歌</value> </list> </property> <!--6、properties注入--> <property name="info"> <props> <prop key="birth">1997-08-17</prop> <prop key="height">171</prop> <prop key="weight">65</prop> </props> </property> <!--7、set注入--> <property name="relation"> <set> <value>parents</value> <value>friends</value>