未来的框架趋势是“约定大于配置”,代码的封装会更加严密。开发人员会将更多的精力放在代码的整体优化和业务逻辑上,所以注解式编程会被更加广泛地使用。那么什么是注解?Spring Boot的常用注解有哪些?
什么是注解?
注解(annotations)是来定义一个类、属性或一些方法,以便程序能被编译处理。它相当于一个说明文件,告诉应用程序某个被注解的类或属性是什么,要怎么处理。注解可以用于标注包、类、方法和变量等。比如在《初识Spring Boot》一文中新建工程中的HelloWorldController类文件标注HelloWorldController类使用的@RestController注解。
@RestController
public class HelloWorldController {
……
}
常用注解
使用在类名上的注解
@RestController
它用于返回JSON、XML等数据,但不能反悔HTML页面。相当于注解@ResponseBody和@Controller合在一起的作用。
@Controller
它用于标注控制器层,在MVC开发模式中代表C(控制器)。所以@Controller主要用于构建MVC模式的程序。
以下两段代码是等效的。
@RestController
public class Demo{
@RequestMapping("/demoUrl")
public String Hello() throws Exception {
return "Hello World!";
}
}
@Controller
public class Demo{
@RequestMapping("/demoUrl")
@ResponseBody
public String Hello() throws Exception {
return "Hello World!";
}
}
@Service
它用于声明一个业务处理类(实现非接口类),用于标注服务层,处理业务逻辑。
比如,想要处理关于产品的一些功能(增删改查)
/**
* Description: 实现处理关于产品的功能
*/
@Service
public class ProductServiceImpl implements ProductService {
……
}
@Repository
它用于标注数据访问层,即DAO层(也有叫Mapper层)。它表示一个仓库,主要用于封装对于数据库的访问。换句话说,@Repository注解修饰哪个类表明这个类具有对数据库CRUD的功能,用在持久层的接口上。
比如,通过产品名称,查找某个产品。
@Repository
public interface ProductRepository {
ProductEntity findProductByProductName(String productName)
}
@Component
它用于把普通POJO(Plain Ordinary Java Objects,简单的Java对象)实例化到Spring容器中,当类不属于注解@Controller和@Service等时,就可以使用注解@Component来标注这个类。它可配合CommandLineRunner使用,以便在程序启动后执行一些基础任务。
@Configuration
它用于标注配置类,并且可以由Spring容器自动处理。它作为Bean(Bean,指任何被 Spring 加载生成出来的对象)的载体,用来指示一个类声明、一个或多个@Bean方法,在运行时为这些Bean生成BeanDefinition和服务请求。
@Resource
它用于装配Bean,也可以写在字段上或Setter方法上。
public class DemoController {
@Resource
private ProductRepository productRepository;
……
}
@Autowired
它表示被修饰的类需要注入对象。Spring会扫描所有被@autowired标注的类,然后根据类型在IoC容器中找到匹配的类进行注入。被@Autowired注解后的类不需要再导入文件。
@RequestMapping
它用来处理请求地址映射,用在类或方法上。如果用在类上,则表示类中的所有响应请求的方法都是以该地址作为父路径的。该注解有6个属性。
- Params:指定Request中必须包含某些参数值,才让该方法处理。
- Headers:指定Request中必须包含某些指定的header值,才能让该方法处理请求。
- Value:指定请求的实际地址,指定的地址可以是URI Template模式。
- Method:指定请求的Method类型,如GET、POST、PUT、DELETE等。
- Consumes:指定处理请求的提交内容类型Content-Type,如“application/json,text/html”。
- Produces:指定返回的内容类型。只有当Request请求头中的Accept类型中包含该指定类型时才返回。
@Transactional
它可以用在接口、接口方法、类及类方法上。
但Spring不建议在接口或者接口方法上使用该注解,因为该注解只有在使用基于接口的代理时才会生效。如果异常被捕获(try { } catch { })了,则事务就不回滚了。如果想让事务回滚,则必须再往外抛出异常(try { } catch { throw Exception })。
@Qualifier
它的意思是“合格者”,用于标注哪一个实现类才是需要注入的。需要注意的是,@Qualifier的参数名称为被注入的类中的注解@Service标注的名称。
@Qualifier常和@Autowired一起使用,如以下代码:
@Autowired
@Qualifier("productService")
@EnableAutoConfiguration
可用在入口类或普通类类名上,用来提供自动配置。
@SpringBootApplication
常用在入口类上,用来启动入口类Application。
@EnableScheduling
可用在入口类或普通类类名上,用来开启计划任务。Spring通过@Scheduled支持多种类型的计划任务,包含cron、fixDelay、fixRate等。
@EnableAsync
可用在入口类或者普通类类名上,用来开启异步注解功能。
@ComponentScan
可用在入口类或普通类类名上,用来扫描组件,可自动发现和装配一些Bean。它根据定义的扫描路径,把符合扫描规则的类装配到Spring容器中,告诉Spring哪个包(package)的类会被Spring自动扫描并且装入IoC容器。它对用XML配置中的元素。可以通过basePackages等属性来细粒度地定制自动扫描的范围,默认会从声明@ComponentScan所在类的包进行扫描。
@Aspec
可用在入口类或普通类类名上,标注切面,可以用来配置事物、日志、权限验证,在用户请求时做一些处理等。
@ControllerAdvice
用在普通类类名上,包含@Component,可以被扫描到。统一处理异常。
使用在方法上的注解
@RequestBody
常用来处理application/json、application/xml等Content-Type类型的数据,意味着HTTP消息是JSON/XML格式,通过@RequestBody将请求体中的字符串绑定到相应的Bean上,也可以将其分别绑定到对应的字符串上。
@RequestMapping("/post")
public void demoPost(@RequestBody String name) {
system.out.print("接收到的name参数值为:",name)
}
@PathVariable
用于获取路径中的参数
@Bean
它代表产生一个Bean,并交给Spring管理。用于封装数据,一般有Setter、Getter方法。在MVC模型中,对应的是M(模型层)
@ResponseBody
它的作用是通过转换器将控制器中方法返回的对象转换为指定的格式,然后写入Response对像的body区。它常用来返回JSON/XML格式的数据。使用此注解后,数据直接写入输入流中,不需要进行视图渲染。
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java/spring-boot-common-annotations.html