本系列文章为狂神说 Java 视频的课堂笔记,若有需要可配套视频学习。
1.Spring 简介
-
Spring 框架以 interface 21 框架为基础,于 2004 年 3 月 24 日,发布了 1.0 正式版。
-
Rod Johnson 是 Spring Framework 创始人,他在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位, 回到软件开发领域之前,他还获得了音乐学的博士学位。
-
Spring 理念:整合了现有的技术框架,使现有的技术更加容易使用。
- SSH:Struct 2 + Spring + Hibernate
- SSM:SpringMVC + Spring + Mybatis
-
下载地址
-
优点
- Spring 是一个开源免费的框架(容器)。
- Spring 是一个轻量级、非入侵式(不影响原来的代码)的框架。
- 总结一句话:Spring 就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
-
组成
2. IOC 理论推导
2.1 早期业务逻辑实现
-
dao 层(模型层)
-
UserDao.interface
public interface UserDao { void getUser(); }
-
UserDaoImpl.class
//默认实现类 public class UserDaoImpl implements UserDao { public void getUser(){ System.out.println("默认获取用户的数据"); } }
-
UserDaoMysqlImpl.class
//Mysql实现类 public class UserDaoMysqlImpl implements UserDao { public void getUser() { System.out.println("Mysql获取用户的数据"); } }
-
-
service 层(业务实现层)
-
UserService.interface
public interface UserService { void getUser(); }
-
UserServiceImpl.class
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); public void getUser() { userDao.getUser(); } }
-
-
user 层(用户层)
public static void main(String[] args) { //用户实际调用的是业务层,Dao层不需要接触 UserService userService = new UserServiceImpl(); userService.getUser(); }
-
以上示例中
user
层只能调用UserDaoImpl.class
,因为UserServiceImpl.class
中将userDao
固定(new
)为了UserDaoImpl
类。 -
如果想调用
UserDaoMysqlImpl.class
,需将UserServiceImpl.class
中的userDao
固定(new
)为UserDaoMysqlImpl
类。 -
如上所示,早期业务实现,需求的改变会导致源码的改动。若代码量庞大,修改的成本很高。
2.2 业务模式修改
-
在
UserServiceImpl.class
中实现set接口private UserDao userDao; //利用set方法进行动态实现值得注入! public void setUserDao(UserDao userDao) { this.userDao = userDao; }
-
在用户层进行如下调用
((UserServiceImpl) userService).setUserDao(new UserDaoImpl()); ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
-
思维转变
- 早期业务逻辑,程序是在业务实现层主动创建对象,主动权在程序员手上,需要程序员修改业务实现层的代码。
- 使用了
set
注入后,程序不再具有主动性,而是变成了被动的接收对象。主动权在用户,由用户在用户层直接创建相应对象即可。
-
这种思想,从本质上解决了问题,程序员不用再去管理对象的创建。系统的耦合性大大降低,可以更加专注的在业务的实现上。这是 IOC的 原形。
-
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是 Ioc 容器,其实现方法是依赖注入(Dependency Injection,DI)。
2.3 IOC 实现
-
创建 Maven 项目
-
resources\beans.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 用 Spring 创建对象,Spring 中都称为 Bean 类型 变量名 = new 类型(); Hello hello = new Hello(); id:变量名 class:类型全路径 property:对象属性赋值 --> <bean id="imp" class="com.why.dao.UserDaoImpl"/> <bean id="sqlImpl" class="com.why.dao.UserDaoMysqlImpl"/> <bean id="userServiceImpl" class="com.why.service.UserServiceImpl"> <!-- value: 赋具体的值 ref: 引用 Spring 容器中创建好的的对象 --> <property name="userDao" ref="sqlImpl"/> </bean> </beans>
-
dao 层保持不变
-
service 层保持不变
-
user 层
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl"); //调用 Mysql 业务实现 userServiceImpl.getUser(); }
-
如上所示,需求的改动将不会对源码造成影响,只需在
.xml
文件中更改配置即可。比如,要调用默认业务实现,只需将.xml
文件中的<property name="userDao" ref="userDaoMysqlImpl"/>
的ref
属性更改为userDaoImp
即可。 -
值得注意的是,依赖注入是基于
set
方法实现的,也就是说使用Spring
给对象属性赋值,对象的类中必须含有set
方法。 -
总的来说,IOC 就是对象由 Spring 创建、管理和装配。
3. Spring 常用配置
-
alias(别名):给配置好的对象取个别名,获取对象时可使用此别名获取。
<alias name="user" alias="userNew"/>
-
bean
- id :
bean
的唯一标识符,相当于对象名。 - class :
bean
对象所对应的全限定名(包名 + 类名)。 - name : 为
id
取别名,可取多个,使用,
、空格
或;
等常用分隔符隔开。
- id :
-
import :合并其他配置文件,便于管理。
-
applicationContext.xml (总配置文件)
<import resource="beans1.xml"/> <import resource="beans2.xml"/> ...
-
4. 参考资料
[1] 佚名. Core Technologies[EB/OL]. https://docs.spring.io/spring-framework/docs/current/reference/html/core.html, ???-??-??/2021-04-08.