前言
很多人人刚接触Spring架构的时候都有这样疑惑,注解是什么?有什么用?各个注解都表示什么意思?什么时候该用对应的注解?有太多的疑惑了。
简单总结一下目前我在项目中接触到的Spring boot的注解。
什么是注解
在学习之前,得先搞明白什么是注解,
其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。
例如:Java中的基本注解之一@Override
表示限定父类重写方法,当之类重写父类方法是,之类可以加上这个注解,这可以确保之类确实重写了父类的方法,避免出现低级错误。如果方法有Override注解,但没有任何父类或实现的接口声明该方法,则编译器会报错,强制程序员修复该问题。
常用注解
Controller层
@Controller
@RequestMapping
@Controller//在Controller类中用于定义一个控制器类 @RequestMapping//一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上则是对方法进行注解以产生访问的路径。
例如:
//放在类名上设置请求前缀 @RequestMapping("words-filter") //放在方法名上设置请求映射url: @RequestMapping(value = "add", method = {RequestMethod.POST})
那么这个方法的访问地址为:/words-filter/add
value用于设置方法或者类的映射路径,也可以直接写路径。
如@RequestMapping(“words-filter”)相等于@RequestMapping(value=“words-filter”)
method用于指定请求的方法,可以设置单个或者多个,如果请求方法不满足条件这会请求失败。
请求方法常用的有,GET、POST、PUT、DELETE等。
params可以指定多个url携带的参数,请求中必须包含某些参数值,才能让该方法处理。
params={paramsA}:表示请求必须包含名为paramsA的请求参数。
params={paramsA,paramsB}表示请求必须包含名为paramsA和paramsB的请求参数。
params={paramsA=valueA,paramsB}表示请求必须包含名为paramsA和paramsB的请求参数。且paramsA的值必须为valueA。
另外
Ant风格资源地址支持3种通配符:
—— ? : 匹配文件名中的一个字符
—— * : 匹配文件名中的任意多个字符(至少有一个字符)
—— ** : 匹配多层路径(至少有一层)
例如:
@RequestMapping(value = “/add/some??”) 匹配/add/AA(??匹配任意两个字符)
@RequestMapping(value = “add/*/some”)
@RequestMapping(value = “add/**/some”) url可以是add/aa/bb/some等等url
@ResponseBody
表示该方法的返回结果直接写入HTTP response body中
般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析
为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
@RequestParam
@RequestParam //获取查询参数。即url?name=这种形式
获取前端传递给后端的参数,可以是get方式也可以是post方式。其中如果前端传递的参数和后端你接受的参数是一致的可以省略不写,如果不一致一定要完整写,例如 :
@RequestMapping(value ="sensitiveConfig/{user}" ,method = {RequestMethod.GET}) public FrontResult selectSensitiveCourseClassConfig(@RequestParam String userPhone)
@PathVariable
@PathVariable //获取路径参数。即url/{id}这种形式。
例如:
@RequestMapping(value ="sensitiveConfig/{userPhone}" ,method = {RequestMethod.GET}) public FrontResult selectSensitiveCourseClassConfig(@ApiParam(name="userPhone",value = "用户手机号")@PathVariable(name="userPhone")String userPhone){ } //@ApiParam,是注解api的参数,用于swagger
service层
@Service注解是@Component的一个延伸(特例),它用于标注业务逻辑类。与@Component注解一样,被此注解标注的类,会自动被Spring所管理。@SpringBootApplication//这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。
@EnableAutoConfiguration//允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。@ComponentScan//组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。
@Configuration//用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。
@Repository注解也是@Component注解的延伸,与@Component注解一样,被此注解标注的类会被Spring自动管理起来,@Repository注解用于标注DAO层的数据持久化类。
@Bean注解主要的作用是告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中。@Bean注解的用法很简单
@Autowired
@Resource
@Resource(name=”name”,type=”type”) //没有括号内内容的话,默认byName。与@Autowired干类似的事;
相同点:@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
不同点:
1、提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。
2、注入方式:@Autowired只按照byType 注入;@Resource默认按byName自动注入,也提供按照byType 注入;
3、属性:@Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用;@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
@Component //spring中的一个注解,它的作用就是实现bean的注入。(@Service,@Repository,@Controller是该注解的衍生注解)
@bean //@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。注解@Bean被声明在方法上,方法都需要有一个返回类型,而这个类型就是注册到IOC容器的类型。
@Import //这种方法最为直接,直接把指定的类型注册到IOC容器里,成为一个java bean,可以把@Import放在程序的入口,它在程序启动时自动完成注册bean的过程。
mapper(DAO)层
@Mapper //是 Mybatis 的注解,和 Spring 没有关系。使用mybatis时一定要有,否则 Mybatis 找不到 mapper。
@Repository //用于标注数据访问组件,即DAO组件,是 Spring 的注解,用于声明一个 Bean。@Repository 可有可无,可以消去依赖注入的报错信息