一、Spring概述

1、什么是Spring

1、Spring是分层的Java SE/EE应用full-stack(全栈)轻量级开源框架
核心是IOC(Inverse Of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)
2、Spring是一个全栈应用框架,提供了表现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多应用技术
3、Spring还能整合开源世界众多注明的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架

2、为什么学习Spring

1、最大程度的简化了开发
2、大量公司使用
3、顶尖的源代码

3、Spring的特点及优势

1、方便解耦,简化开发
2、AOP编程的支持
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优秀框架
6、降低Java EE API的使用难度
7、Java源码是经典学习范例
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)

4、Spring体系结构

image-20210611173655339.png

二、IoC概述

大致可以这样理解,在以往的三层框架编写时,web层调用service层,service调用dao层,这样一套流程,如果我们想改变其中一部分代码,那么这些一连串的代码流程都需要改变,所以需要有一种方法可以动态的改变其中的调用内容,比如在web层调用service层时,service是写死了的调用的到层方法,我们把service剥离出来,可以动态的改变调用的是哪一个dao类方法,怎么办呢,我们在web层告诉service调用某一个类的方法,这个思想,称之为IoC

三、Spring入门

1、Spring核心配置文件(applicationContext.xml)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="dao层接口名" class="该dao层的实现类的全路径"></bean>
  7. </beans>

2、获取Spring核心配置文件的bean标签内容

  1. // 读取applicationContext.xml配置文件
  2. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. // 获取具体类
  4. dao层接口类型 dao层接口名 = (类型转换) applicationContext.getBean("bean标签中的id名");
  5. //通过dao层接口名调用具体实现类的方法

四、Spring相关API

1、Spring核心接口

a、BeanFactory

