@ServeletComponentScan和@ComponentScan的区别

一、SpringBoot中使用Servlet
在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

1.在入口Application类上加入注解@ServletComponentScan

package com.hui;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}


2.新建Servlet类,继承HttpServlet并且加入注解@WebServlet(name=“TestServlet”,urlPatterns="/test")

package com.hui.qiang;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name="TestServlet",urlPatterns="/test")
public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");}
}


3.之后运行代码,在浏览器地址栏输入http://localhost:8080/test,若看到控制台打印doGet,则表示Servlet创建成功。
注意:
(1)如果不加@ServletComponentScan注解则会报404即找不到页面,控制台也扫描不到我们配置的servlet:/test,即无法被映射
(2)如果Application类和Servlet类不在同一包下,则@ServletComponentScan需要添加相应的路径,如Application类在包com.hui.xiao下,则写为@ServletComponentScan(“com.hui.xiao”)或@ServletComponentScan(“com.hui”)

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

二、Spring, Spring Boot中的@ComponentScan注解用法介绍
@ComponentScan
如果你理解了ComponentScan,你就理解了Spring.
Spring是一个依赖注入(dependency injection)框架。所有的内容都是关于bean的定义及其依赖关系。
定义Spring Beans的第一步是使用正确的注解-@Component或@Service或@Repository.
但是,Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean.
ComponentScan做的事情就是告诉Spring从哪里找到bean

由你来定义哪些包需要被扫描。一旦你指定了,Spring将会将在被指定的包及其下级的包(sub packages)中寻找bean
下面分别介绍在Spring Boot项目和非Spring Boot项目(如简单的JSP/Servlet或者Spring MVC应用)中如何定义ComponentScan

注:@ComponentScan的不同写法
1.@ComponentScan({“com.xiao.hui”,“com.xiao.qiang”})或@ComponentScan(basePackages = {“com.xiao.hui”,“com.xiao.qiang”})
2.@ComponentScan(“com.xiao”)或@ComponentScan(value = “com.xiao”)或@ComponentScan(basePackages = { “com.xiao” })
3.@ComponentScan(basePackageClasses=要扫描类.class所在位置的包) 意思是要扫描哪个类所在的包,如@ComponentScan(basePackageClasses=hehe.class),这种写法不如上面的那种写法好有局限性

Spring Boot项目
总结:
1.SpringBoot在写启动类的时候如果不使用@ComponentScan指明对象扫描范围,默认指扫描当前启动类所在的包里的对象,如果你的其他包都在使用了@SpringBootApplication注解的主类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了。为了方便,我一般都把主类放在了所有类的上一级包中,如项目所有的class文件都放在了包com.beauty的下级包中,则把spring boot的主类放在包com.beauty下。
2.如果当前启动类没有包,则在启动时会报错:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package错误,因为启动类不能直接放在main/java文件夹下,必须要建一个包把它放进去或者使用@ComponentScan指明要扫描的包。
3.如果你有一些bean所在的包,不在主类的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包。

举个栗子,看下面定义的类:

package com.xiao.qiang.qianming;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {ApplicationContext applicationContext = SpringApplication.run(SpringbootApplication.class, args);for (String name : applicationContext.getBeanDefinitionNames()) {System.out.println(name);}}
}


类SpringbootApplication在com.xiao.qiang.qianming包下,这个类使用了@SpringBootApplication注解,该注解定义了Spring将自动扫描包com.xiao.qiang.qianming及其子包下的bean
如果你项目中所有的类都定义在上面的包及其子包下,那你不需要做任何事。
但假如你一个类定义在包com.xiao.hui下,则你需要将这个新包也纳入扫描的范围,有两个方案可以达到这个目的。

方案1
定义@ComponentScan(“com.xiao”),这么做扫描的范围扩大到整个父包com.xiao

