Sping基础篇----掌握Sping的控制反转/依赖注入的概念【实战案例总结】

在这里插入图片描述

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。


前言

本节我们来学习Sping是什么样的一个框架,介绍Spring框架支持包和相关文件的获取方式,并介绍其目录结构,学习这些知识是为使用Spring框架打好基础.


一、什么是Spring?

Java Spring,通常指的是Spring Framework,这是一个开放源代码的Java平台,广泛用于创建各种Java应用程序,尤其是企业级应用程序。Spring Framework是一个轻量级的控制反转(IoC)和面向切面的容器框架。

Spring Framework旨在简化Java开发,特别是通过以下方面:

  1. 依赖注入(DI):它允许你通过依赖注入的方式减少组件之间的耦合,组件不需要自己寻找或创建它们依赖的其他组件,而是由Spring容器注入所需要的组件。

  2. 面向切面编程(AOP):支持面向切面编程,可以将如安全、事务和日志等横切关注点与业务逻辑分离,提高代码的可维护性和可重用性。

  3. 抽象和事务管理:Spring提供了一整套事务管理接口,可以让你透明地进行声明式事务管理。

  4. MVC框架:Spring自带了一个MVC框架,用于创建Web应用程序。它是分层架构的并且集成了多种技术,如JSP、Freemarker、Velocity等。

  5. 各种辅助支持:Spring Framework提供了对JDBC、JPA、JMS、邮件发送等各种企业服务的抽象,这样开发者可以更容易地整合和使用这些技术。

总之,Spring Framework为Java开发者提供了一个全面的编程和配置模型,大大简化了Java应用的开发、部署和管理过程。此框架因其灵活性、强大的社区支持和不断的迭代更新而受到开发者的喜爱。随着时间的推移,Spring已经发展成一个全面的生态系统,包括Spring Boot、Spring Cloud等多个项目,都是为更快捷、更简单地开发分布式系统而设计的。

二、控制反转(IoC)和依赖注入(DI)

控制反转(IoC)和依赖注入(DI)是编程中用于实现解耦合(decoupling)的两个重要概念,它们通常在Spring Framework中得到广泛应用。

控制反转(IoC) 是一种设计原则,在这种设计中,对象的控制权从程序代码转移给一个容器或框架。传统的程序设计中,组件间的依赖关系通常由组件自己在内部控制和管理。而在IoC下,这种依赖关系的建立由外部容器控制。这意味着程序中的对象不需要自己创建或管理它们的依赖关系,这些都由IoC容器来处理。控制反转使得代码的管理更加容易,也使得应用程序更加模块化。

IoC可以通过多种方式实现,依赖注入只是实现IoC的手段之一。

依赖注入(DI) 是实现IoC的一种技术。DI的核心理念是,一个对象不应该负责创建或查找它依赖的对象。相反,这些依赖应当由外部通过某种方式提供给对象(即“注入”),常见的注入方式有构造器注入、设值器注入(setter injection)或接口注入。

依赖注入的好处包括但不限于:

  1. 降低耦合度:组件之间不直接创建彼此的实例,减少了耦合度,使得代码更容易修改和扩展。
  2. 增强模块化:每个组件都可以独立于其他组件被开发和测试。
  3. 提高测试性:依赖注入使得单元测试更易于执行,因为可以轻松地为一个组件注入测试期间所需的特定依赖。

在Spring框架中,IoC容器负责实例化、配置和组装对象,依赖注入是Spring实现这些任务的方式。Spring提供了基于XML配置文件和基于注解的两种主要的DI实现方式。通过使用Spring IoC容器,开发者可以更专注于业务逻辑的实现,而将对象生命周期管理和依赖关系的维护交给框架来处理。

三、依赖注入的实现方式有哪些?

依赖注入(Dependency Injection,简称DI)可以通过几种不同的方式实现。在Spring框架中,主要的实现方式包括:

  1. 构造器注入(Constructor Injection)
    在这种方式中,依赖项作为参数传递给构造器。当创建一个类的新实例时,Spring IoC容器调用包含依赖项的构造器,将所需的依赖项注入到类中。

    public class ExampleService {
        private final Dependency dependency;
    
        public ExampleService(Dependency dependency) {
            this.dependency = dependency;
        }
    }
    
  2. 设值器注入(Setter Injection)
    该方式通过类的设值器方法(setter methods)注入依赖项。这允许依赖项在对象被构造之后、被使用之前的任意时间点被注入。

    public class ExampleService {
        private Dependency dependency;
    
        public void setDependency(Dependency dependency) {
            this.dependency = dependency;
        }
    }
    
  3. 字段注入(Field Injection)
    通过在类的字段上直接设置依赖项来实现依赖注入。Spring框架通过反射机制来实现这一点,通常与@Autowired注解一同使用。

    public class ExampleService {
        @Autowired
        private Dependency dependency;
    }
    
  4. 方法注入(Method Injection)
    类似setter注入,但它可以是任何方法,而不仅仅是传统的setter方法。在某个方法的参数中声明依赖项,让Spring调用该方法并传入必要的参数。

    public class ExampleService {
        private Dependency dependency;
    
        @Autowired
        public void prepare(Dependency dependency) {
            this.dependency = dependency;
        }
    }
    
  5. 查找方法注入(Lookup Method Injection)
    这是一种特殊情况,主要用于当我们需要在单例bean中注入一个原型bean时。

  6. 接口注入(Interface Injection)
    这是一种更少见的依赖注入方式,其中一个组件(如一个类)提供一个接口,该接口用来注入依赖。

