Spring
1.1 Spring简介
- spring:春天,给整个java开发带来了春天
- 2002,Spring首次推出了Spring框架的雏形:interface21
- Rod Johnson,他是Spring创始人
- Spring:说白了,就是一个大杂烩,整合了现有的技术框架
1.2 Spring优点
- Spring是一个免费的框架
- Spring是一个轻量级的,非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对整合的框架支持
IOC理论推导
控制反转是一种通过描述(XML或注解),并通过第三方法生产或者获取特定对象的方式,在Spring中实习控制反转的是IOC容器,实现方法是依赖注入(Dependency Injection ,DI)
1.1 maven导入相关依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.14</version>
</dependency>`
为什么选择webmvc
,因为它包含的依赖包比较全面🤪;
1.2 聊一下最开始写业务的顺序
- 先写Dao层接口
package com.j.dao;
/**
* Created by jdx on 2022/1/3 下午7:03
*/
public interface BookDao {
/**
* @return void
* @description 定义获取书籍的方法
* @author create by JDX
* @date 2022/1/3 下午7:06
*/
void getBook();
}
- 在写Dao的实现类
package com.j.dao;
/**
* Created by jdx on 2022/1/3 下午7:07
*/
public class BookDaoImpl implements BookDao {
/**
* @return void
* @description : getBook 实现类
* @author create by JDX
* @date 2022/1/3 下午7:07
*/
@Override
public void getBook() {
System.out.println("获取默认书籍!!!");
}
}
3.然后在写Service
package com.j.service;
/**
* Created by jdx on 2022/1/3 下午7:09
*/
public interface BookService {
/**
* @return void
* @description 定义service接口
* @author create by JDX
* @date 2022/1/3 下午7:10
*/
void getBook();
}
- 在写一下service实现类
package com.j.service;
import com.j.dao.BookDao;
import com.j.dao.BookDaoImpl;
/**
* Created by jdx on 2022/1/3 下午7:10
*/
public class BookServiceImpl implements BookService {
//引入Dao层
BookDao bookDao = new BookDaoImpl();
/**
* @return void
* @description 实现 getBook 方法
* @author create by JDX
* @date 2022/1/3 下午7:11
*/
@Override
public void getBook() {
bookDao.getBook();
}
}
接下来在写一下测试类
import com.j.service.BookService;
import com.j.service.BookServiceImpl;
/**
* Created by jdx on 2022/1/3 下午7:18
*/
public class noIoc {
public static void main(String[] args) {
BookService bookService = new BookServiceImpl();
bookService.getBook();
}
}
输出结果如下:
获取默认书籍!!!
那么在这里,我们就得想一想,如果我们按照最原始的逻辑去编写代码,那么在这个编写过程中会是否会遇到以下这个问题。
- 当客户提出我不要固定书籍了,我要从Mysql数据库里面输出,那么我们就得修改Dao层数据实现类,如下所示
//修改Dao实现类
public void getBook() {
System.out.println("获取Mysql默认书籍!!!");
}
输出结果为:
获取Mysql默认书籍!!!
目前为止,我们代码量少,还不会有太大的影响,好像也会觉得改几行代码的事情,可是你要想到,你这个项目会交给git管理,你经常改代码或许造成代码冲突,这个时候那就美滋滋了🙄 这是其一。其二,你如果在面对客户的时候需求的改变量是巨大的,这是没有办法避免的事情,甲方爸爸不是白叫的,你修改代码将会导致团队开发中陆陆续续出现各种小问题。
- 既然发现了问题所在,那么来看解决方法,我们使用一个set方法实现动态值的注入,如下:
package com.j.service;
import com.j.dao.BookDao;
/**
* Created by jdx on 2022/1/3 下午7:10
*/
public class BookServiceImpl implements BookService {
//引入Dao层
public BookDao bookDao;
//在这里编写set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
/**
* @return void
* @description 实现 getBook 方法
* @author create by JDX
* @date 2022/1/3 下午7:11
*/
@Override
public void getBook() {
bookDao.getBook();
}
}
看完上述代码,或许不难发现,本次修改使用set接口实现,从代码本质上发生了革命性的变化。原因有如下俩点:
- 最开始,程序是主动创建对象!控制权在程序员的手上。
- 使用了set注入之后,程序就变成了被动的接受对象了。
这种思想,从本质上解决了问题,我们基本上不用在去管理对象的创建了,系统的耦合性大大的降低。这种思想贯穿了IOC,也可称之为IOC的原型。