zoukankan      html  css  js  c++  java
  • 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类的包,导致程序无法访问.

    以上问题仅限于本人环境下的,如果有出入,轻喷

  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/donfaquir/p/9325500.html
Copyright © 2011-2022 走看看