zoukankan      html  css  js  c++  java
  • 太厉害了!终于有人把Spring Boot常用注释讲明白了!

    前言

    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

  • 相关阅读:
    Apache httponly Cookie泄露

    shell脚本
    Linux与windows的文件系统结构
    使用rsync进行远程同步
    电子邮件服务
    httpd虚拟主机
    Enpass 基于 Mezzanine
    powershell: 生成随机字符串
    thinkPHP5.x 更新字段为 NULL
  • 原文地址:https://www.cnblogs.com/QLCZ/p/15096487.html
Copyright © 2011-2022 走看看