Spring学习总结(一)

Spring,Spring MVC,Spring Boot 之间什么关系?

Spring 是一款开源的轻量级 Java 开发框架,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、Spring jdbc等。

Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

Spring Boot是一个基于Spring框架的快速应用程序开发框架,提供了自动配置和快速启动的能力。它能够根据应用程序的需求,自动配置许多常见功能和服务,例如数据库、缓存、安全性和应用程序监控等方面。Spring Boot是一个快速开发的选择,它可以帮助开发人员更快速和更高效地构建应用程序。

因此,Spring、Spring MVC和Spring Boot之间的关系可以简单概括为:Spring框架是整个堆栈的基础,Spring MVC是Spring框架的一个模块,用于开发Web应用程序,而Spring Boot建立在Spring框架之上,提供了快速应用程序开发的能力。

介绍一下Spring IoC

Spring框架的控制反转(IoC)是核心之一。控制反转是一种设计模式,其中对象的创建、组装和管理工作由一个外部调用者来完成,而不是由对象自己或手动编写的代码来完成。

在Spring中,控制反转的实现方式是IoC容器。IoC容器会负责创建和管理对象,将对象之间的依赖关系组装起来,并将其提供给需要它们的位置。在IoC容器中,对象本身不需要知道其依赖项如何被创建或提供。

Spring的IoC容器提供了两种主要的实现:BeanFactory和ApplicationContext。BeanFactory是Spring的低级IoC容器,可以加载配置文件中定义的bean,并在需要时实例化它们。而ApplicationContext是更高级的容器,除了具有BeanFactory的所有功能外,还提供了许多增强功能,例如消息源和事件发布。

Spring IoC的优点包括:

  1. 降低组件之间的耦合度:IoC容器将创建对象和对象之间的依赖关系的责任分离,使应用程序中的不同组件之间的耦合度降低。

  2. 更容易的测试:IoC容器可以更容易地进行单元测试和集成测试,因为对象之间的依赖关系可以通过模拟或替换来管理。

  3. 更容易的代码管理:IoC使得代码更易于管理和维护,因为依赖关系是通过配置文件定义的,可以在不改变底层代码的情况下更改应用程序的行为。

除了上述优点之外,Spring的IoC容器还可以提供统一的异常处理、AOP和事务管理等服务,以通过集成和修改IoC容器来满足应用程序的需求。通过掌握Spring IoC容器的概念和用法,可以更好地构建可维护和可扩展的应用程序。

降低组件之间的耦合度

使用IoC容器来管理这两个类之间的依赖关系,可以使这两个类之间的耦合度降低,提高了代码的可维护性和可扩展性。

具体来说,如果服务类直接实例化Dao类,那么服务类与Dao类之间是紧密耦合的,服务类需要了解Dao类的实现细节和接口。因此,如果后续需要更换底层数据库或更改Dao类的实现细节,就需要修改服务类的代码。这样会造成代码的修改范围变大,耗费更多的时间和精力。

如果使用IoC容器,则可以通过容器来构建服务类和Dao类之间的依赖关系。容器负责实例化Dao类,并将Dao对象的引用注入到服务类中,服务类只需要声明需要依赖Dao类即可。这样服务类与Dao类之间的耦合度降低了,无需了解Dao类的实现细节和接口。如果需要更换底层数据库或更改Dao类的实现细节,只需要在IoC容器中修改依赖关系即可,不需要修改服务类的代码,从而减小了代码修改的风险和代价。

因此,使用IoC容器来管理对象依赖关系,可以提高代码的可维护性和可扩展性,使代码更加健壮和灵活。

Ioc容器是什么

IoC(Inversion of Control)容器是一个编程框架,在该框架中,对象的创建和依赖性的解决不再由程序员来完成,而是由IoC容器来完成。在IoC容器中,程序员只需要提供所需的类(或对象)信息,容器就会负责实例化对象,并且将依赖注入到调用者中,从而达到对象间松散耦合的目的。

