目录
前言
在注解开发中,如何进行组件的注册、组件扫描及注意点。
一、注解开发如何注册组件
在初学spring时,教程里面通常开篇一个xml文件,然后就嘎嘎造bean,但是有些同学可能不是科班出身,有时候连xml命名空间的概念是啥都不知道,这导致他们就稀里糊涂的写,一般老师或者教程这里也都跳过,不是他们不说,实在是这里展开说实在太费事了。
另外在实际开发中,无论是传统的springMVC项目还是现在流行的springboot项目,现在几乎已经没有使用xml的方式注册组件的了(说出去让人笑话)。
现在让我们来看看如何利用注解来注册组件。
如果我们要用注解来注册一个组件,通常是使用@Configuration、@Controller、@Service、@Repository以及@Component五大注解,值得注意的是@Configuration注解,它是特殊的,看代码:
@Configuration
/*@ComponentScan(value = "com.motionlesstar",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Repository.class),
@ComponentScan.Filter()
})*/
public class Config {
@Bean(value = "person")
public Person getPerson() {
return new Person("zhangsan", 23);
}
}
@Controller
public class PersonController {
}
-------------------------------
@Service
public class PersonService {
}
-------------------------------
@Repository
public class PersonDao {
}
我这里分别用上述四个注解注册了4个组件,但是当我们获取spring容器中的组件时却发现
除了spring框架自己的组件外,我们所注册的只有config及config内部的bean被注册进来了。有同学就要说了,不是要有@ComponentScan注解扫描才能被注册进spring容器的吗?而这也是我正要说的,@Configuration注解不是@ComponentScan注解扫描进容器的,参考chatGPT的说法:
@Configuration注解的类会被Spring自动注册,是因为在Java配置中,使用@Configuration注解的类表示一个配置类,它可以包含@Bean注解的方法,用于定义和初始化Bean 。Spring框架在收集Bean的时候,会扫描所有使用了@Configuration注解的类,对其中所有由@Bean注解的方法进行处理,并将这些Bean注册到Spring的IoC容器中。因此,使用@Configuration注解的类可以为Spring提供Bean的定义,使Spring能够自动创建Bean实例,并在需要时自动注入它们。
所以,当我们给一个类写上@Configuration注解后,不需要其他动作,该类就会被注册进spring容器。
二、注解开发扫描组件初探
与@Configuration注解不同,@Controller、@Service、@Repository以及@Component这四个注解是需要由@ComponentScan注解扫描进spring容器的。
@Configuration
@ComponentScan(value = "com.motionlesstar",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Repository.class),
@ComponentScan.Filter()
})
public class Config {
@Bean(value = "person")
public Person getPerson() {
return new Person("zhangsan", 23);
}
}
运行后:
可以看到,在@Configuration注解中,我们可以指定包扫描路径,在控制台也看到了组件除了Dao层都已经被注册进spring容器了,那为什么唯独不见Dao层组件呢,这是因为@Configuration注解给我们提供了一个功能,可以定制化扫描组件,这使得我们在实际开发中可以灵活的扫描组件,我们下章再聊。