Spring--概述及IOC理论推导
Posted 眰恦ღ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring--概述及IOC理论推导相关的知识,希望对你有一定的参考价值。
本文根据狂神说哔哩哔哩教程笔记
spring简介
- Spring:轻量级框架,Java EE的春天,当前的主流框架,”一站式“的企业应用开发框架。
- 2002年,首次推出了Spring框架的雏形:interface21框架!
- Spring框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。
- Rod Johnson, Spring Framework创始人 ,著名作者。 很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
- Spring设计理念:Spring是面向Bean的编程,使现有的技术更加容易使用,本身是一个大杂烩。
spring官网:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html
GitHub下载地址:https://github.com/spring-projects/spring-framework
SSH:Struct2 + Spring + Hibernate!
SSM:SpringMVC + Spring + Mybatis! 我们要学的是这个!
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.3</version>
</dependency>
Spring的优点
- 开源的免费的框架(容器)!
- 轻量级的、非入侵式的框架!
- 两大核心技术:
- 控制反转(IOC:Inversion of Control) / 依赖注入(DI:Dependency Injection)
- 面向切面编程(AOP:Aspect Oriented Programming)
- 支持事务的处理,与第三方框架的良好整合.
- 独立于各种应用服务器。
- 依赖注入特性将组件关系透明化,降低了耦合度。
- 面向切面编程特性允许将通用任务进行集中式处理。
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
Spring的组成
1. Data Access/Integration(数据访问/集成)
数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。
- JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
- ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate 和 iBatis 提供了的集成层。
- OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
- JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。
- Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。
2. Web 模块
Spring 的 Web 层包括 Web、Servlet
- Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。
- Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。
- Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。
- Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。
3. Core Container(核心容器)
Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language 表达式语言模块组成,具体介绍如下。
- Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。
- Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
- Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块的焦点。
- Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。
4. 其他模块
Spring的其他模块还有 AOP、Aspects、Instrumentation 以及 Test 模块,具体介绍如下。
- AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
- Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
- Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
- Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。
拓展
现代化的java开发!就是基于Spring开发!
Spring Boot与Spring Cloud
- Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务;
- Spring Cloud是基于Spring Boot实现的;
- Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
- Spring Boot使用了约束优于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置 , Spring Cloud很大的一部分是基于Spring Boot来实现,Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
- SpringBoot在SpringClound中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。
现在大多数公司都在使用SpringBoot进行快速开法,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC!承上启下的作用!
弊端:发展太久了以后,违背了原来的理念!配置十分繁琐,人称“配置地狱!”
IOC理论推导
新建一个Maven项目,导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
</dependencies>
导入这个包的好处是,它会附带spring的很多依赖,否则就得一个一个导
1、UserDao接口
public interface UserDao
void getUser();
2、UserDaoImpl实现类
public class UserDaoImpl implements UserDao
@Override
public void getUser()
System.out.println("默认获取用户的数据");
3、UserService业务接口
public interface UserService
void getUser();
4、UserServiceImpl业务实现类
public class UserServiceImpl implements UserService
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser()
userDao.getUser();
5、测试
public class MyTest
public static void main(String[] args)
//用户实际调用的是业务层,dao层它们不需要接触!
UserService userService = new UserServiceImpl();
userService.getUser();
问题来了,现在增加一个mysql的实现类UserDaoIMysqlImpl
public class UserDaoIMysqlImpl implements UserDao
@Override
public void getUser()
System.out.println("Mysql获取用户数据");
用户想要用Mysql,你就要修改业务层了!
public class UserServiceImpl implements UserService
private UserDao userDao = new UserDaoIMysqlImpl();//改成mysql的实现类
@Override
public void getUser()
userDao.getUser();
那么用户现在又想用oracle了……你还得修改业务层代码
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!代码量十分大,修改一次的成本代价十分昂贵!
- 我们使用一个Set方法传入对象,已经发生了革命性的变化!
public class UserSerciceImpl implements UserService
private UserDao userDao;
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao)
this.userDao = userDao;
@Override
public void getUser()
userDao.getUser();
public static void main(String[] args)
//用户实际调用的是业务层,dao层它们不需要接触!
UserService userService = new UserSerciceImpl();
((UserSerciceImpl)userService).setUserDao(new UserDaoImpl());//用什么传什么对象
userService.getUser();
- 之前,程序是主动创建对象!控制权在程序员手上!
- 使用set注入之后,程序不再具有主动性,而是变成了被动的接受对象!
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统耦合性大大降低,可以更加专注在业务的实现上!这就是IOC的原型
IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
-
耦合的对象
-
解耦的过程
-
理想的系统
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
IOC文章 https://blog.csdn.net/liang5603/article/details/52002994
以上是关于Spring--概述及IOC理论推导的主要内容,如果未能解决你的问题,请参考以下文章