JavaGuide知识点整理——spring&springboot常用注解总结

藏宝库编辑 2024-10-3 19:38:51 104 0 来自 中国
@SpringBootApplication

这个注解实在我们常见但是又不怎么主动利用。这个注解是spring boot项目的基石。会默认在启动类上加上。实在我们可以把这个注解当作是多个注解的聚集:

1.png
此中紧张的三个注解是:

  • @SpringBootConfiguration:它的底层实在是@Configuration.允许在Spring上下文中注册额外的bean大概导入别的设置类。

    2.png
  • @ComponentScan:扫描被@Component,@Repository,@Service,@Controller注解的bean,注解默认会扫描该类地点的包下的全部的类(这也是boot项目启动类必须在最外层的缘故起因)
  • @EnableAutoConfiguration:启动SpringBoot的主动设置机制。
Spring Bean相干

@Autowired

主动导入对象到类中,被注入进的类同样要被spring容器管理。好比Service类注入到Controller类中。
@Component,@Repository,@Service,@Controller

我们一样寻常利用@Autowired注解让Spring容器帮我们主动装配bean。要想要类标识成可用于@Autowired注解主动装配的bean的类,可以采用以下注解实现:

  • @Component:通用的注解,可标注恣意类为Spring组件。如果一个bean不知道属于哪层,可以利用这个注解来标注。
  • @Repository:对应恒久层即Dao层,紧张用于数据库相干利用。
  • @Service:对应服务层,紧张涉及一些复杂的逻辑,必要用到Dao层。
  • @Controller:对应Spring MVC控制层。紧张用于担当用户哀求并调用Service层返回数据给前端页面。
@RestController

@RestController注解是@Controller和@ResponseBody的合集。表现这是个控制器bean,而且将函数的返回值直接填入http相应体中。是REST风格的控制器。
单独利用@Controller不加@ResponseBody的话,一样寻常是用在要返回一个视图的环境。如果加了@ResponseBody返回的是JSON大概XML情势的数据。
@Scope

这个是声明Spring Bean的作用域,利用方法就是指定作用域。这个注解有四种常见的作用域:

  • singleton:唯一bean实例。Spring中的bean默认都是单例的
  • prototype:每次哀求都会创建一个新的bean实例
  • request:每一个HTTP哀求都会产生一个新的bean,该bean仅在当前http的request中有效。
  • session:每一个http session会产生一个新的bean。该bean仅在当前http session下有效。
下面的简朴的例子:


@Configuration

一样寻常用来声明设置类,可以利用注解@Component注解替换。不外利用@Configuration注解声明设置类更加语义化。
处理常见的http哀求范例

5中常见的哀求范例(实在就前两个常见,三四个也还行。第五个没用过。 )

  • GET:哀求从服务器获取特定资源。
  • POST:在服务器上创建一个新的资源
  • PUT:更新服务器上的资源
  • DELETE:从服务器删除特定的资源
  • PATCH:更新服务器上的资源。
GET哀求

@GetMapper("/xxx") 等价于
@RequestMapper(value= "/xxx",method=RequestMethod.GET)
POST哀求

@PostMapping("/xxx") 等价于@RequestMapping(value="/xxx",method=RequestMethod.POST)
PUT哀求

@PutMapping("/xxx/{userId}") 等价于@RequestMapping(value="/xxx/{userId}",method=RequestMethod.PUT)
DELETE哀求

@DeleteMapping("/xxx/{userId}")等价于@RequestMapping(value="/xxx/{userId}",method=RequestMethod.DELETE)
PATCH哀求

一样寻常我们很少利用的这个哀求,都是put不敷用了才会利用。
@PatchMapping("/xx")等价于
@RequestMapping(value = "/xxx",method = RequestMethod.PATCH)
前后端传值

@PathVariable 和@RequestParam

@PathVariable用于获取路径参数
@RequestParam用户就获取查询参数
这两者我们可以同时利用。如下例子:
    @GetMapping("/test/{name}")    public String test(@PathVariable("name")String name,@RequestParam("id") String id){        return "id = "+ id +",name = " + name ;    }@RequestBody

用于读取Requst哀求的body部门,而且Content-Type是application/json格式的参数。吸收到数据之后会主动将数据绑定到java对象上去。体系会利用HttpMessageConyerter大概自界说的HttpMessageConyerter将哀求的body中的json字符串转换为java对象。
必要留意一个哀求方法里只能有一个@RequestBody,但是可以有多个@RequestParam和@PathVariable.
读取设置信息

许多时间我们必要将一些常用的设置信息好比阿里云oss,发送短信,微信认证的相干设置信息等等放到设置文件中。下面我们来看一下spring为我们提供了哪些方式从设置文件中读取设置信息。
@Value

这个是比力常用的读取设置信息注解,利用方法是@Value("${xxx}")
@ConfigurationProperties

通过@ConfigurationProperties读取设置信息而且与bean绑定。如下demo:

6.png @PropertySource

这个是读取指定位置的设置文件,然后用@Value注解注入。
怎么说呢,我是以为这个挺鸡肋的。也大概是我没碰到实用的场景。好比说A,B两个文件中都有url属性。如果我们直接用@Value注入的话是要aplication.yml/properties文件。但是我们可以在类上指定要读取的设置文件,然后用@Value注入。
全局处理Controller层非常


  • @ControllerAdvice:注解界说全局非常处理类
  • @ExceptionHandler:注解声明非常处理方法
这个利用不难,但是挺墨迹的,我就不整理了,感爱好的本身百度吧。
JPA相干

创建表

