0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java】Spring DIの仕組み

Last updated at Posted at 2020-10-26

#Spring DIコンテナの機能

  • アプリケーションの起動時にエントリポイントが必要
  • JavaではMainメソッドが起動するエントリポイントになる
  • SpringBootではMainメソッドのクラスに@SpringBootApplicationがついている
  • Spring ランタイムは起動時にこのアノテーションがついているパッケージ下にある全クラスをチェック
  • @Bean(及びその派生クラス, @Component, @RestController, @Serviceなど)を 自動的に検出しSpring DIコンテナに登録
  • 検出したメソッドに**@GetMapping**などがついていたらここをエンドポイントとして、”/“のURL(=8080)にリスニング
  • そこから来たリクエストをURLの内容に応じて登録したコントローラに自動で分けてくれる
  • Spring Web が選択すると、DIコンテナに登録されたBean から @RestController が付与されたクラスを探して、@GetMapping などが付与されたメソッドをエンドポイントにする

DI.png

#ルーティングの仕組みについて

  • 以下の例ではDemoApplication、SampleApplicationはBeanとして登録され2つともルーティング対象になる
Project Root
└─src
    └─ main
        └─ java  
            └─ com.example
                └─ demo
                    └─DemoApplication
                    └─SampleApplication

##失敗例

  • DemoApplication、SampleApplication共に”/”を指定した場合、SampleApplicationが優先される。

結果.png

DemoApplicaton.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/") //どこのアドレスからとってくるか、”/“はhttp://localhost:8080/を指す
    String index(){
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
SampleApplicaton.java
package com.example.hoge;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SampleController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    //URLのrootに対してリクエストが来たら受け取る
    //DemoApplication とルート(=8080)が被っている
    public String index(Model model) {
        model.addAttribute("message", "Hello World!!");
        return "index";
    }
}

##ルーティングの仕組み

  • @SpringBootApplicationがcom.example.demo以下にある場合、demoより下のパッケージを読みに行く
  • SampleController.javaをcom.example.hogeに移動→SampleControllerはルーティング対象外になる!
Project Root
└─src
    └─ main
        └─ java  
            └─ com.example
                └─ demo
                    └─DemoApplication
                └─ hoge
                    └─SampleApplication
DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/hoge")
    String index(){
        return "Hello World!";
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • SampleControllerの”/”を”/bar”に変更
  • http://localhost:8080/bar にアクセス
  • @SpringBootApplicationがパッケージ下にある全クラスをチェックできていない!DIコンテナに登録できていない!

Whitelabel Error Page

err.png

SampleApplicaton.java
package com.example.hoge;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SampleController {
    @RequestMapping(value = "/bar", method = RequestMethod.GET)
    public String index(Model model) {
        model.addAttribute("message", "Hello World!!");
        return "index";
    }
}
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?