SpringBoot(2)、简单使用SpringBoot

尽量不用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

推荐阅读更多精彩内容