太厉害了!终于有人把Spring Boot常用注释讲明白了!

643 阅读7分钟

前言

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

Java学习笔记共享地址:spring boot的核心技术100多页学习笔记

Spring Boot 被认为是 Spring MVC 的“接班人”,它可以帮我们自动配置,如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用自己的配置。另外,Spring Boot 还集成了嵌入式的 Web 服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序。

1、@Conditional

可以控制更为复杂的配置条件。在Spring内置的条件控制注解不满足应用需求的时候,可以使用此注解定义自定义的控制条件,以达到自定义的要求。

示例:

@Conditioanl(CustomConditioanl.class)
CustomProperties addCustomProperties(){
 //...
}/2

2、@ConditionalOnResource

用于检测当某个配置文件存在使,则触发被其标注的方法,下面是使用此注解的代码

示例:

@ConditionalOnResource(resources = "classpath:website.properties")
Properties addWebsiteProperties(){
 //...
}

3、@ConditionalOnClass与@ConditionalOnMissingClass

这两个注解属于类条件注解,它们根据是否存在某个类作为判断依据来决定是否要执行某些配置。

示例:

@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoConfiguration {
 //...
}

4、@SpringBootApplication

注解是一个快捷的配置注解,在被它标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。此注解相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。

在Spring Boot应用程序的主类中,就使用了此注解。

示例:

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

5、@Autowired

@Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上,作用于构造函数

示例:

@RestController
public class userController {
	private UserService userService;
	@Autowired
	UserController(userService userService){
		this.userService = userservice;
	}
}

6、@Primary

当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。

示例:

7、Scops注解

@Scope注解可以用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围。@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。这里以prototype为例子进行讲解。

当一个Spring Bean被声明为prototype(原型模式)时,在每次需要使用到该类的时候,Spring IoC容器都会初始化一个新的改类的实例。在定义一个Bean时,可以设置Bean的scope属性为

prototype:scope=“prototype”

也可以使用@Scope注解设置

@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE)

两种不同的方式来使用@Scope注解,示例:

8、@RequestBody

在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。

示例:

9、@PostMapping

@PostMapping注解用于处理HTTP POST请求,并将请求映射到具体的处理方法中。@PostMapping与@GetMapping一样,也是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.POST)的快捷方式。

示例:

10、@DeleteMapping

@DeleteMapping注解用于处理HTTP DELETE请求,并将请求映射到删除方法中。@DeleteMapping是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。

示例:

11、@ResponseBody

@ResponseBody会自动将控制器中方法的返回值写入到HTTP响应中。特别的,@ResponseBody注解只能用在被@Controller注解标记的类中。如果在被@RestController标记的类中,则方法不需要使用@ResponseBody注解进行标注。@RestController相当于是@Controller和@ResponseBody的组合注解。

示例:

12、@ResponseStatus

注解可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,我们可以使用HttpStauts类对该注解的value属性进行赋值。

示例:

13、@RequestParam

注解用于将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值。

示例:

14、@Controller

是@Component注解的一个延伸,会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。

示例:

15、@ModelAttribute

可以通过模型索引名称来访问已经存在于控制器中的model

示例:

与@PathVariable和@RequestParam注解一样,如果参数名与模型具有相同的名字,则不必指定索引名称,简写示例如下:

如果使用@ModelAttribute对方法进行标注,Spring会将方法的返回值绑定到具体的Model上

示例:

在Spring调用具体的处理方法之前,被@ModelAttribute注解标注的所有方法都将被执行。

16、@Component

注解用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。

示例:

17、@Repository

是@Component注解的延伸,与@Component注解一样,被此注解标注的类会被Spring自动管理起来,@Repository注解用于标注DAO层的数据持久化类。

示例:

18、@DependsOn

可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象

示例:


Spring boot 返回 json 数据

在做如下操作之前,我们对之前的 Hello 进行简单的修改,我们新建一个包 com.hpit.test.web 然后新建一个类 HelloControoler, 然后修改 App.java 类,主要是的这个类就是一个单纯的启动类。

主要代码如下:

iackage com.hpit; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Hello world!
*/

//其中@SpringBootApplication 申明让 spring boot 自动给程序进行必要的配置,等价于以默认属性使用
//@Configuration,@EnableAutoConfiguration 和@ComponentScan
//@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
} }
com.hpit.test.web.HelloController :
package com.hpit.test.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController// 标记为:restful
public class HelloController {
@RequestMapping("/")
public String hello(){
return"Hello world!"; } }

