点击上方蓝色我们家Java,选择“关注”
@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}")
// 根据id,删除一只宠物信息
public Response deletePets(@PathVariable("id") long id) {
log.info("deletePets" + id);
return Response.success();
}
@RequestParam
用于获取查询参数:
@RequestMapping("list.json")
public Map<String, Object> list(@RequestParam(value = "name") String name,
@RequestParam(value = "password") String password
) {
Map<String, Object> 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());
}




