SpringBoot(2)、简单使用SpringBoot

作者: 编程界的小学生 | 来源:发表于2017-04-03 19:29 被阅读148次

    尽量不用default包
    通常不推荐用default package,是因为对于@ComponentScan、@EntityScan或@SpringBootApplication注解的SpringBoot应用来说,他会扫描每个jar中的类,这可能导致一定的问题。

    main类
    建议将应用的main类放到其他类所在包的顶层包下。并将@EnableAutoConfiguration注解到你的main类上,这样就隐士地定义了一个基础的包搜索路径,以搜索某些特定的注解实体(如@Service,@Component等)。例如,你正在编写一个ssh应用,Spring将搜索@EnableAutoConfiguration注解的类所在包下的@Entity实体。
    采用root package方式,你就可以用@ComponentScan注解而不需要指定basePackage 属性,也可以用@SpringBootApplication注解,只要将main类放到root package下即可。

    package day02;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    禁用特定的自动配置项
    若发现启用了不想要的自动配置项,可以使用
    @EnableAutoConfiguration注解的exclude属性禁用他们:

    package day02;
    
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
    public class MyConfiguration {
    
    }
    

    如果该类不在classpath中,你可以使用该注解的excludeName属性,并指定全限定类名达到相同的 效果。

    SpringBeans和依赖注入
    若遵循我上面说的将应用的main类放到包的最上层,那么你就可以添加@ComponentScan注解而不需要任何参数,所有应用组件(@Component、@Service、@Repository、@Controller等)都会自动注册成Spring Beans。

    使用SpringBootApplication注解
    通过上面的Demo不难发现,要配置一个应用main类需要写三四个注解才能用,太麻烦了,这时候@SpringBootApplication注解就派上用场了,SpringBoot使用@SpringBootApplication注解代替@Configuration、@EnableAutoConfiguration、@ComponentScan
    如下代码:

    package day02;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    //@Configuration
    //@EnableAutoConfiguration
    //@ComponentScan
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    补充:为什么一个注解就代替了三个?
    我看到一个代替了三个很是不服,于是乎我就看了下源码,如下:

    @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初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
    欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:SpringBoot(2)、简单使用SpringBoot

        本文链接:https://www.haomeiwen.com/subject/wyyoottx.html