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]