在Spring框架中,IoC容器就是负责管理对象的创建、依赖关系的维护和生命周期的管理。Spring框架提供了两种主要的IoC容器实现:BeanFactory和ApplicationContext。

一般而言,IoC容器分为三层,分别是BeanDefinition解析层、BeanFactory容器层和ApplicationContext容器层。BeanDefinition解析层是解析配置文件并生成BeanDefinition的过程,BeanFactory容器层是真正的IoC容器,ApplicationContext容器层则是对BeanFactory的增强和扩展。

IoC容器可以根据生命周期接口进行管理和控制,比如说BeanFactory中的BeanPostProcessor接口, InitializingBean接口和DisposableBean接口。同时,IoC容器还支持自动装配、AOP、事务控制、远程调用等功能,大大提高了编程的灵活性和开发效率。

依赖注入

依赖注入(Dependency Injection,简称DI)是IoC容器的一种实现方式,它将创建对象和对象之间的依赖关系的责任从应用程序代码中移动到容器中,在运行时动态地将依赖关系注入到需要它们的对象中。

依赖注入分为三种:

  1. 构造函数注入(Constructor Injection):通过构造方法将依赖注入。

  2. 属性注入(Setter Injection):通过Setter方法将依赖注入。

  3. 接口注入(Interface Injection):通过类实现接口,将依赖注入。

举个例子,假设我们有一个服务类OrderService,它需要依赖一个Dao类OrderDao来实现保存订单的功能。通过依赖注入,我们可以在运行时从IoC容器中获取OrderDao的实例,并将它注入到OrderService中,使得OrderService能够方便地调用OrderDao的方法。

构造函数注入示例代码:

public class OrderService {
    private OrderDao orderDao;

    public OrderService(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void saveOrder(Order order) {
        orderDao.saveOrder(order);
    }
}

// 在 IoC 容器中配置 Bean 对象
@Bean
public OrderService orderService(OrderDao orderDao) {
    return new OrderService(orderDao);
}

属性注入示例代码:

public class OrderService {
    private OrderDao orderDao;

    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    public void saveOrder(Order order) {
        orderDao.saveOrder(order);
    }
}

// 在 IoC 容器中配置 Bean 对象
@Bean
public OrderService orderService() {
    return new OrderService();
}

@Bean
public OrderDao orderDao() {
    return new OrderDao();
}

// 在容器启动后,调用 orderService 的 setOrderDao 方法注入依赖
OrderService orderService = applicationContext.getBean(OrderService.class);
OrderDao orderDao = applicationContext.getBean(OrderDao.class);
orderService.setOrderDao(orderDao);

接口注入示例代码:

public interface OrderDao {
    void saveOrder(Order order);
}

public class OrderDaoImpl implements OrderDao {
    public void saveOrder(Order order) {
        // 实现保存订单的逻辑
    }
}

public class OrderService implements OrderDaoAware {
    private OrderDao orderDao;

    public void saveOrder(Order order) {
        orderDao.saveOrder(order);
    }

    @Override
    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }
}

// 在 IoC 容器中配置 Bean 对象
@Bean
public OrderService orderService() {
    return new OrderService();
}

@Bean
public OrderDao orderDao() {
    return new OrderDaoImpl();
}

// 在容器启动后,调用 orderService 的 setOrderDao 方法注入依赖
OrderService orderService = applicationContext.getBean(OrderService.class);
OrderDao orderDao = applicationContext.getBean(OrderDao.class);
orderService.setOrderDao(orderDao);

在上述示例代码中,我们通过实现接口OrderDaoAware来实现接口注入,OrderService类实现这个接口,并在其中定义了setOrderDao方法。在IoC容器中配置OrderDao和OrderService对象,并在容器启动后,通过调用setOrderDao方法将OrderDao对象注入到OrderService对象中。

总之,依赖注入是IoC容器的一种实现方式,可以帮助我们更好地管理对象之间的依赖关系,并使代码更加灵活和可维护。通过构造函数注入、属性注入和接口注入三种方式,可以满足不同的需求场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上阡陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值