您现在的位置是:首页 >技术杂谈 >Java-Spring注解详解网站首页技术杂谈

Java-Spring注解详解

吾友客 2024-07-11 18:01:02
简介Java-Spring注解详解

目录

一、@Configuration:

二、@Value:

三、@Controller、@RestController:控制器注解;

四、@Service:服务层注解

五、@Repository:

七、@PostConstruct:

九、@Primary: 

十、@Lazy:

十二、@Resource:

十三、@Async:

十五、@Inject:

十六、@Singleton:

十七、@Valid:

十八、@Valided:

@Valid -> JSR-303 规范标准

十九、@PathVariable:

二十、自定义注解:

二十一、@RequestParam:

二十二、@ControllerAdvice:

二十三、@CrossOrigin:

二十四、@Scope:

二十四、@ResponseStatus:

二十五、元注解:包括 @Retention @Target @Document @Inherited四种

二十六、@Scope:

二十七、Spring使用的注解大全和解释: 


一、@Configuration:

1.声明一个IOC容器,把所有标记了@Bean注解的类注入到IOC容器中去;与xml中配置的bean意思一样;程序启动就执行;

2.程序中 用@AutoWired @Resource 注解 取得用@Bean注解的bean

二、@Value

        1.从配置文件读取值的用法,也就是从application.yaml文件中获取值,即使给变量赋了初值也会以配置文件的值为准。

        2.非静态字段:直接在字段头 添加@Value(${配置的名称})

        3.静态字段:通过 实例的构造函数new出来的实例对象访问 或者 通过new一个实例对象访问实例的方法得到实例的字段;

三、@Controller、@RestController:控制器注解;

四、@Service:服务层注解

五、@Repository

        1.是标记数据访问层的组件,用来注解接口的,被spring扫描并注入到ioc容器;

        2.修饰哪个类表明这个类具有对数据库CRUD的功能,用在持久层的接口上

        3.需要配合使用MapperScannerConfigurer或者@MapperScan注解。

        4.与@Mapper 作用一致,二者取其一 或者 共用;

        6.@Repository是spring的注解,@Mapper是mybatis的注解

        7.这样可以直接在sercive类中,使用@Autowired注解,在创建一个私有的接口类对象,访问接口的实现类;

        8.Mapper:注解是由Mybatis框架中定义的一个描述数据层接口的注解,配置 mapper.xml文件使用,查询数据库获得数据;在启动类上添加注解,如果 每个接口都要变成实现类,只需要在启动类添加@MapperScan("接口的路径地址")

六、@Component:

        1.定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理),然后用@Autowired取出spring容器(创建一个私有的实例对象);

七、@PostConstruct:

        1.实现Bean初始化之前的自定义操作;该方法不能是 static;该方法可以是 final;

        2.只有一个非静态方法能使用此注解

        3.被注解的方法不得有任何参数,被注解的方法返回值必须为void,被注解方法不得抛出已检查异常

        4.此方法只会被执行一次

        5.执行流程:开始 -> Web容器加载Servlet -> Servlet构造函数 -> PostConstruct注解 -> Init() -> Service -> destory() -> PreDestory()注解 -> 结束

        6.执行顺序在 过滤器(filter)后面

        7.执行顺序:构造方法 > @Autowired > @PostConstruct

        8.此注解时会影响到服务的启动时间。服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包,并且可能需要与数据库交互来获取数据,然后放到缓存中。所以具体使用需要视业务场景而定

//创建一个 PostConstruct的初始化类
@Component
public class PostConstructInit {
    public static String strLoad;

    @PostConstruct
    public void initLoad() {
        strLoad = "初始化环境----frist-----success--";
        System.out.println("初始化环境----frist-----success--");
    }

    @PreDestroy
    public void loadEnd(){
        System.out.println("结束初始化环境----end-----success--");
    }
}


//controller -执行
public class TestDemo(){
    @Autowired
    private PostConstructInit postConstructInit;

    @RequestMapping("/test")
    public String test() {
        //调用@PostConstruct 的方法,加载程序初始化是的数据,如字典数据,或者缓存数据
        String strLoad = postConstructInit.strLoad;
        return strLoad;
    }
}

八、@PreDestroy:

        1.实现Bean销毁之前的自定义操作;

        2.被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。

        3.被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前