IOC容器的顶级接口,它定义了IOC的最基础的功能,但是其功能比较简单,一般面向Spring自身使用
在第一次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化[什么时候用什么时候创建]—>【懒汉设计】

  1. public class BeanFactory {
  2. // 声明存储对象的容器(map集合)
  3. private static Map<String, Object> ioc = new HashMap<>();
  4. // 静态代码块,初始化ioc容器
  5. static {
  6. String id = null;
  7. String className = null;
  8. Object object = null;
  9. try {
  10. // 1.通过类加载器读取 beans.xml
  11. InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
  12. // 2.创建dom4j核心解析器对象
  13. SAXReader saxReader = new SAXReader();
  14. Document document = saxReader.read(in);
  15. // 3.编写xpath表达式
  16. String xpath = "//bean";
  17. // 4.获取所有的bean标签对象
  18. List<Element> list = document.selectNodes(xpath);
  19. // 5.遍历集合,创建对象实例,设置到ioc容器中
  20. for (Element element : list) {
  21. id = element.attributeValue("id");
  22. className = element.attributeValue("class");
  23. object = Class.forName(className).newInstance();
  24. // 设置到map集合
  25. ioc.put(id, object);
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. // 从ioc容器中获取指定id的对象实例
  32. public static Object getBean(String id) {
  33. return ioc.get(id);
  34. }
  35. }

b、ApplicationContext

这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用
在容器启动时,一次性创建并加载所有的Bean,[初始化的时候全创建好]—>【饿汉设计】

2、Spring核心实现类

a、ClassPathXmlApplicationContext

读取类路径(classpath)下的xml配置文件

b、FileSystemXmlApplicationContext

读取本地磁盘下的xml配置文件

c、AnnotationConfigApplicationContext

读取java配置类加载配置

3、Spring核心实现方法

a、通过指定id获取对象的实例,需要手动强转

  1. // 读取applicationContext.xml配置文件
  2. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. // 获取UserDao
  4. UserDao userDao = (UserDao) applicationContext.getBean("userDao");
  5. // 调用方法
  6. userDao.getUser();

:每次获取对象,都需要进行强转

b、通过指定类型获取对象的实例,不需要强转

  1. // 读取applicationContext.xml配置文件
  2. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. // 获取UserDao
  4. UserDao userDao = applicationContext.getBean(UserDao.class);
  5. // 调用方法
  6. userDao.getUser();

:如果同一个接口类型下有多个对象实例,会报错
原因是不能找到一个唯一的UserDao的实现类对象

c、通过指定id和类型获取对象的实例

  1. // 读取applicationContext.xml配置文件
  2. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. // 获取UserDao
  4. UserDao userDao = applicationContext.getBean("userDao",UserDao.class);
  5. // 调用方法
  6. userDao.getUser();

五、Spring配置文件

1、Bean标签配置

a、相关属性

  1. id:在ioc容器中的唯一标识
  2. class:创建对象实例的全路径名
  3. scope:声明对象的作用范围
  4. singleton:单例对象(默认)
  5. prototype:多例对象
  6. init-method:在对象创建时,执行此方法
  7. destroy-method:在对象销毁时,执行此方法
  8. 扩展:
  9. scope取值:request-->web项目中,Spring创建一个Bean的对象, 将对象存在request
  10. session-->web项目中,Spring创建一个Bean的对象, 将对象存在session
  11. globalSession-->(用于分布式web开发)创建实例绑定全局Session对象

b、作用范围

主要是针对scope属性来讲解Bean的使用范围

  1. singleton:单例对象
  2. * 何时创建?
  3. ioc容器初始化时,创建对象
  4. * 对象何时运行?
  5. 还要ioc容器在,对象就一直在
  6. * 何时销毁?
  7. ioc容器关闭时,销毁对象
  1. prototype:多例对象
  2. * 何时创建?
  3. 在调用getBean()方法时,创建
  4. * 对象运行?
  5. 一直使用就一直活着
  6. * 何时销毁?
  7. 当对象不再使用后,根据JVM GC机制垃圾回收

c、生命周期

  1. init-method destroy-method的使用
  2. 单例(默认)
  3. 在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行
  4. 创建destroy方法:destory-method属性指向该方法,对象销毁(close)时执行
  5. 多例(scope="prototype"
  6. 在相应的实现类创建init方法:init-method属性指向该方法,对象创建时执行
  7. 创建destroy方法:destory-method属性指向该方法,什么时候销毁由JVM决定

2、创建对象的三种方式

a、无参构造

Spring框架,默认使用无参构造方法,进行创建对象,如果没有提供无参则构建对象失败!!!

b、工厂静态方法【了解】

c、工厂普通方法【了解】

六、依赖注入

DI:依赖注入,Dependency Iniection的缩写
指Spring创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设置给该对象
就是给对象中的成员进行赋值操作

相关坐标:

  1. <dependencies>
  2. <!--spring的核心坐标-->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-context</artifactId>
  6. <version>5.1.5.RELEASE</version>
  7. </dependency>
  8. <!--junit-->
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.12</version>
  13. </dependency>
  14. </dependencies>
  15. <build>
  16. <plugins>
  17. <!-- 设置编译版本为1.8 -->
  18. <plugin>
  19. <groupId>org.apache.maven.plugins</groupId>
  20. <artifactId>maven-compiler-plugin</artifactId>
  21. <version>3.1</version>
  22. <configuration>
  23. <source>1.8</source>
  24. <target>1.8</target>
  25. <encoding>UTF-8</encoding>
  26. </configuration>
  27. </plugin>
  28. </plugins>
  29. </build>

1、依赖注入方式

a、构造方法注入

在bean标签中提供了一个子标签来完成构造方法的注入
方式一:一个参数

  1. name :构造方法参数名称
  2. value :简单数据类型(Stringintdouble
  3. ref :引用数据类型(从ioc容器中获取的对象)
  4. <bean id="接口名" class="实现类的全路径">
  5. <constructor-arg name="参数名" value="简单数据类型参数" ></constructor-arg>
  6. </bean>
  7. <bean id="接口名" class="实现类的全路径">
  8. <constructor-arg name="参数名" ref="引用数据类型参数名" ></constructor-arg>
  9. </bean>

方式二:多个参数(索引从0开始)【了解】

  1. index :构造方法参数的索引
  2. type :该索引对应的java类型(全路径名)
  3. value :简单数据类型
  4. ref :引用数据类型
  5. <bean id="接口名" class="实现类的全路径">
  6. <constructor-arg index="0" type="引用参数的全路径" ref="引用参数名"></constructor-arg>
  7. <constructor-arg index="1" type="简单数据类型" value="简单数据类型参数"></constructor-arg>
  8. </bean>

b、set方法注入

在接口实现类中提供set方法
使用set方法注入,在bean标签下提供了一个子标签

  1. name set方法的属性名
  2. value :简单数据类型
  3. ref :引用数据类型

c、P命名空间注入

引入p命名约束

  1. xmlns:p="http://www.springframework.org/schema/p"

bean标签中提供属性:p:接口名-ref=”引用数据类型”;p:接口名-value=”引用数据类型”;

2、依赖注入的数据类型

a、注入实体类

  1. <bean id="实体类" class="实体类的全路径">
  2. <property name="username" value="zhangsan"/>
  3. <property name="age" value= "13"/>
  4. </bean>

b、注入引用类型

依赖注入方式

c、注入集合类型

单列集合注入:

  1. <!--注入List集合-->
  2. <property name="list">
  3. <list>
  4. <value>张三</value>
  5. <value>李四</value>
  6. <value>王五</value>
  7. </list>
  8. </property>
  9. <!--注入Set集合-->
  10. <property name="set">
  11. <set>
  12. <value>古力娜扎</value>
  13. <value>玛尔扎哈</value>
  14. <value>撒有哪啦</value>
  15. </set>
  16. </property>
  17. <!--注入Array数组-->
  18. <property name="array">
  19. <array>
  20. <value>马蓉</value>
  21. <value>陶吉吉</value>
  22. <value>宋吉吉</value>
  23. </array>
  24. </property>

双列集合注入:

  1. <!-- Map集合 -->
  2. <property name="map">
  3. <map>
  4. <entry key="m1" value="v1"></entry>
  5. <entry key="m2" value="v2"></entry>
  6. <entry key="m3" value="v3"></entry>
  7. </map>
  8. </property>
  9. <!-- Properties集合 -->
  10. <property name="prop">
  11. <props>
  12. <prop key="p1">v1</prop>
  13. <prop key="p2">v2</prop>
  14. <prop key="p3">v3</prop>
  15. </props>
  16. </property>

七、模块化配置文件

1、applicationContext-dao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <!--
  8. 只配置dao层实现类
  9. -->
  10. <bean id="userDao" class="com.itfxp.dao.impl.UserDaoImpl"></bean>
  11. </beans>

2、applicationContext-service.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. <!--
  8. 配置service层的实现类
  9. -->
  10. <bean id="userService" class="com.itfxp.service.impl.UserServiceImpl">
  11. <property name="userDao" ref="userDao"/>
  12. </bean>
  13. </beans>

总、applicationContext.xml

  1. <!--
  2. 加载从配置文件
  3. -->
  4. <import resource="classpath:applicationContext-dao.xml"></import>
  5. <import resource="classpath:applicationContext-service.xml"></import>