springboot~註冊不同級別包裡的bean~scanBasePackages
阿新 • • 發佈:2021-02-13
技術標籤:【007】Spring & Spring Boot
對於springboot來說,它會把當前應用程式所在的包裝載到ioc容器裡,讓使用者可以直接Autowired注入它們,一般的專案結果是這樣的,這個專案包下有main方法,它將會把nacosdemo這個包裡面所有的bean都掃描出來,然後在程式啟動時,nacosdemo裡的bean就會被自動註冊了。
目前我們做一個測試,在nacosdemo包外層再建立一個包common,在裡面寫個元件,然後在nacosdemo裡去使用它,整個專案結構如下
這時,專案啟動後,是無法載入到你的bean的,因為它不會被掃描到,解決方法是把它新增到掃描包列表裡
@SpringBootApplication(scanBasePackages = {"com.lind.nacosdemo", "com.lind.common"}) @EnableDiscoveryClient public class NacosDemoApplication { public static void main(String[] args) throws InterruptedException { ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosDemoApplication.class, args); String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :" + userName + "; age: " + userAge); } }
在新增時要註冊,當前包的名稱也要加上,否則當前包也會被覆蓋的,這一點要清楚。
測試的程式碼
common裡的元件bean
@Component
public class RedisConfig {
public void print() {
System.out.println("hello redis!");
}
}
canosdemo包裡呼叫它
@Autowired RedisConfig redisConfig; @RequestMapping("/get") public String get() { redisConfig.print(); return username; }
結果如圖,我們的方法被呼叫到了
這種方法雖然實現了我們的功能,但需要在程式的入口維護一坨坨包名,很不友好,下次我們說對這塊進行重構。