一、Spring介绍
在日常开发过程中经常会提到三大框架(SSM)指的是Spring、SpringMVC、MyBatis。其中一个非常重要的框架就是Spring。Spring目前隶属于皮沃托公司,Spring在刚刚出来的时候只有Spring Framework一款产品。我们习惯性的简称它为Spring,但是发展到现在Spring旗下已经有非常非常多的框架了,例如:SpringBoot、SpringCloud、SpringData、SpringSecurity等等。但是我们还是习惯性成将Spring Framework成为Spring。
二、Spring到底是什么框架
Spring它并不想Mybatis专门去解决某一个层面的问题,它在项目成扮演的是一个管理者的角色,负责对我们的项目中的对象进行管理,包括创建、注入、代理等等。实现了一个解耦的目的。Spring在管理对象时会将对象存储起来,所以Spring我们也可以将它看成一个容器。
三、Spring的两大核心能力
IOC:Inverse Of Control(控制反转),从前我们的项目中对象的管理创建是由程序员自己来处理,但是Spring框架会代替我们对对象进行创建和管理。控制权从我们手中转移到了Spring框架,所以称为控制反转。
DI(Dependency Injection):依赖注入,Spring在创建对象时还会将对象中所依赖的其他数据或者对象注入到 相应的属性上。
IOC和DI很容易混淆,IOC包含了DI的,IOC是目的,DI是过程。
AOP:(Aspect Oriented Programming)面向切面编程。留到后面详细讲解。
四、SpringIOC
使用Spring首先要引入依赖,Spirng框架下有很多依赖。在使用maven下载依赖时,只需要通过顶端依赖spring-context开始就可以下载到其他所有的依赖。
准备工作:
新建maven普通java项目
在pom.xml中通过spring-context的坐标下载spring的相关依赖:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
Spring容器类型:
容器的顶端是ApplicationContext,在它下面有三个常用的实现类。
ClassPathXmlApplicationContext:通过配置在classpath下的一个xml文件来完成容器初始化。
AnnotationConfigApplicationContext:通过扫描注解初始化容器
WebApplicationContext:在WEB环境下使用的Spring容器
FileSystemApplication:通过外部XML文件完成容器的初始化
配置版的IOC:
初始化容器的API:
ApplicationContext ac=new ClassPathXmlApplicationContext("配置文件的名称");
**配置版的IOC是用过一个XML文件描述bean信息。
1.在项目的resources目录下新建一个xml文件,名为applicationContext.xml,该文件就是spring的核心配置文件,Spring会解析该文件获得必要信息,然后进行IOC的工作。
2.在applicationContext.xml中添加beans根标签,并且在benas标签中添加一个xml的schema约束(类似于DTD)。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
3.通过配置创建对象
● 通过无参构造创建对象(Spring默认的方式,也是最常用的方式)如下:
<bean id="对象的唯一ID" class="要创建的对象的类型"></bean>
● 选择构造方法创建对象
当我们的类具备多种构造函数时,我们可以通过spring选择某一个构造函数来完成对象的创建,具体的方式就是通过bean标签下的constructor-arg标签来完成配置。例如:
public class Service {
public Service(){
System.out.println("无参构造创建");
}
public Service(int a){
System.out.println("单参构造创建");
System.out.println(a);
}
public Service(String a,String b){
System.out.println("双参构造创建");
}
public void checkUser(){
System.out.println("执行业务层");
}
}
<bean id="s1" class="com.woniuxy.service.Service">
<constructor-arg><value>小鑫科技</value></constructor-arg>
<constructor-arg><value>小鑫科技</value></constructor-arg>
</bean>
按照上述方式配置,最终spring会选择双参构造方法来完成对象的创建。
● 通过工厂模式创建对象
首先通过一个bean标签创建一个工厂对象(工厂类自己编写)
<bean id="factory" class="com.woniuxy.util.ConnectionHelper"></bean>
通过bean标签调用工厂对象的工厂方法来创建目标对象
<bean id="conn" factory-bean="factory" factory-method="openConnection"></bean>
● 通过静态工厂模式创建对象
通过bean标签class的值为工厂的类路径,再通过静态工厂方法的方法名来完成对象的创建
<bean id="conn" class="com.woniuxy.util.ConnectionHelper" factory-method="openConnection"></bean>
4.设置对象的单例或非单例
通过spring创建对象时,可以选择使用单例或者是非单例模式。spring默认情况是创建对象采用的是单例模式。
要配置单例或者多例需要使用bean标签中的scope属性。
scope属性可选值:
singleton(默认):单例
prototype:多例
request:web环境中生效,在一次请求中无论你getBean多少次,获取的对象都是同一个
session:web环境中生效,在一次会话中无论你geyBean多少次,获取的对象都是同一个
5.通过配置完成依赖注入
● 注入基本数据类型
在需要注入属性的对象的bean标签下,通过property子标签完成依赖注入,name表示需要注入值的属性的名称,value需要注入的值。
<bean id="d1" class="com.woniuxy.dao.Dao">
<property name="a" value="14"></property>
<property name="b" value="小鑫科技"></property>
</bean>
相对应的需要类中为属性提供set方法,因为配置方式进行依赖注入是同set方法完成赋值的
● 注入对象
在需要注入属性的对象的bean标签下,通过property子标签完成依赖注入,name表示需要注入值的属性的名称,ref表示要注入的对象在spring容器中的ID。
<bean id="s1" class="com.woniuxy.service.Service" scope="prototype">
<constructor-arg><value>1</value></constructor-arg>
<constructor-arg><value>2</value></constructor-arg>
<property name="dao" ref="d1"></property>
</bean>
同样的在被注入的类中需要定义相应的属性并提供set方法
● 注入集合
<bean id="d1" class="com.woniuxy.dao.Dao">
<property name="a" value="14"></property>
<property name="b" value="小鑫科技"></property>
<property name="list">//对应了类中的List
<list>
<value>小鑫科技</value>
<value>小鑫科技</value>
<value>小鑫科技</value>
</list>
</property>
</bean>
● 注入键值对
<bean id="d1" class="com.woniuxy.dao.Dao">
<property name="a" value="14"></property>
<property name="b" value="小鑫科技"></property>
<property name="list">
<list>
<value>小鑫科技</value>
<value>小鑫科技</value>
<value>小鑫科技</value>
</list>
</property>
<property name="map">//对应了类中的Map
<map>
<entry>
<key>
<value>a</value>
</key>
<value>小鑫科技</value>
</entry>
</map>
</property>
</bean>