• 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类的包,导致程序无法访问.

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

  • 相关阅读:
    Flink Flow
    Excellent JD
    Storm Flow
    Fundmentals in Stream Computing
    SpringBoot
    Generic/Template Programming in Flink
    Talks on C/S
    Thrift-RPC client in Flume
    Aysnc-callback with future in distributed system
    Unity Shader入门教程(二)最基本的Diffuse和Normal样例
  • 原文地址:https://www.cnblogs.com/donfaquir/p/9325500.html
Copyright © 2020-2023  润新知