首页 > 编程知识 正文

Spring Boot常用注解总结,spring中aop常用注解

时间:2023-05-03 07:50:24 阅读:198015 作者:4749

Spring Boot是Spring框架对“约定优于配置(Convention Over Configuration)”理念的最佳实践产物。一个典型的Spring Boot应用本质上就是一个基于Spring框架的应用。Spring Boot使用注解的方式对Bean和配置进行收集,注册,分析和组装。简化了基于XML配置文件的开发。能够快速地构建出一个应用程序。以下注释基于Spring Boot 1.5.8.RELEASE。

一 Spring Boot基础注解

通过以下注解,也可以了解Spring Boot的工作机制。

1. @SpringBootApplication

该注解是启动Spring Boot应用的注解,实际上它是一个复合Annotation。其实现如下:

@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 { ......}

这其中我们需要关注的,只有三个Annotation:

@SpringBootConfigration

@EnableAutoConfiguration

@ComponentScan

如果我们使用以上三个annotation替换@SpringBootAnnotation,则与之前功能对等。

1)@SpringBootConfiguration @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface SpringBootConfiguration {}

该注解继承自@Configuration,两者的功能也一致,就是标注当前类为一个配置类。会将当前类声明的一个或多个以@Bean注解标记的方法实例纳入到Spring容器中,并且实例名就是方法名。

其父注解@Configuration就是JavaConfig形式的Spring Ioc容器配置类使用的那个@Configuration。Spring Boot启动时,需要加载的IoC容器的配置即由此定义。

2)@EnableAutoConfiguration

@EnableAutoConfiguration的理念就是借助@Import的支持,收集和注册特定场景相关的Bean的定义。比如:

@EnableScheduling是通过@Import将Spring调度框架相关的Bean定义加载到IoC容器。@EnableCaching是通过@Import将Spring缓存框架(如Guava等)相关的Bean定义加载到IoC容器。

而@EnableAutoConfiguration也是借助@Import的帮助,将所有复合自动配置条件的Bean定义加载到IoC容器。仅此而已。

该注解定义如下:

@SuppressWarnings("deprecation")@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { ......}

其中最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector这个类,@EnableAutoConfiguration可以帮助Spring Boot应用将符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

具体的加载方式是通过SpringFactoriesLoader从指定的配置文件:META-INF/spring.factories加载配置。

所以,@EnableAutoConfiguration自动配置就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总并加载到IoC容器中。

3)@ComponentScan

@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或Bean定义,并最终将这些Bean定义加载到容器中。其作用是:

自动扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入Spring IoC容器。通过includeFilters加入扫描路径下没有以上注解的类加入spring容器。通过excludeFilters过滤出不用加入spring容器的类。2. @Conditional

在Spring框架中,我们可使用@Conditional配合@Configuration或者@Bean等注解来干预一个配置或者Bean定义是否生效,其最终实现效果或者语义如下:

if(符合@Conditional规定的条件) { 加载当前配置或者注册当前Bean定义;}

要实现基于条件的配置,我们只需要通过@Conditional指定自己的Condition实现类就可以了:

@Conditional({TheCondition1.class, TheCondition2.class, ...})

@Conditional可以作为父注解来标注其他注解实现类,从而构建各种各样的复合注解。SpringBoot实现了一批这样的注解用于简化开发:

@ConditionalOnClass@ConditionalOnBean@ConditionalOnMissingClass@ConditionalOnMissingBean@ConditionalOnProperty......

有了这些复合注解的配合,我们就可以结合@EnableAutoConfiguration实现基于条件的自动配置了。这也就是所谓的“智能”自动配置。

3. @AutoConfigureBefore/@AutoConfgureAfter

在实现自动配置的过程中,除了基于条件配置,我们还需要提供配置或组件加载的顺序,从而让这些配置或者组件之间的依赖分析和组装可以顺利完成。

@AutoConfigureBefore让当前配置或组件在某个组件之前运行。

@AutoConfigureAfter让当前配置或组件在某个组件之后运行。

4. @Value

在Spring Boot中,有些变量需要根据需要配置在application.properties中,那我们可以通过@Value注解读取这些变量并注入。该注解可以注入:

普通字符串:@Value("This is a normal string") private String normalString;操作系统属性:@Value("#{systemProperties['os.name']}") private String osName;表达式结果:@Value("#{ T(java.lang.Math).random() * 20.0 }") private double theNum;文件资源:@Value("classpath:WEB-INF/spring.properties") private Resource resourceFile;URL资源:@Value("http://www.baidu.com") private Resource baiduUrl;其他Bean属性:@Value("#{otherBean.thatProperty}") private String propertyFromOtherBean;

其中在application.properties文件中配置的变量,Spring Boot在启动时自动加载。如果是自定义属性的文件应该如何加载呢?

5. @PropertySource

@PropertySource用于读取指定目录下的文件,并加载。如:

@PropertySource(value = {"classpath:system-config.properties"},encoding="utf-8")

6. @Autowired

@Autowired是Spring 3.0引入的一个注解,可以标注在类的属性上,这样Spring容器就会以byType的方式来注入对应的Bean。

如果某个Type实现了多个Bean,则使用@Autowired时,需要根据@Qualifier注解来指定需要注入哪个实现类。也可以采用List或Map的方式将所有实现类一起注入。如果注入的是Map,则key为该Bean的id。

7. @Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。

@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为Bean的名字,而type属性则解析为Bean的类型。所以:

如果使用name属性,则使用byName的自动注入策略.而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。8. @Component

@Component用于将类实例化并注入IoC中。其他注解@Controller,@Service,@Respository的用法跟@Component差不多,比@Component带有更多的语义,他们分别对应了控制层,业务层和持久层的类。

二 Spring Boot Web相关注解 1. @RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 该注解有六个属性:

params:指定request中必须包含某些参数值是,才让该方法处理。headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。value:指定请求的实际地址,指定的地址可以是URI Template 模式method:指定请求的method类型, GET、POST、PUT、DELETE等consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回2. @RequestParam

该注解用在方法的参数前面。其作用是获取request.getParameter(方法参数)的值,并将取得的值付给该参数。

3. @PathVariable

路径变量。参数与大括号里的名字一样要相同。如:

@RequestMapping("user/get/user/{address}")public String getByUserAddress(@PathVariable String address){  //do something;} 4. @ResponseBody

使用@ResponseBody表示该方法的返回结果直接写入HTTP response body中。

5. @RequestBody

@RequestBody用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。