Spring-基础知识
一. 简介
Spring 解决的是业务逻辑层与其他层的松耦合问题,将面向接口的思想贯穿整个系统应用。也有人称为粘合剂,用于粘合其余别的层的框架。
web程序开发分层一般如下:
- web层: apache struts1, apache struts2(xwork), springmvc
- service层:spring
- dao/mapper/repositorey层:jdbc,DbUtils,mybatis,springdata
- SpringBoot 不属于任何一层,是搭建项目基础平台的框架,提倡 0配置,不写xml文件。用java形式运行javaweb项目
1.1 优点
Spring 的出现解决了 JaveEE 的实际问题
- 方便解耦(高内聚、低耦合):Spring 是一个超级工厂(超级容器),可以将对象的创建和依赖关系交给 Spring工厂 去管理
- AOP编程:Spring 提供面向切面编程(底层是动态代理),可以方便的对程序进行运行监控,权限验证等操作
- 声明事务:只需要通过配置就完成对事务的管理,无需手动编程
- 方便测试:Spring支持junit4,可以使用Spring注解方式测试程序
- 方便集成各种框架
- 降低JaveEE API的使用难度
1.2 核心技术
IOC(Inverse of Control) 控制反转:将对象的创建权力交给Spring工厂进行管理
AOP(Aspect Oriented Programming) 面向切面编程:基于动态代理的功能增强方式
二. IOC技术
2.1 搭建环境
在idea中选择maven方式构建项目,在pom.xml文件中导入Spring
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.20.RELEASE</version>
</dependency>
2.2 IOC概念
IOC是一种设计思想。
- 举例:传统编程使用某个类,会创建对象然后调用方法。
- 存在问题:当前代码与 new 出来的对象紧密绑定,如果程序进一步升级,那就比较麻烦。(web 创建service对象,service创建dao对象,三层严重耦合在一起)
- 常见操作:在 service层 创建 dao层 对象,调用其中方法
- IOC思想:将对象的创建与维护交给Spring框架,自己书写的代码仅仅只需向 Spring 框架索要对应的对象使用即可。无需关心如何创建对象,对象的生命周期
- 控制反转:将对象的创建、维护、销毁权力交给 IOC容器,前提是需要告诉 IOC容器 应该维护哪些对象,需要通过 xml 或者注解的方式告诉Spring。学习Spring的核心在于学习如何配置
2.3 IOC快速入门
我们创建一个最基本的web例子,仅包含service层、dao层、pojo类,
文件结构如下:
其中书写代码如下:
配置pom.xml如下,主要是配置Spring和junit
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.20.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
其中书写代码如下:
pojo类:
public class User {
}
dao层:
public class UserDao {
public void addUser(User user) {
System.out.println("将user添加入数据库");
}
}
service层:
public class UserService {
private UserDao dao;
public void setDao(UserDao dao) {
this.dao = dao;
}
public void addUser(User user){
dao.addUser(user);
}
}
以上代码是简化的web流程,由service调用Dao, Dao操作数据库。
接下来配置Spring配置文件,文件名:applicationContext.xml。通过配置的方式告诉Spring需要管理那些类
<?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">
<!--
在Spring框架中,任何类均为JavaBean,只要需要它管理的类,均为bean,
使用xml进行配置时,都应该使用bean标签进行配置
id属性/name属性:用来给当前管理的bean起名,将来在程序中通过id/name的值进行
class属性:需要呗管理的类
-->
<bean id="userDao" class = "org.buaa.dao.UserDao" ></bean>
<bean id="userService" class="org.buaa.service.UserService">
<property name="dao" ref="userDao" />
</bean>
</beans>
正式使用Spring
public class SpringTest {
@Test
public void testAddUser(){
// 1.获取Spring的核心对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.向Spring容器要我们想使用的UserService对象
UserService userService = (UserService) context.getBean("userService");// getBean返回值为Object,需要向下强制转换类型
// 3.通过对象调用方法
userService.addUser(null);// 打印结果: 将user添加入数据库
}
}
2.4 DI依赖注入
DI:Dependency Injection。 IOC 和 DI 本质是一回事,只是不同角度说明问题。在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。简而言之:可以将一个bean对象动态嵌入到另一个bean中
举例:service层使用dao层对象,无论时service层的类还是dao的类都交给Spring容器创建和维护。那么Service层的bean中就可以之间将dao层的bean注入到其中。而无需再service层的代码中再从Spring容器获取dao层的bean。
DI和IOC区别IOC更强调对象的创建、维护、销毁等管理;DI更强调对象彼此间的依赖关系
这段配置中,就是告诉Spring,UserService需要UserDao,这就是一个依赖关系
<bean id="userDao" class = "org.buaa.dao.UserDao" ></bean>
<bean id="userService" class="org.buaa.service.UserService">
<property name="dao" ref="userDao" />
</bean>
DI前提需要提供依赖对象的set方法。如下:
public class UserService {
private UserDao dao;
// 需要有这个set方法
public void setDao(UserDao dao) {
this.dao = dao;
}
...
}