@ComponentScan
@ComponentScan 作用@ComponentScan用于批量注册bean。这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean注册到spring容器中。具体需要扫描哪些包?以及这些包中的类满足什么条件时被注册到容器中,这些都可以通过这个注解中的参数动态配置。常用参数value:指定需要扫描的包,如:com.javacode2018basePackag
@ComponentScan 作用
@ComponentScan用于批量注册bean。
这个注解会让spring扫描指定包及其子包中所有的类,得到一批类的数组,然后将满足过滤器条件的类作为bean注册到spring容器中。
常用参数
- value:指定需要扫描的包
@ComponentScan({ “xxx.xxx.xxx.controller”, “xxx.xxx.xxx.service”})- basePackages:作用同value;value和basePackages不能同时存在设置,二选一
@ComponentScan(basePackages = { “xxx.xxx.xxx”})- basePackageClasses:指定一些类,spring容器会扫描这些类所在的包及其子包中的类
@ComponentScan(basePackageClasses = xxx.class)- nameGenerator:自定义bean名称生成器
- resourcePattern:扫描包中的那些资源
默认是:*/.class,即会扫描指定包中所有的class文件- useDefaultFilters:对扫描的类是否启用默认过滤器,默认为true
- includeFilters:过滤器
用来配置被扫描出来的那些类会被作为组件注册到容器中- excludeFilters:过滤器
和includeFilters作用刚好相反,用来对扫描的类进行排除的,被排除的类不 会被注册到容器中- lazyInit:是否延迟初始化被注册的bean
通过value、backPackages、basePackageClasses这3个参数来控制扫描哪些包
通过useDefaultFilters、includeFilters、excludeFilters这3个参数来控制过滤器
默认情况下,任何参数都不设置的情况下,会将@ComponentScan修饰的类(一般是程序启动类)所在的包作为扫描包;默认情况下useDefaultFilters为true,这个为true的时候,spring容器内部会使用默认过滤器,即类上有@Repository、@Service、@Controller、@Component这几个注解中的任何一个,这个类就会被作为bean注册到spring容器中。
@Component、@Repository、@Service、@Controller
@Component
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
从定义中可以看出,这个注解可以用在任何类型上面
通常情况下将这个注解用在类上面,标注这个类为一个组件,默认情况下,被扫描的时候会被作为bean注册到容器中。
value参数:被注册为bean的时候,用来指定bean的名称,如果不指定,默认为类名首字母小写。如:类UserService对应的名称为userService
@Repository
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
@AliasFor(annotation = Component.class)
String value() default "";
}
Repository上面有@Component注解。
value参数上面有@AliasFor(annotation = Component.class),设置value参数的时候,也相当于给@Component注解中的value设置值。
Service、@Controller源码和@Repository源码类似。
这4个注解本质上是没有任何差别,都可以用在类上面,表示这个类被spring容器扫描的时候,可以作为一个bean组件注册到spring容器中。
spring容器中对这4个注解的解析并没有进行区分,统一采用@Component注解的方式进行解析,所以这几个注解之间可以相互替换。
spring提供这4个注解,是为了让系统更清晰,通常情况下,系统是分层结构的,多数系统一般分为controller层、service层、dao层。
@controller通常用来标注controller层组件,@service注解标注service层的组件,@Repository标注dao层的组件,这样可以让整个系统的结构更清晰,当看到这些注解的时候,会和清晰的知道属于哪个层,对于spring来说,将这3个注解替换成@Component注解,对系统没有任何影响。
更多推荐
所有评论(0)