java开发中遇到的注解

1、@Entity与@Table

先看下栗子:

@Entity

@Table(name="tbl_user")

public class User implements Serializable{

         @Id

         @GeneratedValue(strategy = GenerationType.AUTO)

         @Column(name="id")

         private Integer id;

         @Column(name="name")

         private String name;

         @Column(name="age")

          private String age;

          public String getAge() { return age;  }

           public void setAge(String age) { this.age= age;   }

           public String getName() { returnname; }

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

           public User() {   }

           public Integer getId() { return this.id;  }

           public void setId(Integer id) { this.id= id; }

}

@Entity注释指名这是一个实体Bean

@Table注释指定了Entity所要映射带数据库表;(如果缺省@Table注释,系统默认采用类名作为映射表的表名。)

@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:

1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;

2)unique:是否唯一;

3)nullable:是否允许为空;

4)length:对于字符型列,length属性指定列的最大字符长度;

5)insertable:是否允许插入;

6)updatetable:是否允许更新;

7)columnDefinition:定义建表时创建此列的DDL;

8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字。

@Id注释指定表的主键,它可以有多种生成方式:

1)TABLE:容器指定用底层的数据表确保唯一;

2)SEQUENCE:使用数据库的SEQUENCE列来保证唯一(Oracle数据库通过序列来生成唯一ID);

3)IDENTITY:使用数据库的IDENTITY列来保证唯一;

4)AUTO:由容器挑选一个合适的方式来保证唯一;

5)NONE:容器不负责主键的生成,由程序来完成。

@GeneratedValue注释定义了标识字段生成方式。(strategy=GenerationType.AUTO)

@Temporal注释用来指定java.util.Date或java.util.Calender属性与数据库类型date、time或timestamp中的那一种类型进行映射。

@Temporal(value=TemporalType.TIME)

private Date birthday;

2、Lombok 之 Constructor( @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor )

   1)、@NoArgsConstructor : 生成一个无参数的构造方法,这个annotation在与其他的annotation配合起来使用的时候更加能凸显出他的重要性,例如在使用                   hibernate这种框架的时候,如果有一个有参数的构造方法的时候,NoArgsConstructor会展示出他的作用。

   2)、@RequiredArgsConstructor: 会生成一个包含常量,和标识了NotNull的变量 的构造方法。生成的构造方法是private,如何想要对外提供使用可以使用                     staticName选项生成一个static方法。

   3)、@AllArgsContructor:  会生成一个包含所有变量,同时如果变量使用了NotNull annotation , 会进行是否为空的校验

来看一个栗子:

import lombok.AccessLevel;

import lombok.RequiredArgsConstructor;

import lombok.AllArgsConstructor;

import lombok.NonNull;

@RequiredArgsConstructor(staticName ="of")

@AllArgsConstructor(access = AccessLevel.PROTECTED)

public class ConstructorExample {

          private int x, y;

         @NonNull private T description;

         @NoArgsConstructor

          public static class NoArgsExample {

                     @NonNull private String field;

          }

}

上面的例子用Java代码翻译一下就是:

public class ConstructorExample {

          private int x, y;

          @NonNull private T description;

          private ConstructorExample(T description) {

                   if(description ==null) throw new NullPointerException("description");

                   this.description = description;

           }

           public static ConstructorExample of(T description) {

                     return new ConstructorExample(description);

           }

          @java.beans.ConstructorProperties({"x","y","description"})

           protected ConstructorExample(int x,int y, T description) {

                     if(description ==null) throw new NullPointerException("description");

                     this.x = x;

                      this.y = y;

                      this.description = description;

            }

             public static class NoArgsExample {

                        @NonNull private String field;

                        public NoArgsExample() {

                       }

              }

}

3、SpringMVC的@Valid(详见链接)

@Valid注解进行数据验证

4、Spring Boot @ConfigurationProperties(详细说明)

   通常,我们使用@Value注释来逐个注入.properties值,这对于小而简单的结构.properties文件很有用。

如下:

文件:global.properties

[email protected]

thread-pool=12

@Value示例

文件:GlobalProperties.java

@Component

@PropertySource("classpath:global.properties")

public class GlobalProperties{

         @Value("${thread-pool}")