、@Primary: 

        1.自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

	//第一个类
    public interface Worker {
	    public String work();
	}
	
    //第二个类
	@Component
	public class Singer implements Worker {
	    @Override
	    public String work() {
	        return "歌手的工作是唱歌";
	    }
	}
	
    //第三个类
	@Component
    @Primary
	public class Doctor implements Worker {
	    @Override
	    public String work() {
	        return "医生工作是治病";
	    }
	}
	
	// 启动类,调用接口
	@SpringBootApplication
	@RestController
	public class SimpleWebTestApplication {
	
	    @Autowired
	    private Worker worker;
	
	    @RequestMapping("/info")
	    public String getInfo(){
	        return worker.work();//输出 医生工作是治病
	    }
	
	    public static void main(String[] args) {
	        SpringApplication.run(SimpleWebTestApplication.class, args);
	    }
	
	}

十、@Lazy:

        1.用于指定该Bean是否取消预初始化,用于注解类,延迟初始化

        2.只不过是给spring的代理对象proxy再进行了一次proxy;

        3.借用了方法invoke时通过proxy的intercept方法getTarget,然后进行方法调用,延迟了对象的注入。之后每次调用的时候都需要从Spring容器中获取到原生的proxy对象

        4.主要解决 循环依赖 报错问题

@Lazy // 延迟加载 A
@Service
public class A {
    @Autowired
    private B b;

    @Async
    public void m1() {
    }
}

@Service
public class B {
    @Autowired
    @Lazy // 延迟注入 A
    private A a;
}

十一、@Autowired:

        1.实现spring的依赖注入,自动装配,默认凭据类型注入;

        2.Spring 框架提供的注解,它可以自动装配一个 Bean,可以根据类型进行匹配,也可以根据名称进行匹配。当有多个 Bean 可以匹配时,可以使用 @Qualifier 注解指定具体的 Bean

十二、@Resource:

        1.用于依赖注入的注解, 默认根据名称装配;

        2.Java EE 提供的注解,它也可以自动装配一个 Bean,但是它只能根据名称进行匹配。如果没有指定名称,则默认使用属性名作为 Bean 的名称进行匹配。

十三、@Async:

        1.是一个异步方法;适用于异步场景,如:发邮件,导数据,同步商品等等;

        2.主启动类没有添加@EnableAsync注解

        3.被 @Async注解 修饰的方法必须不可以是static和private,必须为public

        4.需要通过 @Autowired 或 @Resource 进行注入,不可手动new

        5.被调用的@Async注解修饰的B方法,与调用者A不能存在同一个类,否则的话A方法就没有走spring代理类,没有经过Spring容器托管,从而造成了注解的失效;

@Async:异步方法
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping("/getAll")
    public String getUsers() throws ExecutionException, InterruptedException {
        System.out.println("业务开始");
        Future<String> result = userService.getUsers();
        System.out.println("业务结束");
        return result.get();
    }

}

@Service
public class UserService {

    @Async
    public Future<String> getUsers(){
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName()+"查询到了所有的用户信息!");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return new AsyncResult<>("异步任务执行好了");
    }

}

@SpringBootApplication
@EnableAsync
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

十四、@Named:

        1.定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理),然后用@Autowired取出spring容器(创建一个私有的实例对象);

        2.用法 和 @Component 一致;

十五、@Inject:

        1.实现Java EE CDI方式的依赖注入。

        2.跟 @Autowired 功能一样

十六、@Singleton:

        1.只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类。

十七、@Valid:

        1.用来校验接收参数的

        2.使用 Hibernate validation 的时候使用,是 JSR-303 规范标准注解支持

        3.可以用在方法、构造函数、方法参数和成员属性(field)上;

        4.没有分组的功能,不能进行分组校验

        5.可以进行嵌套校验,但是,需要在嵌套的字段上面加上注解;

        6.valid  ->  级联校验 也叫嵌套检测: 

//valid  ->  级联校验 也叫嵌套检测

@Data
public class Hair {
	
	@NotBlank(message = "头发长度必须提交!")
	private Double length;

  	@NotBlank(message = "头发颜色必须提交!")
  	private String color;
}

@Data
public class Person {
	
	@NotBlank(message = "用户姓名必须提交!")
	@Size(min=2, max=8)
	private String userName;

  	// 添加@Valid注解实现嵌套检测
  	@Valid
    @NotEmpty(message = "用户要有头发!")
    private List<Hair> hairs;
}
 
@PostMapping("/person")
public Result addPerson(@Valid @RequestBody Person person) {
	return Result.buildSuccess(person);
}

