SpringBoot注解笔记

SpringBoot注解笔记

Springboot常见注解

@Controller

@Controller

@Controller表示在tomcat启动的时候,把这个类作为一个控制器加载到Spring的Bean工厂。

这就是Spring的包扫描机制。@Controller就是一个注解,
当tomcat启动,“ 我们会看到一些JAVA类挥舞着印有@Controller的旗子大喊:‘ Hey,SpringMVC,I'm here,please take me to your bean factory! ’ ”

如果不加,这个类就只是一个普通的java类,和Spring没有关系。

@Controller用于标记标记一个类,将这个类标记为Spring MVC Controller对象,但只起到标记作用。
也就是说@Controller会告诉spring这个类是一个控制器。

@RestController

@RestController

返回字符串

@RequestMapping

@RequestMapping("/index")

@RequestMapping用来映射URL到一个控制器类,
主要作用就是设定相对路径

RequestMapping的作用就是提供了一个句柄,让我们可以访问到对应的方法,最终获得我们想要的东西。
综合来说,RequestMapping就是一个映射路径。

@RequestMapping有8个属性。
value:指定请求的实际地址。
method:指定请求的method类型(GET,POST,PUT,DELETE)等。
consumes:指定处理请求的提交内容类型(Context-Type)。
produces:指定返回的内容类型,还可以设置返回值的字符编码。
params:指定request中必须包含某些参数值,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才让该方法处理请求。等。

@GetMapping

@GetMapping("")
组合注解:
    @getMapping = @requestMapping(method = RequestMethod.GET)

@PostMapping

@PostMapping("")
组合注解:
    @postMapping = @requestMapping(method = RequestMethod.POST)

@ResponseBody

@ResponseBody

注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多

说明这个方法返回的东西会通过IO流的方式写入到浏览器

@Override

@Override

01 可以当作注释用,感觉这个也不能说明什么,注释也没什么用。
02 可以告诉读代码的人,这是对它父类方法的重写,其实很多代码规范没有为什么,规范就是规范,代码的可读性还是很重要的。
03 编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。

比如当我们想要在子类中重写父类的一个方法,但是把名字打错了,如果我们写了@Override编译器会提示,我们写的这个方法父类中没有;但是如果没有写@Override,编译器就会觉得这个是子类中写的新的方法,并不会报错,到时候debug还是很麻烦的一件事。

@Autowired

@Autowired

@autowired注解来源于英文单词autowire,即自动装配。

自动装配指的一些工业上的用机器代替人口,自动将一些需要完成的组装任务,或者别的一些任务完成。而在spring的世界当中,自动装配指的就是使用将Spring容器中的bean自动的和我们需要这个bean的类组装在一起。

因此,该注解可以简单理解为:将Spring容器中的bean自动的和我们需要这个bean的类组装在一起协同使用。

@RequestParam

@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
 
value:参数名
 
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
 
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

@RequiresPermissions

@RequiresPermissions("")

@Validated

@Validated

@Validated是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束

@Service

@Service

用于标记业务层组件

@Transactional

@Transactional

用于事务管理

@Table

@Table

声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe)

@Column

@Column

用来标识实体类中属性与数据表中字段的对应关系

@NotBlank

@NotBlank

只能作用在String上,不能为null,而且调用trim()后,长度必须大于0

@Size、@Length、@Max、@Min

@Size ——> (Array,Collection,Map,String)
Length(min=, max=)
@Max
@Min

@Size验证对象长度是否在给定的范围之内
@Length验证字符串长度是否在给定的范围之内
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
max和min是对所填的“数字”是否大于或小于指定值,这个“数字”可以是number或者string类型。长度限制用length。

@JsonFormat

@JsonFormat

用于数据格式化

@MyBatisDao

@MyBatisDao

SpringBoot注解详解

@Override注解详解

java 开发时经常会碰到@Override注解,从字面上来理解就是覆盖的意思

该注解的作用主要有两个:

  • 帮助自己检查是否正确的重写了父类中已有的方法

  • 告诉读代码的人,这是一个重写的方法

比如我们有如下基类

package com.test;

public class Fruit {
  public void show_name(int num){
    System.out.println("Fruit: "+num);
  }
  
  public static void main(String[] args) {
    // TODO code application logic here
    Fruit apple = new Apple(); //generate a kind of new fruit
    apple.show_name(2);
  }
}

之后我们编写一个Apple子类,继承这个基类。并且复写基类中的show_name()方法。

package com.test;

public class Apple extends Fruit{

  @Override
  public void show_name(int num){
    System.out.println("Apple:"+num);
  }
}

执行的结果,显而易见就是会打印出 Apple:2 字样。

其实,在我们手工重写父类的方法时,容易把方法的参数记错,如果此时不加@Override的话,编辑器就不会提示你:例如我们不加这个标签,悄悄的把参数改为float型。

public void show_name(float num){
    System.out.println("Apple");
}

这个时候,其实我们并没有按照我们的意图成功重写方法,于是一个隐藏的bug就这样诞生了,但如果加上@Override,
此时IDE就会提示重写失败。很容易地,我们会将重写方法错写为重载方法。

