spring boot 下使用@ConponentScan注解遇到的問題


問題描述

如果你心急看結果,請直接到本文末尾

今天使用了注解操作spring boot,一開始程序無法啟動,提示無法找到一個注解注入的類,查詢網上,有人說使用@ConponetScan注解,可以指定需要掃描的類所在的包.我試了一下,程序能夠正常啟動了,但是在瀏覽器端無法訪問,提示404錯誤.程序具體代碼如下:
DemoApplication.java:

 package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages="domain")
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

HelloworldController.java:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import domain.User;

@RestController
//@RequestMapping("/web")
public class HelloworldController {

	@Autowired
	User user;
	
	@RequestMapping("/getUser")
	public User getUser(){
		//User user = new User();
		user.setName("jack");
		user.setPwd("pwd");
		return user;
	}
}

User.java:

package domain;

//@Component
@Service()
public class User implements Serializable{

	
	private static final long serialVersionUID = 1L;
	private String name;
	private String pwd;
	...
}
	

程序要點

我在controller類中注入bean類@Autowired User user;,並且在springboot 的application類中指定了掃描User類所在的包 @ComponentScan(basePackages="domain").而且User類也指定了@Service注解.
啟動springboot,沒有錯誤,在瀏覽器打開,提示404錯誤.

結果分析

具體原因不知道,但是如果把User類放在與application類同一目錄下,把application類中的@ComponentScan注解去除,其他不需要改變就能正常訪問.
我嘗試了很多,發現@ComponentScan注解對本項目下的別的目錄無能無力,如果把application類放在頂級目錄下,一般放在{groupId}.{artifactId}目錄下.其他類放在這個目錄或者它的子目錄下,就可以在不使用@ComponentScan注解的情況下使用注解(如@Autowired,@Service).因為spring boot 默認掃描
application啟動類所在的目錄及其子目錄下的注解.但是如果把使用注解的類放在application類所在目錄之外的目錄中,即使使用@ConponentScan注解指定了類所在的目錄,也不能正常使用.網上很多說@ComponentScan注解是用於掃描引入的別的模塊或jar包的,不知道是不是壓根不能指定本項目的其他包.

上面是我之前寫的,這里留着,給自己提個醒,產生問題的因素沒有梳理完,不要發文章.
下面是真正的原因:

  1. @ComponentScan默認掃描使用該注解的類所在的包,包括這個包下的類和子包,所以如果沒有配置basepackages,並且類都放在子包中,是可以正常訪問的
  2. 如果配置了@ComponentScn中的basepackages,那么就要把所有需要掃描的包都配置.這種情況下,@ComponentScan是不會再去掃描當前類所在的包的.之前我之所以以為@ComponentScan對啟動類之外的包無能為力,就是因為配置了domain包,但是沒有配controller類的包,導致程序無法訪問.

以上問題僅限於本人環境下的,如果有出入,輕噴


免責聲明!

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



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