          private int threadPool;

          @Value("${email}")

           private String email;

           //getters and setters

}

@ConfigurationProperties示例

文件: application.yml

logging:

       level:

              org.springframework.web:ERROR

            com.yiibai:DEBUG

email:[email protected]

thread-pool:10

app:

       menus:

                -title:Home

               name:Home

                path:/

               -title:Login

               name:Login

                path:/login

      compiler:

           timeout:5

           output-folder:/temp/

      error:/error/

文件: AppProperties.java

importorg.springframework.boot.context.properties.ConfigurationProperties;

importorg.springframework.stereotype.Component;

importjava.util.ArrayList;

importjava.util.List;

@Component

@ConfigurationProperties("app")// prefix app, find app.* values 可写成( prefix ="app")

public class AppProperties{

          private String error;

          private List menus=new ArrayList<>();

          private Compiler compiler = new Compiler();

          public static class Menu{

                     private String name;

                     private String path;

                      privateString title;

                      //getters and setters

                      @Override

                      public String toString(){

                                     return "Menu{"+"name='"+name+'\''+", path='"+path+'\''+", title='"+title+'\''+'}';

                       }

              }

             public static class Compiler{

                       private String timeout;

                        private String outputFolder;

                        //getters and setters

                         @Override

                          public String toString(){

                                     return "Compiler{"+"timeout='"+timeout+'\''+", outputFolder='"+outputFolder+'\''+'}';

                           }

               }

               //getters and setters

}

5、@PropertySource

@PropertySource注解用于指定目录,指定编码读取properties文件

如:

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

6、Spring中基于Java的配置@Configuration和@Bean用法(详细说明)

首先,需要xml中进行少量的配置来启动Java配置:


java开发中遇到的注解_第1张图片

用@Configuration注解该类,等价 与XML中配置beans;用@Bean标注方法等价于XML中配置bean。

代码如下:


java开发中遇到的注解_第2张图片

具体的使用

// 读取bean.xml中的内容

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/bean.xml");

//读取配置文件

ApplicationContext annotationContext =newAnnotationConfigApplicationContext("SpringStudy");

7、spring MVC @ModelAttribute(详细说明)

8、Spring @RestController

一直使用springmvc的时候就记得返回string或者json的话就直接用@RestController。如果想要页面跳转的话,就使用@Controller。一开始就有个疑问,就是我想在一个类中既能返回string或者json又能进行页面跳转怎么办。现在终于明白:点击打开链接。在这篇文章中介绍的非常详细,简单说来就是:

@RestController = @Controller + @ResponseBody。

所以,以后定义controller的时候,可以直接使用@Controller,如果需要返回json可以直接在方法中添加@ResponseBody即可。

9、@ResponseBody和@RequestBody(详细说明)

@RequestBody

作用:

i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);

multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);

其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 必须;

multipart/form-data, 不能处理;

其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

@ResponseBody

作用:

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

10、@RequestParam(详细说明)

在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取。

如下:

//不指定入参时,前端传入的就是inputStr

@RequestParam String inputStr

// 下面的对传入参数指定为aa,如果前端不传aa参数名,会报错

@RequestParam(value="aa") String inputStr

//可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传

// required=false表示不传的话,会给参数赋值为null,required=true就是必须要有

@RequestMapping("testRequestParam")

public  String filesUpload( @RequestParam(value="aa", required=true) String  inputStr,  HttpServletRequest request)

11、@ResponseEntity(详细说明)

@ResponseEntity可以定义返回的HttpHeaders和HttpStatus

12、@PathVariable

先看栗子: 

/**

* @PathVariable 可以映射占位符到方法中的参数(类似赋值)

* @param id

* @return

*/

@RequestMapping("/testPathVariable/{id}")

public String testPathVariable( @PathVariable("id") Integer id){

              System.out.println("PathVariable id="+id);

              return "success";

}

SpringMVC中是不可以通过@PathVariable这个注解来传递对象的,原因其实很简单:@PathVariable是用来获得请求url中的动态参数的,所以该注解只能支持将参数放在请求url的GET提交方式,所以不管你如何进行设置,@PathVariable都是无法支持Post请求的。

你可能感兴趣的:(java开发中遇到的注解)