@Entity声明一个类对应一个数据库实体。
@Table 设置表名
@Entity@Data@Table(name = "sys_user")public class User{    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    private Integer age;}创建主键

@Id :声明一个字段为主键。
@GeneratedValue 指定主键天生战略。
jpa中常见的有四种主键生产战略。默认是auto
public enum GenerationType {    /**     * 利用一个特定的数据库表格来生存主键     * 恒久化引擎通过关系数据库的一张特定的表格来天生主键,     */    TABLE,    /**     *在某些数据库中,不支持主键自增长,好比Oracle、PostgreSQL其提供了一种叫做"序列(sequence)"的机制天生主键     */    SEQUENCE,    /**     * 主键自增长     */    IDENTITY,    /**     *把主键天生战略交给恒久化引擎(persistence engine),     *恒久化引擎会根据数据库在以上三种主键天生 战略中选择此中一种     */    AUTO}设置字段范例

@Column 声明字段。
可以设置数据库的字段名。也可以设置非空,长度等。还可以添加默认值。好比下面两个demo:
@Column(name = "user_name", nullable = false, length=32)private String userName;@Column(columnDefinition = "tinyint(1) default 1")private Boolean enabled;指定不恒久化特定字段

@Transient :声明不必要与数据库映射的字段,在生存的时间不必要生存进数据库 。
实在这个mybatis也有类似的功能。就是当实体和数据库表有出入的时间可以用。
声明大字段

@Lob:声明某个字段为大字段。
创建摆列范例的字段

这个实用性还蛮高的。好比传入的男性,女性.然后摆列值界说男性是male,女性是female这种。就是利用比力贫苦,必要本身写摆列类。
public enum Gender {    MALE("男性"),    FEMALE("女性");    private String value;    Gender(String str){        value=str;    }}@Entity@Data@Table(name = "sys_user")public class Role {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    private String name;    @Enumerated(EnumType.STRING)    private Gender gender;}增长审计功能

这个功能实在就是主动给创建人,创建时间,修改人,修改时间赋值。实现如下:
只要继续了AbstractAuditBase的类都会默认加上这四个字段。这里的几个注解都比力见名知意,我就不多表明白。
@Data@AllArgsConstructor@NoArgsConstructor@MappedSuperclass@EntityListeners(value = AuditingEntityListener.class)public abstract class AbstractAuditBase {    @CreatedDate    @Column(updatable = false)    @JsonIgnore    private Instant createdAt;    @LastModifiedDate    @JsonIgnore    private Instant updatedAt;    @CreatedBy    @Column(updatable = false)    @JsonIgnore    private String createdBy;    @LastModifiedBy    @JsonIgnore    private String updatedBy;}然后必要实现一个auditorAware的接口,用处就是为了返回当前的利用人。
@Configuration@EnableJpaAuditingpublic class AuditSecurityConfiguration {    @Bean    AuditorAware<String> auditorAware() {        return request.getSession().getAttribute("username");    }}然后我们在启动类上添加注解@EnableJpaAuditing,开启 JPA 审计功能。
删除/修改数据

@Repositorypublic interface UserRepository extends JpaRepository<User, Integer> {    @Modifying    @Transactional(rollbackFor = Exception.class)    void deleteByUserName(String userName);}关联关系

固然jpa支持一对一,一对多,多对多等。但是现实上项目中不保举这么利用,以是我就不多先容了。反正jpa是支持的,感爱好的本身去看官网。
变乱@Transactional

关于spring变乱,我之前有篇文章整理过,感爱好的可以本身去看看。https://www.jianshu.com/p/78ef931a4674
json数据处理

过滤json数据

@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回大概不分析
//天生json时将userRoles属性过滤@JsonIgnoreProperties({"userRoles"})public class User {    private String userName;    private String fullName;    private String password;    private List<UserRole> userRoles = new ArrayList<>();}@JsonIgnore作用于属性上和@JsonIgnoreProperties是一样的。
public class User {    private String userName;    private String fullName;    private String password;   //天生json时将userRoles属性过滤    @JsonIgnore    private List<UserRole> userRoles = new ArrayList<>();}格式化json数据

@JsonFormat一样寻常用来格式化 json 数据。
好比我们可以把日期用字符串吸收
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")private Date date;扁平化对象

实在所谓的扁平化我们可以明白成从子对象中取出来放在外层。


上面这段代码实验效果是如许的:
{    "userEntity": {        "id": null,        "name": "lsj",        "age": 12,        "level": 1,        "flag": true,        "email": "11@qq.com"    }}而如果我们在属性上添加注解:@JsonUnwrapped。

8.png
实验效果酿成如许:
{    "id": null,    "name": "lsj",    "age": 12,    "level": 1,    "flag": true,    "email": "11@qq.com"}测试相干

@SpringBootTest(webEnvironment = RANDOM_PORT)  声明是测试
@ActiveProfiles("test") 指定运行环境是test,用于读取spring设置文件/
@Test  声明一个方法为测试方法
@Transactional被声明的测试方法的数据会回滚,制止污染测试数据。
@WithMockUser Spring Security 提供的,用来模仿一个真实用户,而且可以赋予权限。
本篇条记就记到这里,真正做的时间才发现spring注解之多真的很难整理清楚,从一开始的兴高采烈到厥后无从动手。不外还算是有个心得:当你必要什么功能的时间不妨先去百度找找,大部门spring 百口桶已经提供轮子了。哪怕spring不提供,也很大几率有现成的轮子。本篇条记就记到这里,如果稍微帮到你了记得点个喜好点个关注,也祝各人工作顺顺遂利!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:47, Processed in 0.192377 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表