补充:

《Thinking in java》的作者Bruce在讨论这个问题的时候,提到了一个问题就是override私有的方法的例子:

现在我们向Fruit类中添加一个私有方法,而在Apple中尝试重写

@Override

private void grow(){

}

结果编译器会提示错误,这是一个非常低级的错误,但是有时候恰恰就不会被我们发现:那就是试着重写私有方法,但是当我们去掉Override标签的时候,编译器是不会报错的,而且可以执行。

其实Apple中的你所谓复写的grow只是一个针对于Apple本身的私有方法。完全是一个新的方法。

这就引出了一个问题,何为重写?

在面向对象中,只有接口和共有方法,继承方法才有重写,私有方法不可以重写,实际上:不是不可以重写而是,根本就不存在重写私有方法的概念!

这正是面向对象设计的初衷,私有方法本身就是为了封装在类内部,不希望别人来更改或者外部引用的,看到这里,忽然觉得,java设计的还真是不错,感觉到了思想和实现的统一。

@ModelAttribute注解详解

注解用途

@ModelAttribute注解用于将方法的参数或方法的返回值绑定到指定的模型属性上,并返回给Web视图

注释方法

被@ModelAttribute注解注释的方法会在此Controller每个方法执行前被执行

(1)void返回值的方法

@ModelAttribute注释void返回值的方法

@Controller
public class HelloWorldController {

    @ModelAttribute // 方法参数绑定到数据模型上
    public void populateModel(@RequestParam String abc, Model model) {
        						// 请求参数绑定到该方法的方法参数上
       model.addAttribute("attributeName", abc);
    } // 该方法将请求参数绑定到了数据模型上

    @RequestMapping(value = "/helloWorld")
    public String helloWorld() {
       return "helloWorld";
    }
}

控制器获得/helloWorld请求后,被@ModelAttribute注释的方法首先执行,将populateModel方法获得的请求参数/helloWorld绑定到model中名为attrituteName 的属性上(换句话说,就是将参数abc设置为model的attributeName属性的参数)
然后helloWorld方法被调用,返回视图名helloWorld,由@ModelAttribute生产的数据模型

本例中model属性名称和model属性对象有model.addAttribute()实现,不过前提是要在方法中加入一个Model类型的参数

当URL或者post中不包含参数时,会报错,其实不需要这个方法,完全可以把请求的方法写成下面的样子,这样缺少此参数也不会出错:

@RequestMapping(value = "/helloWorld")
public String helloWorld(String abc) {
   return "helloWorld";
}
(2)返回具体类的方法Ⅰ

@ModelAttribute注释返回具体类的方法

@ModelAttribute
public Account addAccount(@RequestParam String number) {
   return accountManager.findAccount(number);
}

本例中并没有指定model属性的名称,这种情况下,它由返回类型隐含表示,即返回Account类型,则model属性的名称为account。这个例子中model属性名称有返回对象类型隐含表示,model属性对象的值就是方法的返回值。它无须要特定的参数

(3)返回具体类的方法Ⅱ

@ModelAttribute("attributeName")注释返回具体类的方法

@Controller
public class HelloWorldController {

    @ModelAttribute("attributeName")
    public String addAccount(@RequestParam String abc) {
       return abc;
    }

    @RequestMapping(value = "/helloWorld")
    public String helloWorld() {
       return "helloWorld";
    }
}

本例使用@ModelAttribute注释,并使用注解指定的attributeName属性来指定model属性的名称。model属性对象的值就是方法的返回值。它无须要特定的参数。

(4)同时注释一个方法

@ModelAttribute@RequestMapping同时注释一个方法

@Controller
public class HelloWorldController {

    @RequestMapping(value = "/helloWorld.do")
    @ModelAttribute("attributeName")
    public String helloWorld() {
       return "hi";
    }
}

虽然helloWorld方法标注了String返回类型,但是model属性的值,视图名称由RequestToViewNameTranslator根据请求/helloWorld.do转换为逻辑视图helloWorld

Model属性名称由@ModelAttribute("attributeName")指定,相当于在request中封装了key=attributeName,value=hi

注释一个方法的参数

(1)从model中获取
@Controller
public class HelloWorldController {

    @ModelAttribute("user")
    public User addAccount() {
       return new User("jz","123");
    }

    @RequestMapping(value = "/helloWorld")
    public String helloWorld(@ModelAttribute("user") User user) {
       user.setUserName("jizhou");
       return "helloWorld";
    }
}

本例中,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session

(2)从Form表单或URL参数中获取

​ // 实际上,不做此注释也能拿到user对象)

@Controller
public class HelloWorldController {

    @RequestMapping(value = "/helloWorld")
    public String helloWorld(@ModelAttribute User user) {
       return "helloWorld";
    }
}

注意这时候这个User类一定要有无参数的构造函数。

posted @ 2021-08-14 14:33  草系编程苦手  阅读(328)  评论(0编辑  收藏  举报