Springboot相关注解的介绍

独自空忆成欢 提交于 2020-02-07 15:49:03

1,@SpringBootApplication标注一个主程序类,表示这是一个Springboot应用

  • @SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
package cn.xxxxxx.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * springBootApplication:标注一个主程序类,表示这个是一个Springboot应用
 */

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {
        //启动
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}
  • @SpringBootApplication注解的源码如下
@Target({ElementType.TYPE})    //可以给一个类型进行注解,比如类、接口、枚举
@Retention(RetentionPolicy.RUNTIME)    //可以保留到程序运行的时候,它会被加载进入到 JVM 中
@Documented    //将注解中的元素包含到 Javadoc 中去。
@Inherited    //继承,比如A类上有该注解,B类继承A类,B类就也拥有该注解

@SpringBootConfiguration

@EnableAutoConfiguration

/*
*创建一个配置类,在配置类上添加 @ComponentScan 注解。
*该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>。
*/
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication

 

2,@RestController是@ResponseBody和@Controller的结合体的缩写,一般写在Controller里面

  • @Controller表明该类所有的方法返回页面路径,但是在方法上加了@ResponseBody后,该方法返回的是数据。
  • @RestController则相当于@Controller和@ResponseBody同时使用的效果,返回的也是数据,不是界面
package cn.xxxxxx.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * RestController:是spring4里的新注解,是@ResponseBody和@Controller的缩写。
 */

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello SpringBoot,this is my first Application";
    }
}

3,@SpringBootConfiguration:SpringBoot的配置类,表示这是一个SpringBoot的配置类

 @Configuration
 public @interface SpringBootConfiguration

4,@Configuration配置类上面来标注这个注解

@Configuration  
public class ExampleConfiguration {  
  
    @Value("com.mysql.jdbc.Driver")  
    private String driverClassName;  
  
    @Value("jdbc://xxxx.xx.xxx/xx")  
    private String driverUrl;  
  
    @Value("${root}")  
    private String driverUsername;  
  
    @Value("123456")  
    private String driverPassword;  
  
    @Bean(name = "dataSource")  
    public DataSource dataSource() {  
        BasicDataSource dataSource = new BasicDataSource();  
        dataSource.setDriverClassName(driverClassName);  
        dataSource.setUrl(driverUrl);  
        dataSource.setUsername(driverUsername);  
        dataSource.setPassword(driverPassword);  
        return dataSource;  
    }  
  
    @Bean  
    public PlatformTransactionManager transactionManager() {  
        return new DataSourceTransactionManager(dataSource());  
    }  
  
}

5,@EnableAutoConfiguration:开启自动配置功能;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;

6,@Import:Spring的底层注解@Import,给容器中导入一个组件

7,@Import({AutoConfigurationImportSelector.class})

AutoConfigurationImportSelector.class将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;

8,

  @ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件值注入有两种方式,一个是Spring Boot的@ConfigurationProperties注解,另一个是spring原先的@value注解。

  1. 松散绑定:

    例如Person中有lastName属性,在配置文件中可以写成lastNamelastnamelast-namelast_name等等,不需要完全一样就可以匹配成功

  2. SpEL 参考链接

    ## properties配置文件
    persion.age=#{2019-1986+1}
    
    # Person类
    #--------------------使用@ConfigurationProperties注解,会抛出异常--------------------
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
        private Integer age;
    
    
    #--------------------使用@value注解 OK--------------------
    @Component
    public class Person {
        @Value("${person.age}")
        private Integer age;
  3. JSR303数据校验       @ConfigurationProperties支持校验,如果校验不通过,会抛出异常;@Value不支持

  4. 复杂类型封装      @value注解无法注入map等复杂类型,但list、数组可以

9,@PropertySource注解的作用是加载指定的配置文件,值可以是数组,也就是可以加载多个配置文件

springboot默认加载的配置文件名是application,如果配置文件名不是这个是不会被容器加载的,所以这里Person并没有被注入任何属性值,可以使用@PropertySource加载我们指定的配置文件

使用@PropertySource({"classpath:person.properties"})指定加载person.properties配置文件

注意:使用这个注解加载配置文件就需要配置类使用@component等注解而不是等待@EnableConfigurationProperties,而且不支持yaml,只能是properties

10,@ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml)。Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别,想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上。而且,注解必须写在主入口函数上,不可以是测试类。

11,@Bean

package cn.clboy.helloworldquickstart.config;

import cn.clboy.helloworldquickstart.model.Pet;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
 */


@Configuration
public class BeanConfiguration {

    /**
     *相当于在配置文件中用<bean><bean/>标签添加组件
     */
    @Bean
    public Pet myPet() {
        Pet pet = new Pet();
        pet.setName("嘟嘟");
        pet.setAge(3);
        return pet;
    }
}

12,随机占位符

${random.value}
${random.int}
${random.long}
${random.int(10)}
${random.int[1024,65536]}

使用方式如下,

  • 可以引用在配置文件中配置的其他属性的值,如果使用配置文件中未定义属性,则会原样输出。
  • 可以使用:指定默认值,比如person.pet.name=${person.last-name:小明}的小黑

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!