构造器注入和设值器(setter)注入是最为常见的依赖注入方式。构造器注入是更加不可变和避免了“部分构建”的对象,而设值器注入允许更多的灵活性,如可选和更改的依赖。字段注入简单但不推荐用于关键业务逻辑,因为它可能导致难以跟踪的依赖和困难的单元测试编写。考虑到这些约束,在选择注入方法时,应当根据具体情况和需求进行决策。

四、Spring核心容器

Spring 核心容器是Spring框架的基础部分,它提供了用于构建整个框架的基本功能。核心容器由几个主要的组建构成,主要负责管理对象(称为Bean)的生命周期和依赖注入。

Spring核心容器主要由以下四个模块组成:

  1. Spring Core(核心容器):这是框架的基础部分,提供了控制反转(IoC)和依赖注入(DI)的特性。在这里,BeanFactory是最主要的接口,它是一个先进的配置机制,能够管理任意类型的对象。

  2. Spring Context(应用上下文):它建立在Spring Core基础之上,能够访问Spring的核心功能。ApplicationContext接口是Context模块的焦点。它提供了比BeanFactory更丰富的功能,是BeanFactory的一个超集,能够支持国际化、事件传播、资源加载以及透明的创建上下文(如Web应用程序环境)。

  3. Spring AOP(面向切面编程):该模块提供了面向切面编程的实现,允许定义方法拦截和切点,从而实现解耦功能。这可以用来实现如事务管理和日志等跨越多个点的横切关注点。

  4. Spring Expression Language(SpEL):SpEL是一种强大的表达式语言,它支持在运行时查询和操作对象图。它可以用来动态查询对象图的状态或在对象图中进行配置。

Spring核心容器不仅负责IoC和DI,也提供了各种企业级应用服务的支持。利用核心容器,开发者可以定义对象的创建方式、装配它们的线索、配置它们的生命周期,以及管理它们的整个生命周期。

在核心容器之上,Spring框架还包括了数据访问/集成、Web、消息传递以及其他模块,这些模块构成了Spring的全面编程和配置模型。

五、实战案例

假设我们要创建一个简单的在线图书商店应用程序,我们将使用Spring框架来展示控制反转(IoC),依赖注入(DI),以及如何通过Spring核心容器来组织应用程序组件。

项目需求简述:

  • 用户能够浏览图书。
  • 用户可以将图书添加到购物车。
  • 用户可以进行结算。

实施步骤和概念应用:

  1. 设置工程环境:

    • 创建Maven或Gradle项目,并在项目的pom.xmlbuild.gradle文件中添加Spring相关依赖。
  2. 定义实体与组件(IoC and DI):

    • 创建图书(Book)、购物车(ShoppingCart)和订单(Order)实体。
    public class Book {
        private String title;
        private String author;
        private BigDecimal price;
        // Getters and Setters ...
    }
    
    public class ShoppingCart {
        private List<Book> books = new ArrayList<>();
        public void addBook(Book book) {
            books.add(book);
        }
        // Getters ...
    }
    
    public class Order {
        private ShoppingCart cart;
        private Date creationDate;
        // Constructors, Getters and Setters ...
    }
    
    • 创建服务接口比如BookServiceShoppingCartService,以及OrderService并提供实现。
    public interface BookService {
        List<Book> findAllBooks();
        Book findBookById(String id);
    }
    
    @Service
    public class BookServiceImpl implements BookService {
        // Injection of book repository to access books
        // Implementing methods...
    }
    
    @Service
    public class ShoppingCartService {
        // Methods for cart management...
    }
    
    @Service
    public class OrderService {
        // Methods for order processing...
    }
    
  3. 配置Spring Beans(XML/Annotation-based Configuration):

    • 使用XML文件或注解来配置实体和服务类作为Spring beans。
    @Service
    public class ShoppingCartService {
        private final ShoppingCart cart;
        
        @Autowired
        public ShoppingCartService(ShoppingCart cart) {
            this.cart = cart;
        }
        // ...
    }
    
  4. 使用Spring MVC构建Web界面:

    • 创建Controller以实现用户与应用交互,如浏览图书、添加图书到购物车等功能。
    @Controller
    public class BookController {
        private final BookService bookService;
        private final ShoppingCartService cartService;
        
        @Autowired
        public BookController(BookService bookService, ShoppingCartService cartService) {
            this.bookService = bookService;
            this.cartService = cartService;
        }
        // RequestMapping methods...
    }
    
  5. 配置和启动Spring ApplicationContext:

    • 根据选择的配置方式,设置ApplicationContext,可能是通过XML配置文件或通过使用@Configuration注解的Java配置类。
    • 启动Spring应用程序,ApplicationContext会负责初始化所有的Bean,注入依赖,并处理应用的生命周期。
  6. 应用AOP进行事务管理:

    • 用Spring AOP模块来声明式地管理事务,确保当发生错误时,系统能够回滚到稳定状态。
    @Service
    @Transactional
    public class OrderServiceImpl implements OrderService {
        // Methods for order service that require transactional context...
    }
    

通过这个案例,我们展示了使用Spring框架可以将应用切分为不同的组件和服务,通过IoC和DI简化组件间的依赖和互操作。Spring的核心容器来管理这些组件的生命周期、依赖关系和配置。同时,利用Spring AOP来处理横切关注点,如声明式事务管理。这样的设计使得应用程序更加模块化,易于测试和维护。


感谢大家抽出宝贵的时间来阅读博主的博客,新人博主,感谢大家关注点赞,祝大家未来的学习工作生活一帆风顺,加油!!!
在这里插入图片描述

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值