@adamhand
2019-03-28T13:56:03.000000Z
字数 1536
阅读 1225
spring boot中总是会有一个启动类:
@SpringBootApplicationpublic class GooseyApplication {public static void main(String[] args) {SpringApplication.run(GooseyApplication.class, args);}}
其中@SpringBootApplication注解和SpringApplication.run()与spring boot的启动关系很大。
ctrl+左键点开该注解,可以看到该注解又被包括几个注解:
@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 {
spring boot官方文档说@SpringBootApplication等同于@Configuration+ @EnableAutoConfiguration+@ComponentScan。所以,上面几个比较重要的注解有三个:
@SpringBootConfiguration(@SpringBootConfiguration用@Configuration)@EnableAutoConfiguration@ComponentScan@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,可以作为bean被注册到IoC容器中。spring boot推荐使用注解的方式。
XML跟config配置方式的区别:
而基于JavaConfig的配置方式是这样:
而基于JavaConfig的配置形式是这样的:
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
而基于JavaConfig的配置形式是这样的:
如果一个bean的定义依赖其他bean,则直接调用对应的JavaConfig类中依赖bean的创建方法就可以了。
@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。