SpringBoot bean 注入的問題
阿新 • • 發佈:2019-01-05
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);
}
}