十八、@Valided:

        1.用来校验接收参数的

        2.是spring校验机制;

        3.可以用在类型、方法和方法参数上,不能用于成员属性(field)上

        4.提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制

        5.不能进行嵌套对象校验;

        6.分组校验顺序通过使用 @GroupSequence注解实现

        7.Validated ->  分组校验:  

//Validated-> 自定义分组校验

@RestController
@RequestMapping("/person")
public class PersonGroupController {
	
	// 不指定分组时校验
	@GetMapping("/person")
	public Result getPerson(@Validated @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}

	// 指定AddGroup分组校验
	@PostMapping("/person")
	public Result addPerson(@Validated(value = PersonGroup.AddGroup.class) @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}

	// 指定UpdateGroup分组校验
	@PutMapping("/person")
	public Result updatePerson(@Validated(value = PersonGroup.updateGroup.class) @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}
 
    // 使用GroupSequence定义分组校验顺序:按照FirstGroup,SecondGroup分组顺序进行校验
    @GroupSequence({PersonGroup.class, updateGroup.class})
    public interface Group {}
}

@Valid -> JSR-303 规范标准

注解

验证的数据类型

备注

Null

任意类型

参数值必须是 Null

NotNull

任意类型

参数值必须不是 Null

NotBlank

只能作用于字符串

字符串不能为 null,而且字符串长度必须大于0,至少包含一个非空字符串

NotEmpty

CharSequence

Collection

Map

Array

参数值不能为null,且不能为空

(字符串长度必须大于0,空字符串(“ ”)可以通过校验)

Size(min,max )

CharSequence

Collection

Map

Array

字符串:字符串长度必须在指定的范围内

Collection:集合大小必须在指定的范围内

Map:map的大小必须在指定的范围内

Array:数组长度必须在指定的范围内

Pattern(regexp)

字符串类型

验证字符串是否符合正则表达式

Min(value)

整型类型

参数值必须大于等于 最小值

Max(value)

整型类型

参数值必须小于等于 最大值

DecimalMin(value)

整型类型

参数值必须大于等于 最小值

DecimalMax(value)

整型类型

参数值必须小于等于 最大值

Positive

数字类型

参数值为正数

PositiveOrZero

数字类型

参数值为正数或0

Negative

数字类型

参数值为负数

NegativeOrZero

数字类型

参数值为负数或0

Digits(integer,fraction)

数字类型

参数值为数字,且最大长度不超过integer位,整数部分最高位不超过fraction位

AssertTrue

布尔类型

参数值必须为 true

AssertFalse

布尔类型

参数值必须为 false

Past

时间类型(Date)

参数值为时间,且必须小于 当前时间

PastOrPresent

时间类型(Date)

参数值为时间,且必须小于或等于 当前时间

Future

时间类型(Date)

参数值为时间,且必须大于 当前时间

FutureOrPresent

时间类型(Date)

参数值为时间,且必须大于或等于 当前日期

Email

字符串类型

被注释的元素必须是电子邮箱地址

十九、@PathVariable:

        1.用来指定请求URL中的变量

// 请求路径中的id必须是数字,否则寻找不到这个路径404
@GetMapping("/user/{id:\d+}")
public Result getId(@PathVariable(name="id") String userId) {
	return Result.buildSuccess(userId);
}

二十、自定义注解:

        1.自定义校验注解类需要实现ConstraintValidator<A extends Annotation, T> 接口:

                2.1.接口中第一个泛型参数表示的是自定义注解类

                2.2.接口中第二个泛型参数表示的是校验的属性的值的类型

        2.依赖 @Constraint 来 (自定义注解) 自定义注解以便进行对象属性的校验

一、自定义Xss校验注解
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
@Constraint(validatedBy = { XssValidator.class })
public @interface Xss
{
    String message()

    default "不允许任何脚本运行";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}


二、校验器
public class XssValidator implements ConstraintValidator<Xss, String>
{
    private final String HTML_PATTERN = "<(\S*?)[^>]*>.*?|<.*? />";

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
    {
        return !containsHtml(value);
    }

    public boolean containsHtml(String value)
    {
        Pattern pattern = Pattern.compile(HTML_PATTERN);
        Matcher matcher = pattern.matcher(value);
        return matcher.matches();
    }
}

二十一、@RequestParam:

        1.作用是提取和解析请求中的参数。

        2.@RequestParam支持类型转换,类型转换目前支持所有的基本Java类型

        3.使用方法:@RequestParam([value="number"], [required=false]) String number

二十二、@ControllerAdvice:

        1.注解只能处理进入控制器方法抛出的异常

二十三、@CrossOrigin:

1.注解:是Cross-Origin ResourceSharing(跨域资源共享)

@CrossOrigin
 public class TestController extends BaseController {
     .......
 }

二十四、@Scope:

        1.配置bean的作用域。默认是单例模式,即@Scope("singleton")

二十四、@ResponseStatus:

        1.用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,当处理器的方法被调用时,返回 指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息

@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="出现了错误")
 public class UserException extends RuntimeException{
     ......
 }


@ControllerAdvice
 @Component
 public class GlobalExceptionHandler {
     @Bean
     public MethodValidationPostProcessor methodValidationPostProcessor() {
         return new MethodValidationPostProcessor();
     }
 @ExceptionHandler
 @ResponseBody
 @ResponseStatus(value=HttpStatus.BAD_REQUEST,reason="哈哈")
 public String handle(ValidationException exception) {
     System.out.println("bad request, " + exception.getMessage());
     return "bad request, " + exception.getMessage();
 }
 }

        2.上面代码方法得到调用,不论是否抛异常,都会把value和reason添加到response里

二十五、元注解:包括 @Retention @Target @Document @Inherited四种

        1.元注解是指注解的注解,比如我们看到的ControllerAdvice注解定义如下:

@Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 @Component
 public @interface ControllerAdvice {
     XXX
 }

@Retention: 定义注解的保留策略:

@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:定义注解的作用目标:

@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) ///包

@Document:说明该注解将被包含在javadoc中

@Inherited:说明子类可以继承父类中的该注解

二十六、@Scope:

        1.配置bean的作用域。默认是单例模式,即@Scope("singleton")

二十七、Spring使用的注解大全和解释 

注解

解释

@Controller

组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。

@Service

组合注解(组合了@Component注解),应用在service层(业务逻辑层)

@Reponsitory

组合注解(组合了@Component注解),应用在dao层(数据访问层)

@Component

表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。

@Autowired

Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入。)

@Resource

JSR-250提供的注解

@Inject

JSR-330提供的注解

@Configuration

声明当前类是一个配置类(相当于一个Spring配置的xml文件)

@ComponentScan

自动扫描指定包下所有使用@Service,@Component,@Controller,@Repository的类并注册

@Bean

注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。

@Aspect

声明一个切面(就是说这是一个额外功能)

@After

后置建言(advice),在原方法前执行。

@Before

前置建言(advice),在原方法后执行。

@Around

环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice)

@PointCut

声明切点,即定义拦截规则,确定有哪些方法会被切入

@Transactional

声明事务(一般默认配置即可满足要求,当然也可以自定义)

@Cacheable

声明数据缓存

@EnableAspectJAutoProxy

开启Spring对AspectJ的支持

@Value

值得注入。经常与Sping EL表达式语言一起使用,注入普通字符,系统属性,表达式运算结果,其他Bean的属性,文件内容,网址请求内容,配置文件属性值等等

@PropertySource

指定文件地址。提供了一种方便的、声明性的机制,用于向Spring的环境添加PropertySource。与@configuration类一起使用。

@PostConstruct

标注在方法上,该方法在构造函数执行完成之后执行。

@PreDestroy

标注在方法上,该方法在对象销毁之前执行。

@Profile

表示当一个或多个指定的文件是活动的时,一个组件是有资格注册的。使用@Profile注解类或者方法,达到在不同情况下选择实例化不同的Bean。@Profile(“dev”)表示为dev时实例化。

@EnableAsync

开启异步任务支持。注解在配置类上。

@Async

注解在方法上标示这是一个异步方法,在类上标示这个类所有的方法都是异步方法。

@EnableScheduling

注解在配置类上,开启对计划任务的支持。

@Scheduled

注解在方法上,声明该方法是计划任务。支持多种类型的计划任务:cron,fixDelay,fixRate

@Conditional

根据满足某一特定条件创建特定的Bean

@Enable*

通过简单的@Enable来开启一项功能的支持。所有@Enable注解都有一个@Import注解,@Import是用来导入配置类的,这也就意味着这些自动开启的实现其实是导入了一些自动配置的Bean(1.直接导入配置类2.依据条件选择配置类3.动态注册配置类)

@RunWith

这个是Junit的注解,springboot集成了junit。一般在测试类里使用:@RunWith(SpringJUnit4ClassRunner.class) — SpringJUnit4ClassRunner在JUnit环境下提供Sprng TestContext Framework的功能

@ContextConfiguration

