上一篇我们简单介绍了Spring Boot的基本信息,以及动手搭建了第一个Spring Boot应用,也发现了Spring Boot惊人的配置简化,下面我们通过学习Spring Boot的核心注解以及配置,来了解Spring Boot为什么能做到如此精简。
一、入口类和@SpringBootApplication
Spring Boot的项目一般都会有"Application"的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解,我们打开@SpringBootApplication注解的源码可以看到:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public @interface SpringBootApplication {
Class<?>[] exclude() default {};
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}
@SpringBootApplication本身就是一个注解,而它的注解描述上又有许多的注解定义,这叫“组合注解”,引用了@SpringBootApplication注解,其本身的注解也是全部生效的。
在上面的注解解释分别如下:
(1)@Target(ElementType.TYPE)
@Target表示注解的作用目标,ElementType指作用目标的类型:
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
(2)@Retention(RetentionPolicy.RUNTIME)
@Retention代表注解的保留位置,其中的RetentionPolicy代表保留规则:
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
(3)@Documented
说明该注解将被包含在javadoc中
(4)@Inherited
说明子类可以继承父类中的该注解
(5)@SpringBootConfiguration
对于“@SpringBootConfiguration”注解,打开其源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
我们可以发现它也是一个“组合注解”,不难发现它其实就是对@Configuration的包装 我们可以认为是@Configuration注解。在项目中推荐使用@SpringBootConfiguration替代@Configuration注解。
(6)@EnableAutoConfiguration
该注解表示“开启自动配置”。我们前面提到过,我们在Spring Boot中没有配置Tomcat容器(包括端口)、dispatcherServlet等MVC组件加载信息,Web.xml文件等,使其都是指定了该注解后,Spring Boot帮我们初始化的。
当我们启用了@EnableAutoConfiguration注解,启动自动配置后,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项。如:我们添加了spring-boot-starter-web的依赖,项目中也就会引入SpringMVC的依赖,Spring boot就会自动配置tomcat和SpringMVC:
其实还有其它许多Web需要的核心的依赖,感兴趣的童鞋可以详细的浏览一下。
(7)@ComponentScan
该注解会自动扫描包路径下面的所有@Controller、@Service、@Repository、@Component 的类,不配置包路径的话,在Spring Boot中默认扫描@SpringBootApplication所在类的同级目录以及子目录下的相关注解。
以上就是核心注解@SpringBootApplication的介绍。
二、关闭自动配置
通过上面的描述,我们可以知道,Spring Boot会根据项目中配置的jar包依赖,自动做出配置,而Spring Boot支持的配置非常多,我们可以在样例工程下观察引入的spring-boot-autoconfigure依赖,下面引入了非常多的依赖:
很多时候,我们也许不需要这么多的依赖引入,此时我们可以关闭自动配置来解决这个问题。
例如我们不需要自动配置Redis,可以这样设置:
package cn.springboot.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
@SpringBootApplication(exclude={RedisAutoConfiguration.class})
//Sprnig Boot项目的核心注解,主要目的是开启自动配置
public class SpringbootTestSimpleApplication {
//该main方法作为项目启动的入口
public static void main(String[] args) {
SpringApplication.run(SpringbootTestSimpleApplication.class, args);
}
}
即使用“exclude”参数来排除不需要的自动配置依赖。
三、自定义Banner
我们启动Spring Boot的项目后,在控制台上可以看到Spring Boot的字符画:
这个字符画就是Spring Boot的Banner,我们是可以自定义该字符画的。
首先我们来定义一个字符画,推荐一个网站:http://www.bootschool.net/ascii
打开后,我们随便输入一串字,例如“Hello World”:
我们将该字符画存储到一个txt中,然后保存为“banner.txt”的文件,放入测试工程的resources静态资源文件夹下:
然后重启项目,会看到banner已经变成我们自定义的了:
是不是很有意思~
当然我们也可以关闭banner,在启动类中,定义一个SpringApplication,将其banner属性设置为“Mode.off”即可:
package cn.springboot.test;
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//Sprnig Boot项目的核心注解,主要目的是开启自动配置
public class SpringbootTestSimpleApplication {
//该main方法作为项目启动的入口
public static void main(String[] args) {
//SpringApplication.run(SpringbootTestSimpleApplication.class, args);
SpringApplication springApplication = new SpringApplication(SpringbootTestSimpleApplication.class);
springApplication.setBannerMode(Mode.OFF);
springApplication.run(args);
}
}
参考:
传智播客《Spring Boot实战与原理分析》视频课程
(https://pan.baidu.com/s/1o9M2bGI 密码:jxg8)
转载请注明出处:https://blog.csdn.net/acmman/article/details/81636291