购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

对于初学者,想要了解Spring,需要先熟悉一些术语,如容器、POJO、Bean、耦合度、依赖、依赖注入等,下面分别进行介绍。

1.容器

生活中的容器是用于盛放东西的器具。从程序的角度来看,容器是装“对象”的对象,管理对对象的整个生命周期,即负责从创建、获取到回收的全过程。

2.POJO

POJO即简单旧式Java对象,是指那些不依赖任何特定环境的类或接口。POJO没有从任何类继承,没有实现任何接口,也没有被其他框架注入。

3.Bean

Bean就是由容器初始化、装配和管理的对象。Spring的核心是IoC容器。容器的职能包括对应用程序对象进行实例化、初始化和装配,以及在对象的整个生命周期中Spring的其他功能。这些被容器创建和管理的标准Java对象称为Bean。这些Java对象都是POJO。Bean的作用如下。

以某种方式配置Spring(数据库连接参数、安全性等)。

使用依赖注入避免硬编码依赖项,以便代码的类保持独立且可进行单元测试。

4.配置元数据

配置元数据用于向容器提供相关的信息,以便实例化Bean并制订对这些Bean进行装配的方法。配置元数据的传统格式是XML,可以选择注解,或基于Java的配置元数据。容器首先获取应用程序中编写的类,并与配置元数据结合,然后创建和装配Bean。

5.依赖

Spring的重要特性是依赖注入。想要了解依赖注入,需要先了解什么是依赖。我们先看架构层的依赖。一个典型的Java应用程序的体系结构包含Web层、业务层和数据层。其中,Web层依赖业务层,业务层是Web层的依赖项;业务层依赖数据层,数据层是业务层的依赖项。关于类级别的依赖例子如下列代码所示,BookImpl是业务类,它的实现方法需要使用productDo和itemDo这两个数据层类,因此productDo和itemDo是BookImpl的依赖项。

@Service
public class BookImpl implemented Book {
    @Autowired
    Product productDo;
    @Autowired
    Item itemDo;
    @Override
    public int getBookSum(int isdn) {
        ...
    }

6.非侵入式设计

从程序角度来看,如果不需要继承框架提供的类,这种设计就可以看作非侵入式设计。如果继承了框架提供的类,并且想要更换框架,则无法重用之前的代码。如果程序采用了非侵入式设计,那么旧的代码任何时候都可以进行重用。

7.轻量级

轻量级设计一般是指非侵入式设计,依赖项比较少,容易部署和使用。和轻量级设计相对应的是重量级设计,它一是侵入式指设计,通常很难对它进行重构。

8.依赖注入

依赖注入是指在Spring创建对象的过程中,将对象所依赖的属性注入。依赖注入让相互协作的软件保持松耦合,其目的是提高组件重用的频率,并为系统搭建一个灵活可扩展的框架。通过依赖注入机制,只需要简单的配置,无须任何代码,就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处、由谁实现。

9.耦合度

耦合度表示结合的紧密程度。在程序中,耦合度是指模块间关联和依赖的程度。耦合度的高低取决于模块间接口的复杂度、调用模块的方式,以及通过界面传送数据的规模。模块间的耦合是指模块之间的依赖关系,包括控制关系和调用关系、数据传递关系。模块间联系越多,其耦合度越高,同时表明其独立性越弱,降低耦合度,可以增强其独立性。

10.控制反转

Spring框架最重要的特性是依赖注入。所有Spring模块的核心是依赖注入或控制反转。当正确使用依赖注入时,我们可以开发出低耦合的应用程序,同时,可以轻松地对该低耦合的应用程序进行单元测试。

控制反转是指创建的对象责任的反转,就是将原本在程序中手动创建对象的控制权交由容器管理,由容器创建对象并将它们注入应用程序。把对象的创建交给外部容器完成的过程称为控制反转。为什么称为控制反转呢?因为传统的方法是直接在对象内部通过new()方法创建对象,是主动创建依赖对象的方式,而现在由容器来创建对象并注入依赖对象。

控制反转的优点如下。

控制反转使代码低耦合。

控制反转可以帮助程序员轻松地编写出色的单元测试用例。

下面先看一个没有控制反转的例子(传统的实现方法)。

@RestController
public class WelcomeController {
    private WelcomeService service = new WelcomeService();
    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

上面的代码中,WelcomeController依赖WelcomeService,从而获取欢迎消息。WelcomeController类直接创建了一个实例WelcomeService,这意味着它们紧密关联。这是传统的实现方法。这种方法在代码中直接创建一个依赖对象,代码产生了高耦合。在这种情况下,当进行单元测试时,为WelcomeService创建一个模拟的对象很困难。接下来,我们看一个用控制反转实现低耦合的例子(使用Spring解耦)。

@Component
public class WelcomeService {
    ...
}

@RestController
public class Welcome Controller {
{
    @Autowired
    WelcomeService service;

    @RequestMapping("/welcome")
    public String welcome() {
        return service.retrieveWelcomeMessage();
    }
}

在上面的例子中,使用Spring的两个简单的注解——@Component和@Autowired。首先,通过@Component通知Spring框架,这里有一个需要管理的Bean。然后,通过@Autowired通知Spring框架,需要找到这个特定Bean的正确匹配并自动加载它。在上面的代码中,Spring将为WelcomeService创建一个Bean,并将其自动加载到WelcomeController中。在单元测试中,要求Spring将WelcomeService的模拟实例自动连接到WelcomeController。在Spring Boot中,使用@MockBean实现,具体过程请参考下文。现在,Spring框架自动装配WelcomeService到WelcomeController的依赖关系。在为WelcomeController编写单元测试用例时,使用WelcomeService模拟对象而不是实际依赖项。

11.AOP

在面向对象的编程过程中,不可避免地会出现代码重复问题。面向切面编程(Aspect Oriented Programming,AOP)对这些重复代码进行管理,将解决某个切面问题的代码单独放在某个模块中,再植入程序。简单来说,AOP允许你把遍布应用程序各处的功能分离以形成可重用的组件。 7jJs/EZl2FJN+riJtYUuRpGZFKazkzNp7eZRvIpO46+cvhAtOfuZzQHeDmpiXnjw

点击中间区域
呼出菜单
上一章
目录
下一章
×