spring-自动装配

背景

最近在搞 spring-boot 的 web 开发,发现这个框架有一个非常有意思的点就是 IOC 容器,在这里 spring 不建议我们创建领域内的对象,而是推荐由 IOC 容器创建,我们直接用就是了。一开始我还为自己不到直接取得这些实例而感到不自在,一个 demo 下来之后发现,我还是真没有必要什么都自己做。

现在记录一下这个典型的流程。


第一步 定义领域对象

假设我只有一个 User 类。

package com.example.demo.pojos;

import lombok.Data;

@Data
public class User {
    private String name;
    private Integer age;

    public User(String name,Integer age) {
        this.name = name;
        this.age = age;
    }
}


第二步 配置 IOC 容器

配置好我们的 IOC 容器。

package com.example.demo.configs;

import com.example.demo.pojos.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public User user() {
        return new User("tom",16);
    }
}

第三步 在控制器中使用

在控制器中使用自动装配。

package com.example.demo.controllers;

import com.example.demo.pojos.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private User user; // user 与 AppConfig 中的 user 函数对应

    @GetMapping
    public String hello() {
        return "你好 我叫 " + this.user.getName() + " 。";
    }
}

这里的 user 会自动从我们的 IOC 容器中取得,对象默认是单例的。


第四小 启动服务

入口代码动都不用动。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

mvn spring-boot:run

2021-09-15 17:09:15.498  INFO 97648 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 1.8.0_282 on NEEKYJIANG-MB2 with PID 97648 (/Users/jianglexing/repos/java-exsamples/springboots/java-base-bean/target/classes started by jianglexing in /Users/jianglexing/repos/java-exsamples/springboots/java-base-bean)
2021-09-15 17:09:15.499  INFO 97648 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2021-09-15 17:09:16.051  INFO 97648 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-09-15 17:09:16.059  INFO 97648 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-09-15 17:09:16.059  INFO 97648 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.52]
2021-09-15 17:09:16.094  INFO 97648 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-09-15 17:09:16.095  INFO 97648 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 559 ms
2021-09-15 17:09:16.287  INFO 97648 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-09-15 17:09:16.293  INFO 97648 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.06 seconds (JVM running for 1.29)



检查效果

直接用 curl 访问对应的接口。

curl http://127.0.0.1:8080/hello
你好 我叫 tom