@ComponentScan("com.xiao")
@SpringBootApplication
public class SpringbootIn10StepsApplication {


方案2
定义分别扫描两个包

@ComponentScan({"com.xiao.hui","com.xiao.qiang"})
@SpringBootApplication
public class SpringbootIn10StepsApplication {


非Spring Boot项目
在非Spring Boot项目中,我们必须显式地使用@ComponentScan注解定义被扫描的包,可以通过XML文件在应用上下文中定义或在Java代码中对应用上下文定义

Java代码方式:

@ComponentScan({"com.xiao.package1","com.xiao.package2"})
@Configuration
public class SpringConfiguration {


注:@Configuration 和@ComponentScan注解背后会做什么呢?
其实很简单,@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
例如,如果你有个类用@Controller注解标识了,那么,如果不加上@ComponentScan,自动扫描该controller,那么该Controller就不会被spring扫描到,更不会装入spring容器中,因此你配置的这个Controller也没有意义。
类上的注解@Configuration 是最新的用注解配置spring,也就是说这是个配置文件,和原来xml配置是等效的,只不过现在用java代码进行配置了 加上一个@Configuration注解就行了,是不是很方便,不需要那么繁琐的xml配置了,这样基于注解的配置,可读性也大大增高了。

XML文件方式:
<context:component-scan base-package=“com.xiao.package1, com.xiao.package2” />
 

三、使用@ComponentScan自动扫描组件实例
包扫描会扫描只要标注了@Controller,@Service,@Repository,@Component这四个注解都会被扫描到容器中。
1、@Controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层
2、@Service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理
3、@Repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.
4、@Component (把普通pojo实例化到spring容器中,相当于配置文件中的 )
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
案例:<context:component-scan base-package=”com.*”>
上面的这个例子是引入Component组件的例子,其中base-package表示为需要扫描的所有子包。
有一篇不错的文章(Spring注解详解):https://blog.csdn.net/xyh820/article/details/7303330/

å¨è¿éæå¥å¾çæè¿°
新增控制层的java类:TestController和HelloController

import org.springframework.stereotype.Controller;@Controller
public class TestController {}

 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping(value="/hello", method = RequestMethod.GET)public String hello() {return "Hello, Spring Boot";}
}


新建一个业务逻辑层类:TestService

import org.springframework.stereotype.Service;@Service
public class TestService {}


新建一个数据库连接Dao类:TestDao

import org.springframework.stereotype.Repository;@Repository
public class TestDao {}


新建一个Person:

public class Person {public Person(String string, int i) {}
}


主方法测试:
spring boot:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(value = "com.hui")
public class Application {public static void main(String[] args) {ApplicationContext applicationContext = SpringApplication.run(Application.class, args);for (String name : applicationContext.getBeanDefinitionNames()) {System.out.println(name);}}
}


非spring boot:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;import com.hui.entity.Person;@Configuration
@ComponentScan(value = "com.hui")
public class ComponentTest {@Beanpublic Person getPerson() {return new Person("百度好帅", 10000);}public static void main(String[] args) {@SuppressWarnings("resource")ApplicationContext applicationContext =new AnnotationConfigApplicationContext(ComponentTest.class);String[] beanNames = applicationContext.getBeanDefinitionNames();for (String bean : beanNames) {System.out.println(bean);}}
}


运行Application:
控制台扫描到了/hello,即映射成功

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°
把Application注释掉运行ComponentTest:

å¨è¿éæå¥å¾çæè¿°
参考:
https://blog.csdn.net/Lamb_IT/article/details/80918704
https://jingyan.baidu.com/article/7908e85cc6930daf481ad2b6.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256174.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统imx6ull开发板内核安装STM Virtual ComPort虚拟串口驱动

目录 前言 一、问题描述 二、解决步骤 1.更改option.c文件 2.修改内核编译选项 3.编译内核并加载到开发板 总结 前言 本文硬件使用正点原子imx6ull-min底板emmc ddr512核心板&#xff0c;软件使用正点原子针对imx6ull开发板提供的出场Linux内核源码、设备树与根文件系统&#…

MDK5:正点原子stm32遇Target not created的解决方法

几乎在直接打开这里的test.uvprojx文件进行编译运行时都会出现以上的错误。这时候只需关闭改工程&#xff0c;然后右击keil5的应用程序&#xff0c;点击“以管理员身份运行”&#xff0c;打开之后即可编译成功。

MDK5 添加Device

现象如下图&#xff1a; 出现这个问题的原因有两种&#xff0c;因此有两种解决方法&#xff1a; 第一种&#xff1a;大部分为网上介绍的&#xff0c;没有下载Pack包&#xff0c;进入Packs Installer中选择自己需要的芯片系列选择包进行下载即可。 第二种&#xff1a;不常见的…

Keil MDK 软件包(MDK5 Software Packs)离线下载方法

最近 Keil 官网的 MDK 软件包下载页面不展示软件包的下载列表了&#xff0c;无法下载软件包&#xff0c;如图1所示。 图1 Keil 官网 MDK5 Software Packs 下载页面截图 其实是有办法下载软件包的&#xff0c;方法如下&#xff1a; 1、打开 Microsoft Edge 浏览器&#xff08;其…

Keil MDK5 打开MDK4项目

安装完最新版本keil(5.38a)后&#xff0c;需要打开几个MDK4的项目&#xff0c;结果一打开keil就提示报错了。 这里我选择的是第二种方式&#xff0c;首先安装legacy support&#xff0c;以下是下载链接 MDK v4 Legacy Support (keil.com) 安装完成以后&#xff0c;可能会遇到另…

keil MDK5 无法 Go To Definition Of

目录 1.勾选 Browse Information 2.重新编辑即可 弹出如下窗口&#xff1a; 编译没有通过&#xff0c;或者函数有编译条件限制&#xff08;在某个条件成立时&#xff0c;函数才会被keil编译&#xff09;&#xff0c;没有被编译的函数是不能使用“Go To Definition Of”跳转到…

MDK5__配色方案

这个MDK5的配色方案是仿照Notepad里面的Plastic Code Wrap主题&#xff0c;字体是Courier New&#xff0c;个人比较喜欢这个主题配色方案&#xff0c;同时经常看代码不会觉得太刺眼 配色过程 修改颜色有两种方案&#xff0c;最简单的是在MDK软件中&#xff0c;通过Edit->C…

MDK5的安装

一、安装MDK5 下载&#xff1a; 官方下载地址&#xff1a;http://www2.keil.com/mdk5 1.打开官方网站&#xff0c;并点击下载MDK5 2.按照要求填写信息并点击提交 3.点击下载 安装 1.双击图标进行安装 2.进入安装界面——点击Next&#xff08;下一步&#xff09; 3.选中…

ARM KEIL: MDK5 Software Packs

ARM&#xff1a;Advanced RISC Machines 先进的精简指令集器件。 ARM是最当下最流行的处理器&#xff0c;尤其在嵌入式领域。 KEIL被ARM收购&#xff0c;MDK5是ARM官方的开发工具。 作为一款面向微控制器和微处理器的软件开发工具&#xff0c;需要支持各种各样的芯片。 所以…

STM32——新建 Keil MDK 5 工程(寄存器版本)

注&#xff1a;本文仅依照加粗字体和图片可快速新建 Keil MDK 5 工程 由于文章没有细分步骤&#xff0c;标记点用于方便阅读。 &#x1f53a; 标记点 ① 打开 Keil MDK 5&#xff0c;点击Project > New μVision Project&#xff0c;如图&#xff1a; &#x1f53a; 标记…

MDK5之.map文件解析

MDK5之.map文件解析 前言一、.map文件总览二、详细介绍1、Section Cross References&#xff1a;模块、段(入口)交叉引用2、Removing Unused input sections from the image&#xff1a;移除未使用的模块3、Image Symbol Table&#xff1a;映射符号表4、Memory Map of the imag…

MDK5 与 GIT 配合使用

参考 Abstract: (keil.com) 1&#xff0c;增加忽略文件 (.gitignore) &#xff08;我一般喜欢把输出文件放到Objects/目录下&#xff09; Listings/ Objects/ *.TMP 2 最好是mdk5.15以上版本&#xff0c;不然需要拷贝文件到此目录 Vision 5.15 is providing a SVCS templ…

Keil MDK5硬件仿真之基本介绍

Keil MDK5这个软件是提供硬件仿真功能的&#xff0c;所谓硬件仿真就是指将当前的程序实时的运行在你的设备中&#xff0c;并且可以检测程序中的变量的值&#xff0c;或者控制程序运行的流程&#xff0c;下面就让我们来看一下如何进行硬件仿真吧。 第一步&#xff0c;单击Optio…

keil MDK5软件包介绍、下载、安装与分享

前言 本文介绍了Keil MDK5软件包的分类、作用、下载、安装与更新。软件包下载可通过Keil自带的Pack Installer、进入Keil Pack下载网站手动下载、去芯片厂家官网下载三种方式。同时分享了一个小技巧&#xff0c;可以直接分享已安装好的软件包给别人。 一. Keil MDK软件包介绍 K…

Ubuntu安装MDK5

1 环境部署 Ubuntu 18.04 Wine 3.0.4 1.1 查看CPU信息 lscpu序号属性描述1架构x86_642CPU 运行模式32-bit, 64-bit3字节序Little Endian4CPU45在线 CPU 列表0-36每个核的线程数17每个座的核数48座19NUMA 节点110厂商 IDGenuineIntel11CPU 系列613型号15814型号名称Intel Core…

下载MDK5 Software Packs导入Keil5

⭐最近在用Keil5编译STM32L系列的项目文件&#xff0c;在选择芯片型号时并没有自己的STM32L系列的芯片&#xff0c;找了很久&#xff0c;才找到下载的网址&#xff0c;现在来分享一下自己下载和安装的过程。&#x1f308; 1.下载网址 MDK Software Packs下载地址 以上就是MDK5的…

MDK5注释乱码以及解决方案

在MDK5中会出现注释乱码的情况 //GPIO_SetBits(GPIOB,GPIO_Pin_7);//0GPIO_InitStructure.GPIO_Pin GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType GPIO_OType_PP; //GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz; /…

MDK5新建工程

文章目录 一、MDK简介二、建立STM32工程模板 一、MDK简介 MDK 源自德国的 KEIL 公司&#xff0c;是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌入式开发工程师使用。目前最新版本为&#xff1a;MDK5.14&#xff0c;该版本使用 uVision5 IDE 集成开发环境&#xff0c;是…

MDK5简介

1.MDK5 由两个部分组成&#xff1a;MDK Core 和 Software Packs。其中&#xff0c;Software Packs 可以独立于工具链进行新芯片支持和中间库的升级。 2. MDK Core 又分成四个部分&#xff1a;uVision IDE with Editor&#xff08;编辑器&#xff09;&#xff0c;ARM C/C Compi…

MDK5 使用技巧

MDK5 使用技巧 通过前面的学习&#xff0c;我们已经了解了如何在 MDK5 里面建立属于自己的工程。下面&#xff0c;我们将向大家介绍 MDK5 软件的一些使用技巧&#xff0c;这些技巧在代码编辑和编写方面会非常有用。 文章目录 MDK5 使用技巧一、文本美化二、语法检测 & 代…