SpringBoot 项目有一个主程序入口类,即SpringBoot应用的启动类:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
分析下@SpringBootApplication注解
它也是一个组合注解,进入后可看到:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
其中有四个注解都是Java当中的元注解(用来修饰注解的,是注解的注解):
@Target({ElementType.TYPE}):
使用范围接口、类、枚举、注解
@Retention(RetentionPolicy.RUNTIME):
@Retention是用来修饰注解的生命周期的,RetentionPolicy.RUNTIME代表的是不仅被保存到class文件中,jvm加载class文件之后,也依然存在!
@Documented:
Documented.java 类位于 JDK 的 rt.jar 内,属于一个 JDK 注解。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented 作用
被 @Documented 修饰的注解将包含在 JavaDoc 中 。此注解会被javadoc工具提取成文档。常见注解基本都被 @Documented 修饰
@Inherited:
如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解。
@Deprecated是用来标注某个类或者方法不建议再继续使用
重点分析@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。
@SpringBootConfiguration
@SpringBootConfiguration是SpringBoot项目的配置注解,这也是一个组合注解,SpringBootConfiguration注解可以用java代码的形式实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
进入后看到:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
1.1 @Configuration
代表当前是一个配置类。
具体可参照前文:08、底层注解-@Configuration详解
1.2 @ComponentScan
用于扫描包上的注解将组件加载到IOC容器中。
它的出现主要是对标xml的配置文件中的component-scan标签,现在通常使用注解的形式注册bean。
@ComponentScan还有个父亲是@ComponentScans;用于存放多个@ComponentScan注解。
@ComponentScan注解只能使用在有@Configuration配置注解的地方,因为component-scan标签必须存在于xml配置文件中;而在脱离xml使用时,需要使用带有在@Configuration配置注解上。并不局限与一定是 @Configuration也可以是@SpringBootConfiguration…
作用:扫描被@Controller、@Service、@Repository、@Component等注解标注的类。
SpringBoot的主启动类中的@SpringBootApplication会自动扫描主启动类所在的包
@EnableAutoConfiguration
启用 Spring Application Context 的自动配置,自动配置类通常根据您的类路径和您定义的 bean 应用,尝试猜测和配置您可能需要的 bean。例如,如果您的类路径中有tomcat-embedded.jar ,您可能需要一个TomcatServletWebServerFactory (除非您已经定义了自己的ServletWebServerFactory bean)。
主要常用的是这几个属性:
basePackages和value属性是同一个,指扫描哪写包下的组件注解。
basePackageClasses属性:扫描指定的类,该类有组件注解才能被扫描到。
useDefaultFilters属性:使用默认的过滤机制,常常搭配下面两个属性一起使用。
includeFilters属性:扫描哪些注解。
excludeFilters属性:不扫描哪些组件。
lazyInit属性:由于是包扫描一次性的,那么无法单独配置哪个组件是否懒加载,因此提供该属性用于声明是否开启懒加载。
继续进入:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
重点分析@AutoConfigurationPackage,@Import(AutoConfigurationImportSelector.class)。
2.1 @AutoConfigurationPackage
标签名直译为:自动配置包,指定了默认的包规则。
作用:指定springboot扫描包,默认就是扫描启动类同包下的类。可以通过@AutoConfigurationPackage来附加其他路径,然后springboot同样会进行扫描。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)//给容器中导入一个组件
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
可以看到除了4个元注解外,核心是这个注解:
@Import({AutoConfigurationPackages.Registrar.class})
Registrar是AutoConfigurationPackages当中的一个内部类,注意这个类实现了ImportBeanDefinitionRegistrar接口。通过@Import注入对象一共有四种方式,通过ImportBeanDefinitionRegistrar接口的实现类注入就是其中一种方式!
利用Registrar给容器中导入一系列组件
将指定的一个包下的所有组件导入进MainApplication所在包下。
————————————————
引用原文:https://blog.csdn.net/weixin_43808717/article/details/118179660
引用原文:https://blog.csdn.net/weixin_43808717/article/details/118179660
引用原文:https://blog.csdn.net/weixin_43888891/article/details/127478734
原文链接:https://blog.csdn.net/sl285720967/article/details/105717370