Spring通過名稱獲取Bean示例


摘要:本文主要演示通過繼承自抽象類ApplicationObjectSupport獲取Bean實例。

參考文檔:

Spring在代碼中獲取bean的幾種方式提到共有以下幾種方式:

  • 方法一:在初始化時保存ApplicationContext對象
  • 方法二:通過Spring提供的utils類獲取ApplicationContext對象
  • 方法三:繼承自抽象類ApplicationObjectSupport
  • 方法四:繼承自抽象類WebApplicationObjectSupport
  • 方法五:實現接口ApplicationContextAware
  • 方法六:通過Spring提供的ContextLoader

完整示例代碼請參考:https://github.com/sxpujs/spring-cloud-examples/tree/master/rest-service

軟件環境:

  • 操作系統:MacOS Catalina 10.15.3
  • JDK 13.0.2
  • spring-boot-starter-parent: 2.2.5.RELEASE
  • Maven: 3.6.3

目錄:

文件布局

localhost:rest-service didi$ tree .
.
├── pom.xml
├── src
│   └── main
│       └── java
│           └── com
│               └── example
│                   ├── RestServiceApplication.java
│                   ├── controller
│                   │   ├── Greeting.java
│                   │   └── GreetingController.java
│                   ├── service
│                   │   ├── BarTask.java
│                   │   ├── FooTask.java
│                   │   └── Task.java
│                   └── util
│                       └── SpringContextHolder.java

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>springcloud-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>rest-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>rest-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>13</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Task接口

文件路徑:src/main/java/com/example/service/Task.java

package com.example.service;

public interface Task {
    void execute();
}

Task實現類BarTask

文件路徑:src/main/java/com/example/service/BarTask.java

package com.example.service;

import org.springframework.stereotype.Service;

@Service("barTask")
public class BarTask implements Task {

    @Override
    public void execute() {
        System.out.println("Run BarTask");
    }

}

Task實現類FooTask

文件路徑:src/main/java/com/example/service/FooTask.java

package com.example.service;

import org.springframework.stereotype.Service;

@Service("fooTask")
public class FooTask implements Task {

    @Override
    public void execute() {
        System.out.println("Run FooTask");
    }

}

Spring上下文工具類(繼承ApplicationObjectSupport)

文件路徑:src/main/java/com/example/util/SpringContextHolder.java

package com.example.util;

import com.example.service.Task;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.stereotype.Component;

@Component
public class SpringContextHolder extends ApplicationObjectSupport {

    public Task getTask(String beanName){
        return super.getApplicationContext().getBean(beanName , Task.class);
    }
}

用於測試的GreetingController

文件路徑:src/main/java/com/example/controller/GreetingController.java

package com.example.controller;

import java.util.concurrent.atomic.AtomicLong;

import com.example.service.Task;
import com.example.util.SpringContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @Autowired
    SpringContextHolder holder;


    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {

        Task task1 = holder.getTask("fooTask");
        Task task2 = holder.getTask("barTask");

        task1.execute();
        task2.execute();

        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

其它如src/main/java/com/example/RestServiceApplication.java和src/main/java/com/example/controller/Greeting.java等文件請參考Github

測試

啟動該服務后,在瀏覽器中輸入:http://localhost:8080/greeting,會得到如下響應:

{"id":1,"content":"Hello, World!"}

在后台日志會看到:

Run FooTask
Run BarTask


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM