@component (将普通JavaBean实例化到spring容器中,Spring容器统一管理,用起来不用自己new了,相当于配置文件中的
)
如果你理解了ComponentScan,你就理解了Spring
Spring是一个依赖注入(dependency injection)框架。所有的内容都是关于bean的定义及其依赖关系
定义Spring Beans的第一步是使用正确的注解@Component或@Service或@Repository
但是,Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean
由你来定义哪些包需要被扫描。一旦你指定了,Spring将会将在被指定的包及其下级包(sub packages)中寻找bean
下面分别介绍在Spring Boot项目和非Spring Boot项目(如简单的JSP/Servlet或者Spring MVC应用)中如何定义Component Scan
Spring Boot项目
总结:
如果你的其他包都在使用了@SpringBootApplication注解的main
app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了
如果你有一些bean所在的包,不在main
app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包
举个例子,看下面定义的类
package com.demo.springboot;
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.demo.springboot包下,这个类使用了@SpringBootApplication注解,该注解定义了Spring将自动扫描包com.demo.springboot及其子包下的bean.
如果你项目中所有的类都定义在com.demo.springboot包及其子包下,那你不需要做任何事
但假如你一个类定义在包com.demo.somethingelse下,则你需要将这个新包也纳入扫描的范围,有两个方案可以达到这个目的。
方案1
定义@CoponentScan(“com.demo”)//可以看一下源码,@SpringBootApplication注解包含了@ComponentScan,scanBasePackages最为ComponentScan中basePackages别名,所以可以把包扫描放到@SpringBootApplication注解中
这么做扫描的范围扩大到整个父包com.demo
@ComponentScan(“com.demo”)
@SpringBootApplication
public class SpringbootApplication {
方案2
定义分别扫描两个包
@ComponentScan({“com.demo.springboot”,”com.demo.somethingelse”})
@ComponentScan({"com.demo.springboot","com.demo.somethingelse"})
@SpringBootApplication
public class SpringbootApplication {
```
特别注意一下:如果使用了方案2,如果仅仅只写@ComponentScan({"com.demo.somethingelse"})将导致com.demo.springboot包下的类无法被扫描到(框架原始的默认扫描效果无效了)
### 在某个类上使用@Component注解,表明当需要创建类时,这个被注解的类是一个候选类。就像是举手。
### @ComponentScan用于扫描指定包下的类。就像看都有哪些举手了。