Spring简介
Spring是什么
- Spring 自带 IoC(Inverse of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持RESTful Java 应用程序的开发。
- Spring 最核心的思想就是不重新造轮子,开箱即用!
- Spring 提供的核心功能主要是 IoC 和 AOP。学习 Spring ,一定要把 IoC 和 AOP 的核心思想搞懂!
Spring优势
Spring的体系结构
下图对应的是 Spring4.x 版本。目前最新的 5.x 版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。
Spring Core
核心模块, Spring 其他所有的功能基本都需要依赖于该类库,主要提供 IoC 依赖注入功能的支持。
Spring Aspects
该模块为与 AspectJ 的集成提供支持。
Spring AOP
提供了面向切面的编程实现。
Spring Data Access/Integration :
Spring Data Access/Integration 由 5 个模块组成:
spring-jdbc : 提供了对数据库访问的抽象 JDBC。不同的数据库都有自己独立的 API 用于操作数据库,而 Java 程序只需要和 JDBC API 交互,这样就屏蔽了数据库的影响。
spring-tx : 提供对事务的支持。
spring-orm : 提供对 Hibernate 等 ORM 框架的支持。
spring-oxm : 提供对 Castor 等 OXM 框架的支持。
spring-jms : Java 消息服务。
Spring Web
Spring Web 由 4 个模块组成:
spring-web :对 Web 功能的实现提供一些最基础的支持。
spring-webmvc : 提供对 Spring MVC 的实现。
spring-websocket : 提供了对 WebSocket 的支持,WebSocket 可以让客户端和服务端进行双向通信。
spring-webflux :提供对 WebFlux 的支持。WebFlux 是 Spring Framework 5.0 中引入的新的响应式框架。与 Spring MVC 不同,它不需要 Servlet API,是完全异步.
Spring Test
Spring 团队提倡测试驱动开发(TDD)。有了控制反转 (IoC)的帮助,单元测试和集成测试变得更简单。
Spring 的测试模块对 JUnit(单元测试框架)、TestNG(类似 JUnit)、Mockito(主要用来 Mock 对象)、PowerMock(解决 Mockito 的问题比如无法模拟 final, static, private 方法)等等常用的测试框架支持的都比较好。
Spring快速入门
Spring程序开发步骤
- 导入 Spring 开发的基本包坐标,我们基于mevan开发所以需要导入meaven对应的jar/war包。
- 因为我们需要获得UserDao对象,所以我们需要编写 Dao 接口和实现类。
- 创建 Spring 核心配置文件。
- 在 Spring 配置文件中配置 UserDaoImp。配置id标识及其对应的类路径。
- 使用 Spring 的 API 获得 Bean 实例,通过id标识去获得对象而不是自己去创建一个对象。
导入Spring开发的基本包坐标
pom文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Spring</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
编写Dao接口和实现类
接口类
package com.peihj.dao;
public interface Usedao {
public void save();
}
接口方法复写实现
package com.peihj.dao.impl;
import com.peihj.dao.Usedao;
import com.peihj.domain.User;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class UseDaoimpl implements Usedao {
public UseDaoimpl() {
System.out.println("UseDaoimpl_创建");
}
@Override
public void save() {
System.out.println(username+"的年龄是:"+age);
System.out.println("save running......");
}
}
创建Spring核心配置文件
在类路径下(resources)创建applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
在Spring配置文件中配置UserDaoImpl
id是唯一标识,不可以重复
<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.peihj.dao.impl.UseDaoimpl" ></bean>
</beans>
使用Spring的API获得Bean实例
package com.peihj.test;
import com.peihj.dao.Usedao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Springtest {
@Test
public void test(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Usedao userDao1 = (Usedao) app.getBean("userDao");
System.out.println(userDao1);
userDao1.save();
}
}
Spring配置文件
Bean标签基本配置
Bean标签范围配置
测试脚本如下:
package com.peihj.test;
import com.peihj.dao.Usedao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Springtest {
@Test
public void test(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Usedao userDao1 = (Usedao) app.getBean("userDao");
Usedao userDao2 = (Usedao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
测试singleton:
通过观察结果我们可以发现,结果的地址是没变的,即说明在Spring容器中的bean存在一个,
测试prototype:
地址不一样代表容器中的userdao不是一个,即有多个bean
bean生命周期配置
我们需要提前在dao包下的userdaoimpl,写init初始化方法与destory方法
然后我们进入applicationContext.xml(main包下的resource中Spring配置文件)
<bean id="userDao" class="com.peihj.dao.impl.UseDaoimpl" init-method="init" destroy-method="destory"></bean>
Bean实例化三种方式
singleton:无参构造器执行一次的时候应该是加载配置文件,创建Spring容器时候,就创建了。
prototype:每次getbean的时候创建一个。
因为这个是静态方法,所以xml配置文件直接调用即可
- 顾名思义,我们必须要有工厂,然后工厂还要有静态方法,因为类型是UserDao,所以我们需要返回一个对象;
- 第二部需要进入配置文件,配置id和class,这里是找工厂的无参构造器,显然不对,所以我们需要将其在添加一个factory-method,指定方法,通过静态工厂找到dao下面的UserDaoImpl实现类,从而达到对象的创建。
因为这个是动态方法,所以xml配置文件无法对其进行直接调用,需要先有工厂对象然后再调用方法,所以Spring对象先通过无参构造创建一个工厂对象,但是我们的目的不是为了创建工厂,我们需要在创建一个userdao对象,通过工厂的方法指向factorybean,然后获得对象
Bean的依赖注入入门
创建 UserService,UserService 内部在调用 UserDao的save() 方法
将 UserServiceImpl 的创建权交给 Spring
从 Spring 容器中获得 UserService 进行操作
Bean的依赖注入分析
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在
Spring容器中,将UserDao设置到UserService内部。
Bean的依赖注入概念
依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
Bean的依赖注入方式
怎么将UserDao怎样注入到UserService内部呢?
set方法注入:
在UserServiceImpl中添加setUserDao方法,我们不需要再去容器中获取userdao的值,因为容器已经将userdao通过set方法注入给我们了。所以userdao是有值的,我们可以通过容器中的userdao去调用save方法。
配置Spring容器调用set方法进行注入
简单注入方式:p命名空间注入:
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
首先,需要引入P命名空间:
其次,需要修改注入方式:
构造方法注入,创建有参构造:
构造方法注入,配置Spring容器调用有参构造时进行注入:
Bean的依赖注入的数据类型
上面的操作,都是注入的引用Bean,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入
普通数据类型的注入
普通数据类型的注入之Spring配置文件xml如何配置
集合数据类型(List)的注入
集合数据类型(List)的注入之Spring中xml文件如何配置
集合数据类型(List)的注入
集合数据类型(List)的注入之配置文件的XML配置
集合数据类型( Map<String,User> )的注入:
XML文件配置
集合数据类型(Properties)的注入
引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
小结
Spring的重点配置:
Spring相关API
ApplicationContext的继承体系
applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
ApplicationContext的实现类
getBean()方法使用
其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错。
小结
参考
https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=20&t=1.2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)