Spring 使用教程(一): IOC 容器使用

844 阅读3分钟

IOC 容器是 Spring 必使用的基础组件之一。

创建 Maven 工程

首先,使用 IDEA 创建 Maven 工程,如下:

Next 后,输入合适的 Name,会自动生成 Artifact 的信息,如下:

Finish 后,进入创建的 demo-spring-ioc 工程,如下:

其中进行了默认分包,pom.xml 文件干净,没有任何依赖

pom 依赖

使用 Spring 的一些基础依赖包如下:

<!-- junit测试 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<!-- google guava 工具包 -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.0-jre</version>
</dependency>

<!-- lombok 工具,需要安装lombok插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

<!-- slf4j + logback -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.6</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.6</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring_version}</version>
</dependency>

<!-- spring-core container -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring_version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring_version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring_version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring_version}</version>
</dependency>

Spring 版本号使用 properties 标签统一控制:

<properties>
    <spring_version>5.1.9.RELEASE</spring_version>
</properties>

applicationContext.xml

SpringBoot 大部分功能都可以通过注解使用,包括配置。但 Spring 中的基本配置还是需要 xml 配置文件的。

在 main.resources 目录下新建 applicationContext.xml 文件。我们使用注解进行 bean 声明,因此在 applicationContext.xml 文件中只用声明 context 扫描包即可,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"
	   default-autowire="byName">

	<context:component-scan base-package="org.example"/>
</beans>

bean - Admin

创建 Admin 类,并使用 Component 注解将其作为单例对象注入到 IOC 容器中,用 Value 注解注入属性。如下:

package org.example.pojo;

import lombok.Getter;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Getter
@ToString
@Component("admin")
public class Admin {
    /**
     * 登录名称
     */
    @Value("admin")
    private String name;
    /**
     * 登录密码
     */
    @Value("123456")
    private String password;
}

注意,Getter 注解依赖 lombok 插件和 lombok 的 pom 依赖

测试 IOC 容器

创建 Application 类,其 main 方法中启动 IOC 容器,并获取 Admin 的单例对象进行使用。

package org.example.start;

import org.example.pojo.Admin;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Application {

    public static void main(String[] args) {
        // IOC 容器初始化
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Admin admin = (Admin) applicationContext.getBean("admin");
        String msg = String.format("admin name:[%s], password:[%s]", admin.getName(), admin.getPassword());
        System.out.println(msg);
    }
}

ApplicationContext 用于 IOC 容器的初始化,其中 classpath 表示 resource 所在的相对目录。

执行 main 方法,控制台将会输出:

admin name:[admin], password:[123456]

Junit 测试 IOC 容器

前面测试是使用启动类进行测试,当项目非常大的时候,启动整个项目可能会比较耗时,此时可以借助 Junit 的能力进行测试。

创建 IocTest 测试类如下:

package org.example.test;

import org.example.pojo.Admin;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class IocTest {
    // 测试类不用打开扫描开关,因为测试环境中会自动扫描该类
    @Resource
    private Admin admin;

    @Test
    public void test() {
        String msg = String.format("admin name:[%s], password:[%s]", admin.getName(), admin.getPassword());
        System.out.println(msg);
    }

}

其中 RunWith 注解中使用 SpringRunner.class 作为参数,表示启动 Spring环境,SpringRunner 注解与 SpringJUnit4ClassRunner 同义,前者相当于缩写。

ContextConfiguration 注解声明了 Spring 去哪里加载 context。

执行 test 方法,控制台将会输出:

admin name:[admin], password:[123456]

打 jar 包测试 IOC 容器

Java 程序可以打成 jar 包,在任何装有 JVM 的平台上运行,下面介绍如何将以上项目打成 jar 包。

IDEA 中选择 File - Project Structure - Artifacts,点击 + ,如下:

再进行如下选择:

在弹出的交互框中,进行一些配置,主要配置介绍:

  • Main Class:jar 包的启动类,该类需要有 main 方法,在执行 java -jar 时,就会执行启动类的 main 方法
  • JAR files from libraries:第一个选项指把项目的依赖包都一起压缩进 jar 包中;第二个选项指将依赖包也都复制到 jar 包的输出目录,并在输出 jar 包中建立超链接。(建议选择第一种,如果打出来的 jar 包执行报错,就再执行以上步骤,选择第二种)
  • Directory for META-INF/MANIGEST.MF:我们执行这些配置其实就是为了生成一个 META-INF/MANIGEST.MF 文件,这里是配置 META-INF/MANIGEST.MF 文件的输出位置,一般至于 resource 下
  • include tests:打的 jar 包是否包含测试包(test)里的类,建议不勾选

我的配置如下:

点击确定,注意这里的 Output directory ,它是打的 jar 包的存放位置。

点击确定,可以发现 resources 目录下新增了文件,如下:

IDEA 选择菜单栏 Build - Build Artifacts,使用终端切到前面提到的 Output directory 目录下,可以看到打出的jar包,执行 java -jar demo-spring-ioc.jar 命令,可以看到输出:

admin name:[admin], password:[123456]