我们在编写接口的时候,时常会有需求返回 json 数据,那么在 spring boot 应该怎么操作呢?主要是在 class 中

加入注解@RestController,。

返回 JSON 之步骤:

(1)编写一个实体类 Demo

(2)编写 DemoController;

(3)在 DemoController 加上@RestController 和@RequestMapping 注解;

(4)测试

具体代码如下:

com.hpit.test.bean.Demo :
package com.hpit.test.bean;
/**
* 测试实体类. * @author Administrator
*
*/
public class Demo {
  private longid;//主键.
private String name;//测试名称.
public long getId() {
returnid; }
public void setId(longid) {
this.id = id; }
public String getName() {
returnname; }
publicvoid setName(String name) {
this.name = name; } }
com.hpit.test.web.DemoController:
package com.hpit.test.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hpit.test.bean.Demo;
/**
* 测试. * @author Administrator
*
*/
@RestController
@RequestMapping("/demo")
public class DemoController {
/**
* 返回 demo 数据: * 请求地址:http://127.0.0.1:8080/demo/getDemo
* @return
*/
@RequestMapping("/getDemo")
public Demo getDemo(){
  Demo demo = new Demo();
demo.setId(1);
demo.setName("Zjs");
return demo; } }

那么在浏览器访问地址:http://127.0.0.1:8080/demo/getDemo 返回如下数据: { id: 1, name: "Zjs" }

是不是很神奇呢,其实 Spring Boot 也是引用了 JSON 解析包 Jackson,那么自然我们就可以在 Demo 对象上使用 Jackson 提供的 json 属性的注解,对时间进行格式化,对一些字段进行忽略等等。

Spring boot 导入 spring XML 配置文件

在 App.java 类编写 HelloService2;

首先我们这里有几个包:com.hpit,org.hpit,我们这里打算把 App.java 启动类放到 com.hpit 中,根据 SpringBoot 扫描(根包到子包的原则),我们把 HelloService2 写在 Spring Boot 可以扫描的位置,HelloService 写在Spring Boot 无法扫描到的位置,那么我们使用配置文件 bean 的方式进行引入,具体代码如下:

1.创建一个 App 默认无法扫描到的 bean

package org.hpit.demo.service;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
/**
* TODO 当前类无法被App扫描到将被配置在applicationContext.xml中 * @author 郑江山
*
*/
@Service("helloService")
public class HelloService {
private Logger logger = Logger.getLogger(getClass());
public void hello() {
logger.info("这个bean是springboot默认情况下无法扫描到的"); } }

2.在 resource 下创建 spring 传统配置文件 applicationContext.xml(名字任意)

src/main/resource/applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 在传统spring配置文件中托管springboot默认无法扫描到的bean --> <bean id="helloService" class="org.hpit.demo.service.HelloService"></bean>
</beans>

3.创建一个系统启动任务类,用于测试 App 无法扫描到的 Bean 是否能自动装配

com.hpit.springboot03.runner.TestXMLBeanRunner

package com.hpit.springboot03.runner;
import javax.annotation.Resource;
import org.hpit.demo.service.HelloService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* TODO 测试App无法扫到的Bean是否能引入
** @author 郑江山
*
*/
@Component
@Order(value = 1)
public class TestXMLBeanRunner implements CommandLineRunner { @Resource
private HelloService helloService;
@Override
public void run(String... arg0) throws Exception {
helloService.hello(); } }

4.在 App.java 中配置引入配置文件的注解 @ImportResource

package com.hpit.springboot03;
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource; @SpringBootApplication
@ServletComponentScan // 开始servlet扫描
@ComponentScan(basePackages = { "com.hpit" })
@ImportResource(locations = { "applicationContext.xml" }) // 导入spring配置文件 
public class App {
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args); }
// 配置文件上传 @Bean
public MultipartConfigElement multipartConfigFactory() {
MultipartConfigFactory configFactory = new MultipartConfigFactory();
configFactory.setMaxFileSize("128MB");// KB MB 设置单个上传文件大小
configFactory.setMaxRequestSize("1024MB");
configFactory.setLocation("/");// 设置文件上传路径
return configFactory.createMultipartConfig(); } }

5.启动应用,观察日志输出,发现系统可以引入 App 无法扫描到的 bean