SpringBoot部分注解解释及用途

1. @SpringBootApplication

参考链接:https://www.cnblogs.com/MaxElephant/p/8108140.html
     之前用户使用的是3个注解注解他们的main类。分别是:@Configuration、@EnableAutoConfiguration、@ComponentScan。由于这些注解一般都是一起使用,spring boot提供了一个统一的注解@SpringBootApplication。

     因此可以这么理解:@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。

接下来分别解释这三个注解:

  • @ComponentScan会自动扫描指定包下的全部标有@Component的类,并注册成bean,包括@Component下的子注解@Service、@Repository、@Controller。
  • @SpringBootConfiguration继承@Configuration注解,加载配置文件用的;标识这个类可以使用Spring IoC容器作为bean定义的来源。
  • @EnableAutoConfiguration能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

     笼统来说,@SpringBootApplication注解标记此类为springboot主启动类,运行这个类即启动本地服务器,并能自动扫描并使用本项目的bean。端口号为项目配置文件中设置的端口号

@SpringBootApplication	//此注解标记springboot主启动类
public class SpringbootDemo1Application {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootDemo1Application.class, args);
	}
}

2. @Controller、@RequestMapping、@ResponseBody、@RestController

参考链接:https://www.cnblogs.com/yaqee/p/11256047.html

     在一个类上添加 @Controller 注解,表明了这个类是一个控制器类,但这只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。

    @RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。
    @RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。具体的使用方法不是本次的重点,有兴趣的可以看https://www.cnblogs.com/xiepeixing/p/4243288.html

@Controller
  @RequestMapping("/user")
  public class UserController{
      @RequestMapping("/users")
      public String users() {
          return "users";
      }
  }

    此时请求users方法的url路径就是:…/user/users。

    可以看到上面users方法的返回值是字符串类型的,这个就是处理器在处理完任务后将要跳转的页面。如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。

    @ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。

    @RestController表示将该类交给spring容器进行管理,同时启动springmvc框架,用来接受用户请求,该程序该类的返回值是JSON串。如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注 @RestController ,而不用在每个方法中标注@ResponseBody,简化了开发过程。

@RestController
public class HelloController {
	@RequestMapping("/getMsg")
	public String getMsg() {
		return "你好";
	}
}

3. @PropertySource、@Value、@ ConfigurationProperties

参考链接:https://www.cnblogs.com/517cn/p/10946213.html

@PropertySource加载指定的属性文件(*.properties)到 Spring 的 Environment 中,如果有中文必须要写encoding属性将字符集转为UTF-8。可以配合 @Value 和 @ConfigurationProperties 使用。

  • @PropertySource 和 @Value组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
  • @PropertySource 和 @ConfigurationProperties组合使用,可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。

属性文件:demo.properties

//属性文件:demo.properties
demo.name=huang
demo.sex=1
demo.type=demo

示例一:@PropertySource + @Value

package com.huang.pims.demo.props;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource(value = {"demo/props/demo.properties"})
public class ReadByPropertySourceAndValue {

    @Value("${demo.name}")
    private String name;

    @Value("${demo.sex}")
    private int sex;

    @Value("${demo.type}")
    private String type;

    @Override
    public String toString() {
        return "ReadByPropertySourceAndValue{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", type='" + type + '\'' +
                '}';
    }
}

示例二:@PropertySource 和 @ConfigurationProperties

package com.huang.pims.demo.props;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource(value = {"demo/props/demo.properties"})
@ConfigurationProperties(prefix = "demo")
public class ReadByPropertySourceAndConfProperties {

    private String name;

    private int sex;

    private String type;

    public void setName(String name) {
        this.name = name;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public int getSex() {
        return sex;
    }

    public String getType() {
        return type;
    }

    @Override
    public String toString() {
        return "ReadByPropertySourceAndConfProperties{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", type='" + type + '\'' +
                '}';
    }
}

4. Lombok包的注解

    在安装并依赖了lombok后,其提供了一些关于POJO操作的注解,以下为lombok提供的一些常见注解

  • @Data
         注在类上,自动提供类的get、set、equals、hashCode、canEqual、toString方法
  • @Accessors    参考链接:https://blog.csdn.net/linjpg/article/details/94588483
        既可以注解在类上也可以注解在属性上,用来配置lombok如何产生和显示getters和setters的方法。有三个属性,分别是fluent,chain,prefix,

1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
假如有以下类:

@Accessors(flunet = true)
public class MyClass {
	@Getter
	private int num;//此时自动生成的get方法为num(),而不是getNum()
}

此时自动生成的get方法为num(),而不是getNum()

2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
因此在设置chain为true之后,可以不断地连续调用set方法,如设置了User类的chain为true时,有以下代码

public User getUser() {
		User user=new User();
		user.setId(101)
			.setName("name")
			.setAge(18)
			.setSex("m");
		return user;
	}

3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
假如有以下类

@Accessors(prefix = “m”)
public class MyClass {
	@Getter
	private int mNum;
}

此时生成的get方法为getNum(),而不是getMNum()  //去掉了前缀m

  • @AllArgsConstructor
    注在类上,使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数(全参构造方法),此前需要先添加无参构造方法注解@NoArgsConstructor(这是规定)

  • @NoArgsConstructor
    注在类上,提供类的无参构造

  • @Setter
    注在属性上,提供 set 方法

  • @Getter
    注在属性上,提供 get 方法

  • @EqualsAndHashCode
    注在类上,提供对应的 equals 和 hashCode 方法

  • @Log4j/@Slf4j
    注在类上,提供对应的 Logger 对象,变量名为 log

Lombok优点:

  1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
  2. 让代码变得简洁,不用过多的去关注相应的方法
  3. 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

Lombok缺点:

  1. 不支持多种参数构造器的重载
  2. 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

像 lombok 这种插件,已经不仅仅是插件了,它在编译器编译时通过操作AST(抽象语法树)改变字节码生成,变相的说它就是在改变java语法,它改变了你编写源码的方式,它不像 spring 的依赖注入一样是运行时的特性,而是编译时的特性。如果一个项目有非常多这样的插件,会极大的降低阅读源代码的舒适度。

lombok 只是省去了一些人工生成代码的麻烦,但是这些getter/setter等等的方法,用IDE的快捷键也可很方便的生成。况且,有时通过给getter/setter加一点点业务代码(但通常不建议这么加),能极大的简化某些业务场景的代码。

用还是不用,这中间如何取舍,自然是要看项目的需要,灵活运用。

猜你喜欢

转载自blog.csdn.net/weixin_36302584/article/details/106725862
今日推荐