作为一个springboot初学者,在探索过程中难免遇到一些坑,边看书边动手,发现书本中的版本是1.0,而我使用的是最新版2.0,所以有些东西不能完全按照书本进行操作,因为2.0中已经不支持1.0中的部分配置了,比如2.0中的注解@SpringBootApplication是注解@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan的组合,而1.0中它是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan等。而且在入门教程中将启动类和controller放在同一个类中,但是这样的配置随着业务的扩展controller会越来越多,随之而来的问题就是启动类越来越大,考虑到这点,我想将启动类和controller分开配置,参考网络资源,并在一番恶斗之后终于实现了这个想法,因为遇到了一些坑,所以必须记录下来!!

一、controller和启动类在同一个class中

使用IntellJ IDEA创建springboot项目时,会在默认的包下自动创建一个*Application.java的类,其中*一般是artifact名称,即项目名称,然后可以直接在这个类中配置controller并使用这个类启动项目。

@Controller
@SpringBootApplication
public class WebdemoApplication { @RequestMapping("/")
public String index(Model model) {
Person person = new Person("张三", 26); List<Person> people = new ArrayList<>();
Person p1 = new Person("李四", 27);
Person p2 = new Person("王五", 27);
Person p3 = new Person("赵六", 27);
people.add(p1);
people.add(p2);
people.add(p3); model.addAttribute("singlePerson", person);
model.addAttribute("people", people);
return "/hello/index";
} public static void main(String[] args) {
SpringApplication.run(WebdemoApplication.class, args);
}
}

这就是将controller和启动类放在一个类中的配置,直接点右键运行这个类就可以访问了!

二、将controller和启动类分开配置

因为将controller和启动类分开,所以首先要新建一个controller类

@Controller
public class HelloController { @RequestMapping("/hello")
public String index(Model model) {
Person person = new Person("张三", 26); List<Person> people = new ArrayList<>();
Person p1 = new Person("李四", 27);
Person p2 = new Person("王五", 27);
Person p3 = new Person("赵六", 27);
people.add(p1);
people.add(p2);
people.add(p3); model.addAttribute("singlePerson", person);
model.addAttribute("people", people);
return "/hello/index";
}
}

我不改变启动类的位置,但是启动类中只要一个main方法即可,如下:

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

此时不改变启动类位置,目录如下:

此时我访问http://127.0.0.1:8080/hello时总是包404,排除视图文件的因素之后我将启动类放到com.hyc下,目录如下:

此时再重启服务,访问http://127.0.0.1:8080/hello时才正常了!

所以这种方式一定要将启动类放在root目录下,这样才能扫描到controller、service,如果想让启动类放在任何地方都生效的话,可以使用下面的配置方法

@ComponentScan(basePackages = {"com.hyc"})
@SpringBootApplication
public class WebdemoApplication { public static void main(String[] args) {
SpringApplication.run(WebdemoApplication.class, args);
}
}

这种方法中,controller不变,启动类放在任意包下面,我是放在创建项目默认包中,这样只需在启动类上增加注解@ComponentScan即可,其中的(basePackages = {"com.hyc"})是需要扫描的包名,可以是多个,如(basePackages = {"com.hyc.controller","com.hyc.service"})等,这就意味着mvc容器会去这些包下面扫描,进而找到controller等资源。

三、总结

综上所述,springboot的配置有以下三种:

1、当启动类和controller在同一类中时,需要在该类上添加注解@Controller;

2、当启动类和controller分开时,启动类要放在根目录下,启动类上只有注解@SpringBootApplication;

3、当启动类和controller分开时,如果启动类在某个包下,需要在启动类中增加注解@ComponentScan,配置需要扫描的包名;

SpringBoot--springboot启动类和controller的配置的更多相关文章

  1. springBoot项目启动类启动无法访问

    springBoot项目启动类启动无法访问. 网上也查了一些资料,我这里总结.下不来虚的,也不废话. 解决办法: 1.若是maven项目,则找到右边Maven Projects --->Plug ...

  2. SpringBoot在启动时的多环境配置以及加载顺序

    通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...

  3. SpringBoot源码分析之---SpringBoot项目启动类SpringApplication浅析

    源码版本说明 本文源码采用版本为SpringBoot 2.1.0BUILD,对应的SpringFramework 5.1.0.RC1 注意:本文只是从整体上梳理流程,不做具体深入分析 SpringBo ...

  4. springboot的启动类不能直接放在src/java目录下,不然会报错

    jar包的application.yml 会被项目的覆盖,导致找不到原有的配置

  5. springboot系列(三) 启动类中关键注解作用解析

    一.Springboot:请求入口 @SpringBootApplication @EnableAspectJAutoProxy @EnableScheduling @EnableTransactio ...

  6. springboot+cloud 学习(五)统一配置中心 spring cloud config + cloud bus + WebHooks +RibbitMQ

    前言 微服务要实现集中管理微服务配置.不同环境不同配置.运行期间也可动态调整.配置修改后可以自动更新的需求,Spring Cloud Config同时满足了以上要求.Spring Cloud Conf ...

  7. 你来说一下springboot的启动时的一个自动装配过程吧

    前言 继续总结吧,没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看到spr ...

  8. springboot之启动原理解析

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  9. springboot之启动原理解析及源码阅读

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

随机推荐

  1. 在GitHub上编辑README.md排版样式

    如何在github的readme.md编辑出好看的样式排版文章呢...? 参考:https://blog.csdn.net/u012067966/article/details/50736647

  2. d3操作svg路径动画,及dom移动

    图片跟随路径循环运动,dom也跟着路径运动(利用实时获取坐标位置的方法,改变transform) 1,准备路径 a,自己脑补路径 b,在ps上画好,然后在保存成png-24图片,背景透明,在网站htt ...

  3. PHP 实现斐波那契数列

    使用循环实现 <?php $arr[1] = 1; for($i = 2;$i < 100;$i++) { $arr[$i] = $arr[$i-1] + $arr[$i-2]; } ec ...

  4. Python 空值和非空值

    1)任何值为0的值都是false,任何非0的值都是true if -0.0: print 'yes' #不打印yes if -0.1: print 'yes' #打印yes 2)任何为空的值都是fla ...

  5. zookeeper基本概述

    zookeeper是一个分布式的协调服务框架 其本质是一个分布式的小文件存储系统,可以存储一些小的文件,官方建议每个小文件不要超过一兆 zk一般都是装奇数台,便于zk内部的一些投票选举 leader: ...

  6. GoF著作中未提到的设计模式(2):Interceptor

    转:http://www.cnblogs.com/west-link/archive/2011/06/22/2086591.html 拦截器模式为我们提供了一种拦截方法调用或消息的途径,整个过程是自动 ...

  7. Vue.js - 路由 vue-router 的使用详解2(参数传递)

    一.使用冒号(:)的形式传递参数 1,路由列表的参数设置 (1)路由列表的 path 是可以带参数的,我们在路由配置文件(router/index.js)里以冒号的形式设置参数. (2)下面样例代码中 ...

  8. Python-爬虫-requests库用语post登录

    requests库很强大,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码. 可以发送无参数的get请求, ...

  9. Unicode与MultiByte之间的练习: Process Cleaner

    #include <cstdio> #include <cstring> #include <windows.h> #include <tlhelp32.h& ...

  10. 使用Docker创建数据容器

    使用Docker创建数据容器 翻译自: Data-only container madness 1.什么是数据容器? 数据容器就是本身只创建一个volume供其他容器共享,创建完后即退出,不执行任何任 ...