本文已参与「新人创作礼」活动,一起开启掘金创作之路。
IoC
org.springframework.stereotype
@Repository
用于标注数据访问组件,即 DAO 实现类
@Service
用于标注业务实现类
@Controller
用于标注控制层类,通常与 RequestMapping 注解结合使用
@Component
泛指组件,当某个组件不好分类时使用该注解,使用在实体类上,不写 value 的话,bean 名字默认为类名首字母小写
DI
org.springframework.beans.factory.annotation
@Autowired
完成属性/字段注入,注入的是 bean(取代 XML property ref 元素)
Autowired和Resource注解细节
- 可以让Spring将需要的字段或属性找出来并注入到属性或字段上
- 可以贴在字段或setter方法上
- 可以同时注入多个对象(一般不需要用到)
- 可以注入Spring内置的对象,比如ApplicationContext
- 容器中有容器自己,目的是为了能够在任何地方获取容器中的任何对象
- 步骤:声明ApplicationContext对象并贴注解,通过getBeansOfType方法可以获取到容器中所有对象
- 默认情况下Autowired注解必须找到对应的对象,否则会报错。
- 通过@Autowired(required=false)可以解决这个问题
- Spring 3.0之前需要手动配置Autowired的解析程序,在 Spring 的测试环境可以不配置,在 Web 开发中换一种配置解决
- 寻找bean的方式:
- Autowired:依赖对象类型(setter或字段直接注入) → 名字
- 通过@Qualifier("名字")注解规定依赖对象按照 bean 的 id 和 类型的组合方式去找
- Resource:名字(setter或字段直接注入) → 类型 (多个类型则报错)
- 通过@Resource(name="") 指定bean的名称
@Qualifier("name")
当有多个同一类型的 bean 存在时,可以使用该注解进行指定
@Value
完成属性/字段注入,注入的是常量值(取代 XML property value 元素)
SpringMVC
org.springframework.web.bind.annotation
@RestController
等价于 @Controller + @ResponseBody
@ResponseBody
表示该方法的返回值放在响应体中,一般在异步请求中使用,用于获取数据,比如响应 JSON 数据需要用到该注解
@RequestParam
将请求参数绑定到方法参数上,当请求参数名和形参名不一致时可以使用该注解起名
@RequestMapping("映射路径")
用来处理请求地址映射的注解,用于类或方法上
@ControllerAdvice
- 全局异常处理
@ControllerAdvice
public class CommonControllerHandler {
@ExceptionHandler(LogicException.class)
@ResponseBody
public JsonResult handleLogicException(Exception e) {
e.printStackTrace();
return JsonResult.error(500, e.getMessage(), null);
}
}
-
全局数据绑定:用于做一些数据初始化操作
-
全局数据预处理
@InitBinder
// SpringMVC并不能对所有类型的参数都进行绑定,该注解则能够对WebDataBinder对象进行初始化,
// WebDataBinder是DataBinder的子类,用于完成表单参数到JavaBean属性的绑定
public void handleDateFormat(WebDataBinder binder) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
/*
setLenient():是否严格解析日期
true:表示Java会对日期进行计算,比如日期为2021-13-01,则13个月会计算为1年1个月,即日期变为2022-01-01
false:表示Java不会对日期进行计算,若输入非法日期,则直接抛出异常
*/
format.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(format, true));
}
@ExceptionHandler
用于指明异常的处理类型
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult handleRuntimeException(Exception e) {
e.printStackTrace();
return JsonResult.defaultError();
}
@InitBinder
SpringMVC 并不能对所有类型的参数都进行绑定,该注解则能够对 WebDataBinder 对象进行初始化,WebDataBinder 是 DataBinder 的子类,用于完成表单参数到 JavaBean 属性的绑定
@PathVariable
该注解能够将路径参数从 url 上解析下来,并赋值给接口声明的形参,如果参数路径上的参数名与方法声明形式参数名不一致,则需要明确指定
/**
* 查询某个部门下的所有员工
*
* 请求路径:/departments/{id}/employees
* 请求方式: GET
* 请求参数: id
* 请求返回值: List<Employee>
*/
GetMapping(value = "/{id}/employees")
public List<Employee> listEmployee(@PathVariable Long id) {
List<Employee> employees = Arrays.asList(
new Employee(1L, "小一", 19, id),
new Employee(2L, "小二", 18, id),
new Employee(3L, "小三", 20, id)
);
return employees;
}
SpringBoot
@SpringBootAplication
表示当前类为 SpringBoot 的引导启动类,由 @SpringBootConfiguration、@EnableAutoConfigutation、@ComponentScan 构成
@SpringBootConfiguration
标记当前类为配置类,继承自 @Configuration,将当前类中声明的一个或多个贴有 @Bean 的方法生成并放到 Spring 容器中,实例名为方法名,相当于<beans></beans>
@EnableAutoConfiguration
字面意思即启用自动配置,用于实现自动配置
Java Config
@Configuration
用于定义配置类,声明一个或多个 @Bean 方法,并交由Spring容器管理,以便在运行时为这些bean生成 BeanDefinition 和服务请求
@Bean
贴了该注解的方法返回的对象会交给 Spring 容器管理,相当于<bean></bean>
属性
- name:用于给bean取别名
- initMethod:配置bean的初始化方法
- destroyMethod:配置bean的销毁方法
@ComponentScan
用于扫描贴有 Spring 提供的 IoC、DI 注解,比如 Service、Controller 等,并创建对象放到 Spring 容器中。如果没有明确指明扫描路径,则代表扫描路径为当前类所在包下的所有类
在 Spring 配置类上贴该注解表示开启组件扫描器,默认扫描当前配置类所在的包,也可以自己指定,相当于<content:component-scan>
@PropertySource
加载指定的 properties 配置文件到 Spring 的 Environment中,Environment 接口提供方法去读取配置文件中的值,参数是 properties 文件中定义的 key 值
@ConfigurationProperties
读取系统全局的配置文件
@ImportResource
导入 Spring 配置文件,让配置文件中的内容生效
日期处理注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
出参格式化
// 出参格式化
JsonFormat(pattern = "yvyy-MM-dd HH:mm")
private Date appointmentTime; // 预约时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
入参格式化
// 入参格式化
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date appointmentTime; // 预约时间
定时器
org.springframework.scheduling.annotation
@EnableScheduling
开启对定时任务的支持,贴在类上
@EnableAsync
开启异步事件的支持,贴在类上
@Scheduled
任务调度注解,根据指定执行计划执行方法体逻辑
SpringCloud
@EnableDiscoveryClient
服务注册,在微服务项目中,会分为很多个子项目,每个子项目都会一个启动类,在启动类上贴上该注解,即可注册到注册中心上(比如nacos)
@LoadBalanced
负载均衡,在微服务项目中,我们会对请求比较多的服务进行集群部署,这个时候为了能让每个节点都能够比较平均地接收到请求,就可以使用该注解进行均衡处理
@EnableDiscoveryClient
@SpringBootApplication
public class OrderServer {
public static void main(String[] args) {
SpringApplication.run(OrderServer.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}