本系列文章为狂神说 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)的框架!
-
组成
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-it1cfQ7A-1617888342981)(E:\Program Files\Typora\files\Spring学习\image\Spring组成.png)]](https://i-blog.csdnimg.cn/blog_migrate/d4563d8b3940f90b7f965ba637d1ea12.png)
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.
Spring框架详解:IOC理论与实践
本文详细介绍了Spring框架的发展历程、核心理念及其实现。Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)框架,通过依赖注入降低了系统的耦合性。文中通过实例展示了如何通过XML配置实现IOC,使得业务逻辑的改动不再影响源代码,提高了代码的灵活性。此外,还提及了Spring的别名、导入其他配置文件等常用配置方式。
 控制反转(IOC)&spm=1001.2101.3001.5002&articleId=115532012&d=1&t=3&u=0a70c855c394479bbb4d34bc32e68304)
384

被折叠的 条评论
为什么被折叠?



