1.为什么要使用SpringBoot?
Spring框架出现的主要目的是降低代码耦合度。
举个例子,我们要实现一个商城的功能,我们需要创建三个类:controller(控制器,接受客户端请求并处理,用户在网页上操作,发送的HTTP请求就是由controller进行处理)、Service(业务逻辑层,主要实现业务功能,Controller接受请求后会调用Service层的方法来执行业务逻辑,例如说用户点击提交订单,controller接收到这个请求后,调用service层的功能去验证库存是否足够,再返回消息给controller。)Repository(数据层,直接与数据库等数据存储媒介交互,service层从repository层调用数据,repository提供数据访问的抽象接口,隐藏数据存储的具体细节)。
不使用Spring框架的话,我们会这样编写代码:
public class OrderController {
private OrderService orderService;
public OrderController() {
this.orderService = new OrderService(new OrderRepository()); // 手动创建依赖对象
}
public void createOrder(Order order) {
orderService.processOrder(order);
}
}
public class OrderService {
private OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public void processOrder(Order order) {
orderRepository.save(order);
}
}
public class OrderRepository {
public void save(Order order) {
// 保存订单到数据库
}
}
即在Controller中构建Service对象实现其功能,而Service又会构建Repository对象,这样代码的耦合度很高,如果我们需要修改repository对象,需要把controller、service中有关repository对象的地方都修改。
2.Spring框架如何解决这一问题?
上述问题用通俗易懂的例子来说就是,假设我们有一本书,书中内容是这样的:苹果[一种水果]种植在温带,苹果[一种水果]有很多品种,价格低廉的苹果[一种水果]深受大家的喜爱……
如果此时我想修改注释的内容为[一种红色的水果],需要修改每一处有注释的地方。
那么能不能够我把这一部分注释归类,修改一次,其他内容自动更新?
Spring框架做的就是这样的事。
先介绍一个概念:IOC,Inversion Of Control,控制反转:对象的创建控制权由程序自身转移到外部(容器)。也就是说我们不再由Controller中构建Service对象,而Service又构建Repository对象,我们将这一部分交给IOC容器来处理。这样,我们只需要在IOC容器中管理一个类,而不需要像原来那样修改了一个类要跟着修改依赖他的类。
第一步:将Service和Dao层的实现类交给IOC容器管理
在类上加@component 注解,就是把这个类放入IOC容器中。
第二步:为Controller和Service注入运行时依赖的对象
在成员变量(依赖的对象)上加上@Autowired 注解
@Component //OrderService类放入容器中,放入容器的类可以通过@Autowired进行依赖注入
public class OrderService {
@Autowired //注入OrderRepository类型的对象
private OrderService orderRepository;
这么做的好处是,如果我想更改Service类,我只需要把Service类上的Component注解给我修改后的新的Service类即可,当然,这两个Service类继承了同一接口OrderService。
这个过程称之为依赖注入,Dependency Injection,DI。而在IOC容器中创建、管理的对象,称之为Bean对象。