一、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的相关依赖:
<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>
|