1. 程式人生 > >SpringBoot bean 注入的問題

SpringBoot bean 注入的問題

1.SpringBoot Bean 的掃描規則

  • 1.預設從【Application啟動類】所在的包位置從上往下掃描
  • 2.如果需要掃描的類不在啟動類所在包當前包或者啟動類所在包的子包中,那麼需要在啟動類中配置@ComponentScan註解來新增這些類的包

2.Application啟動類

【SpringBoot專案入口類】這個類的位置很關鍵:啟動類如下(Spring自動生成的啟動類)
啟動類

3.測試類的所在位置的要求

測試類【必須】啟動類當前目錄或者啟動類所在類的子目錄(把測試類看作一般類即可),如果想把測試類放到啟動類的父級目錄,首先要1.把啟動類的位置修改到目標目錄2.再修改測試類的位置到目標目錄

4.舉例

  • 1.如果Application類所在的包為:com.test.app,則只會掃描com.test.app包及其所有子包
  • 2.如果被掃描類所在包不在com.test.app及其子包下,則不會被掃描!比如有類在com.test.pc 下
  • 3.如果要掃描到com.test.pc下面的類,那麼需要在啟動類中配置註解:@ComponentScan(basePackages = {“com.test”}),把需要掃描的包配置進來
  • 4.如果要想把測試類放到 com目錄下,首先要把啟動類移動到 com目錄下,然後再把測試類移動到com目錄下

5.總結:一個類要被掃描到需要滿足的條件

  • 1.類必須在啟動類同一個包下面或者在啟動類包子包中 。
  • 2.被掃描的類如果不再啟動類所在包及其子包中,那麼需要在測試類上配置@ComponentScan註解把需要被掃描的包配置進來。
  • 3.測試類必須在啟動類當前目錄或者啟動類目錄的子目錄下面

6.例子

專案結構:
這裡寫圖片描述
啟動類:

package com.example.rabbitmq;

import org.springframework.amqp.core.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication
; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = {"com"}) public class DemoRabbitmqApplication { public static void main(String[] args) throws Exception { SpringApplication.run(DemoRabbitmqApplication.class, args); } }

測試類:

package com.example.rabbitmq;

import com.demo.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * Created by zhangtengda on 2018/5/30.
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class CheckTest {

    @Autowired
    private Person person;

    @Test
    public void testPerson() {
        person.say("dada", 5);
    }


}