【Spring Boot学习总结】5.SpringBoot核心注解、配置

上一篇我们简单介绍了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

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值