用来加载配置ApplicationContext,其中classes属性用来加载配置类:@ContextConfiguration(classes = {TestConfig.class(自定义的一个配置类)})

@ActiveProfiles

用来声明活动的profile–@ActiveProfiles(“prod”(这个prod定义在配置类中))

@EnableWebMvc

用在配置类上,开启SpringMvc的Mvc的一些默认配置:如ViewResolver,MessageConverter等。同时在自己定制SpringMvc的相关配置时需要做到两点:1.配置类继承WebMvcConfigurerAdapter类2.就是必须使用这个@EnableWebMvc注解。

@RequestMapping

用来映射web请求(访问路径和参数),处理类和方法的。可以注解在类和方法上,注解在方法上的@RequestMapping路径会继承注解在类上的路径。同时支持Serlvet的request和response作为参数,也支持对request和response的媒体类型进行配置。其中有value(路径),produces(定义返回的媒体类型和字符集),method(指定请求方式)等属性。

@ResponseBody

将返回值放在response体内。返回的是数据而不是页面

@RequestBody

允许request的参数在request体中,而不是在直接链接在地址的后面。此注解放置在参数前。

@PathVariable

放置在参数前,用来接受路径参数。

@RestController

组合注解,组合了@Controller和@ResponseBody,当我们只开发一个和页面交互数据的控制层的时候可以使用此注解。

@ControllerAdvice

用在类上,声明一个控制器建言,它也组合了@Component注解,会自动注册为Spring的Bean。

@ExceptionHandler

用在方法上定义全局处理,通过他的value属性可以过滤拦截的条件:@ExceptionHandler(value=Exception.class)–表示拦截所有的Exception。

@ModelAttribute

将键值对添加到全局,所有注解了@RequestMapping的方法可获得次键值对(就是在请求到达之前,往model里addAttribute一对name-value而已)。

@InitBinder

通过@InitBinder注解定制WebDataBinder(用在方法上,方法有一个WebDataBinder作为参数,用WebDataBinder在方法内定制数据绑定,例如可以忽略request传过来的参数Id等)。

@WebAppConfiguration

一般用在测试上,注解在类上,用来声明加载的ApplicationContext是一个WebApplicationContext。他的属性指定的是Web资源的位置,默认为src/main/webapp,我们可以修改为:@WebAppConfiguration(“src/main/resources”)。

@EnableAutoConfiguration

此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。该注解组合了@Import注解,@Import注解导入了EnableAutoCofigurationImportSelector类,它使用SpringFactoriesLoader.loaderFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包。而spring.factories里声明了有哪些自动配置。

@SpingBootApplication

SpringBoot的核心注解,主要目的是开启自动配置。它也是一个组合注解,主要组合了@Configurer,@EnableAutoConfiguration(核心)和@ComponentScan。可以通过@SpringBootApplication(exclude={想要关闭的自动配置的类名.class})来关闭特定的自动配置。

@ImportResource

虽然Spring提倡零配置,但是还是提供了对xml文件的支持,这个注解就是用来加载xml配置的。例:@ImportResource({“classpath

@ConfigurationProperties

将properties属性与一个Bean及其属性相关联,从而实现类型安全的配置。例:@ConfigurationProperties(prefix=”authot”,locations={“classpath

@ConditionalOnBean

条件注解。当容器里有指定Bean的条件下。

@ConditionalOnClass

条件注解。当类路径下有指定的类的条件下。

@ConditionalOnExpression

条件注解。基于SpEL表达式作为判断条件。

@ConditionalOnJava

条件注解。基于JVM版本作为判断条件。

@ConditionalOnJndi

条件注解。在JNDI存在的条件下查找指定的位置。

@ConditionalOnMissingBean

条件注解。当容器里没有指定Bean的情况下。

@ConditionalOnMissingClass

条件注解。当类路径下没有指定的类的情况下。

@ConditionalOnNotWebApplication

条件注解。当前项目不是web项目的条件下。

@ConditionalOnResource

条件注解。类路径是否有指定的值。

@ConditionalOnSingleCandidate

条件注解。当指定Bean在容器中只有一个,后者虽然有多个但是指定首选的Bean。

@ConditionalOnWebApplication

条件注解。当前项目是web项目的情况下。

@EnableConfigurationProperties

注解在类上,声明开启属性注入,使用@Autowired注入。例:@EnableConfigurationProperties(HttpEncodingProperties.class)。

@AutoConfigureAfter

在指定的自动配置类之后再配置。例:@AutoConfigureAfter(WebMvcAutoConfiguration.class)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。