暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot项目中常用注解

我们家Java 2021-08-24
1213


点击上方蓝色我们家Java,选择“关注


在之前演示的代码中,我们已经见到了很多关于SpringBoot的常用注解,本篇会将他们总结出来并加以补充。


@SpringBootApplication


@SpringBootApplication注解让springBoot自动给程序进行必要的配置,创建 SpringBoot 项目之后会默认在主类加上。


它包含了@ComponentScan、@Configuration和@EnableAutoConfiguration三个注解。


这三个注解的作用分别是:

@EnableAutoConfiguration:自动配置机制。

@ComponentScan:扫描被@Component (@Service,@Controller)注解的 Bean,会自动发现和装配一些Bean。

@Configuration:类似于于一个 xml 配置文件的存在,允许在 Spring 上下文中注册额外的 Bean 或导入其他配置类。


打开我们的javafamily.familydemo中的FamilyDemoApplication,就可以看见这个注解了:

package com.javafamily.familydemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class FamilyDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(FamilyDemoApplication.class, args);
    }

}


Bean相关注解


@Autowired

这个注解起到了自动导入的作用,把对象自动导入到类中。

@Service
public class PetsService {
    ...
}
@RestController
@RequestMapping("/pets")
public class UserController {
   @Autowired
   private PetsService petsService;
   ......
}


@Autowired可以让 Spring 容器自动装配 Bean,把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。


@Service

在上面的代码中我们还看见了@Service注解,他是在服务层使用的需要注入到Dao层


@Component

泛指组件,当组件不好归类,Bean 不知道属于哪个层的时候,我们可以使用这个注解。


@RestController

这个注解用来标注控制层组件

  • @RestController=@ResponseBody+@Controller。

  • @ResponseBody 将java对象转化为json格式的数据。

  • @Controller 用来表示Spring某个类是否可以接受HTTP请求。

在之前的代码中我们也使用过:

@Slf4j
@RestController
public class PetsController {
    @Resource
    PetsService petsService;

...
}


@Configuration

用来声明当前类为配置类,在之前讲解的javafamily.familydemo.config中的SwaggerConfig.java代码中使用过:

// 表示当前类为配置类
@Configuration
// 启用SwaggerAPI文档
@EnableSwagger2
public class SwaggerConfig {
  ...
}


@Bean

@Bean注解告诉Spring这个方法将会返回一个对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。


@Bean注解主要用在@Configuration注解的类里,也可以用在@Component注解的类里。

@Configuration
public class Config {

    @Bean
    public PetsService petsService() {
        return new PetsServiceImpl();
    }
}

这种写法转换成xml配置:

<beans>
    <bean id="petsService" class="com.javafamily.familydemo.serviceImpl"/>
</beans>

@Bean注解可以依赖其他任意数量的bean,如果PetsService 依赖 Repository,可以通过方法参数实现依赖:

@Configuration
public class Config {

    @Bean
    public PetsService petsService(Repository,repository) {
        return new PetsServiceImpl(Repository);
    }
}

使用@Bean定义的bean都可以执行生命周期的回调函数:

首先我们在javafamily.familydemo下创建configuration文件夹,再创建TestConfiguration.java

package com.javafamily.familydemo.configuration;

import com.javafamily.familydemo.model.Pets;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TestConfiguration {
    // Bean的初始化方法。对象创建完成,如果对象中存在一些属性,并且这些属性也都赋值好之后,调用初始化方法。
    // Bean的销毁方法,在容器关闭时执行
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Pets pets() {
        return new Pets();
    }
}

在model中的pets.java中添加:

private void init({
    System.out.println("Hello pets!");
}
private void destroy({
    System.out.println("GoodBye pets!");
}

将Application中的代码替换成:

@SpringBootApplication
public class FamilyDemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(FamilyDemoApplication.class);
        Pets bean = context.getBean(Pets.class);
        Object myPets = context.getBean("pets");
        context.close();
    }

}

执行代码得到:

如果我们把@Configuration注释掉再执行代码会怎么样呢?

容器中找不到这个bean了。

@Scope

@Scope注解我们会在service/controller层中遇见。我们可以使用@Scope注解来指定使用@Bean定义的bean。

@Configuration
public class AConfiguration {

    @Bean
    @Scope("prototype")
    public Secret secret() {
        ...
    }
}

5 种常见的HTTP请求类型


在我们之前讲解到的宠物商店例子中,我们在controller层对宠物(pets)进行了GET POST/PUT/DELETE操作,并且使用到了有关于他们的注解。

// 根据id,查询一只宠物信息
@RequestMapping(value = "/pets/{id}", method = RequestMethod.GET)
// 添加一只宠物信息
@RequestMapping(value = "/pets", method = RequestMethod.POST)
// 修改一只宠物信息
@RequestMapping(value = "/pets", method = RequestMethod.PUT)
// 根据id,删除一只宠物信息
@RequestMapping(value = "/pets/{id}", method = RequestMethod.DELETE)

分别在服务器上请求,创建,修改,删除资源。等同于:

@GetMapping("/pets/{id}")
@PostMapping("pets")
@PutMapping("pets")
@DeleteMapping("/pets/{id}")


前后端传值


@PathVariable
用于获取路径参数:
// 根据id,删除一只宠物信息
public Response deletePets(@PathVariable("id") long id) {
  log.info("deletePets" + id);
  return Response.success();
}

@RequestParam

用于获取查询参数:

@RequestMapping("list.json")
public Map<StringObject> list(@RequestParam(value = "name"String name,
                                @RequestParam(value = "password"String password
) {
  Map<StringObject> result = new HashMap<>();
  System.out.println("testRequestParam Name: " + name + ",password: " + password);

  result.put("name", name);
  result.put("password", password);
  return result;

}

@RequestBody

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的。

@RequestMapping(value = "/pets", method = RequestMethod.POST)
public Response savePets(@RequestBody Pets pets) {
  log.info("savePets" + pets);
  return Response.success(petsService.savePets(pets));
}

一个请求方法只可以有一个@RequestBody,但是可以有多个@RequestParam和@PathVariable。 


配置信息的读取


在上一篇SpringBoot配置文件详解中,我们就看到了yaml配置绑定变量的两个注解:@Value和@ConfigurationProperties,这两个注解就是用来读取配置信息的。

public class PetStore {
    // 在应用启动时,自动将petStore.petStoreName属性的值绑定到私有变量petStoreName上面,实现赋值效果。
    @Value("${petStore.petStoreName}")
    private String petStoreName;
}

// @ConfigurationProperties注解不能使用驼峰写法
@ConfigurationProperties(prefix = "petstore")
public class PetStore {
    // 在应用启动时,自动将petStore.petStoreName属性的值绑定到私有变量petStoreName上面,实现赋值效果。
    // @Value("${petStore.petStoreName}")
    private String petStoreName;
    private Manager manager;
    private Employee employee;
    private Pet pet;
}


JPA注解


@Entity,@Table 

@Entity声明一个类对应数据库实体,表明是一个实体类。一般搭配@Table 一起使用。

@Entity
@Table(name = "pets")
public class Pets {
  ...
}


@Id

表示被声明的属性为主键,之后还需要使用 @GeneratedValue 指定主键生成策略。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


@Column

声明字段,如果字段名与列名相同可以省略。


@Transient

声明不需要与数据库映射的字段,保存时不需要存储到数据库。

@Transient
private String error


关联关系注解

@OneToOne: 一对一关系

@OneToMany: 一对多关系

@ManyToOne:多对一关系

@MangToMang:多对多关系


JSON数据处理


@JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss", timezone = "GMT+8") 

用于个性化指定日期类型的属性格式。


@JsonPropertyOrder(value = {"varieties","name"})

用于改变两个属性在返回数据中的位置。


@JsonProperty("petsId")

用于在输出时为一个属性换个名字。


@JsonInclude(JsonInclude.Include.NON_NULL)

属性值为null则不参与序列化。


@JsonIgnore

用于忽略掉某个属性不做序列化。

(在JOSN数据处理这篇文章中对于以上注解有非常详细的例子。)


测试注解


@Test

声明一个方法为测试方法:

@Test
public void hello() throws Exception {
    System.out.println(petStore.toString());
}


以上总结的是SpringBoot中比较常用注解,详细的例子可以到对应的文章下查看。
点击下方阅读原文,查看上一篇
文章转载自我们家Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论