经验整理-10-注解汇总-100-@-及常见问题-注解不⽣效问题**java中常⽤的注解分三类:
1.JDK注解
2.Java第三⽅注解:spring、springmvc、springboot、dubbo
3.⾃定义注解**
-----------JDK注解-----
1、@Resource
详解
@Resource注解与@Autowired注解作⽤⾮常相似
@Resource的装配顺序:
(1)、@Resource后⾯没有任何内容,默认通过name属性去匹配bean,不到再按type去匹配
(2)、指定了name或者type则根据指定的类型去匹配bean
(3)、指定了name和type则根据指定的name和type去匹配bean,任何⼀个不匹配都将报错
@Autowired和@Resource两个注解的区别:
(1)、@Autowired默认按照byType⽅式进⾏bean匹配(多实例报错,巧记,@Autowired是spring推荐单例⾃动注⼊,按类型装配,适合单例,),@Resource是J2EE的annotation包下⾃带的,默认按照byName⽅式进⾏bean匹配(适合多实例按名称注⼊)
附:@Reference是dubbo⾃带的注⼊注解
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看⼀下导⼊注解的时候这两个注解的包名就⼀清⼆楚了
Spring属于第三⽅的,J2EE是Java⾃⼰的东西,因此,建议使⽤@Resource注解,以减少代码和Spring之间的耦合。
1)、共同点
两者都可以写在字段和setter⽅法上。两者如果都写在字段上,那么就不需要再写setter⽅法。
2)、不同点
(1)@Autowired
@Autowired为Spring提供的注解,需要导⼊包org.springframework.beans.factory.annotation.Autowired;只按照byType注⼊。
2、@PostConstruct
@PostConstruct注解好多⼈以为是Spring提供的。其实是Java⾃⼰的注解。
Java中该注解的说明:@PostConstruct该注解被⽤来修饰⼀个⾮静态的void()⽅法。被@PostConstruct修饰的⽅法会在服务器加载Servlet的时候运⾏,并且只会被服务器执⾏⼀次。PostConstruct在构造函数之后执⾏,init()⽅法之前执⾏。
通常我们会是在Spring框架中使⽤到@PostConstruct注解 该注解的⽅法在整个Bean初始化中的执⾏顺序:
Constructor(构造⽅法) -> @Autowired(依赖注⼊) -> @PostConstruct(注释的⽅法)
@PostConstruct与static的区别:构造⽅法的加载都在@PostConstruct注解的⽅法前,⽽static修饰的⽅法是在构造⽅法前的(当前类,所以static⽐@PostConstruct更优先加载)
-----------Java第三⽅注解-----
spring注解
1、⼯⼚实例化注解,需加扫描包配置:<context:component-scan base-package="***"/>
@org.springframework.stereotype.Service 标注⼀个业务逻辑组件类。
@Component 泛指组件,当组件不好归类的时候,我们可以使⽤这个注解进- ⾏标注。
@Controller⽤于标注控制层组件(如struts中的action)
@Repository⽤于标注数据访问组件,即DAO组件。
@Bean,就会作为这个Spring容器中的Bean。
@Configuration
从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法,这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义,初始化Spring容器
2、注⼊bean注解
@Autowired 默认按类型装配,如果我们想使⽤按名称装配,可以结合@Qualifier注解⼀起使⽤。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使⽤
3、其他注解
@Lazy(true) 表⽰延迟初始化
@org.springframework.stereotype.Service⽤于标注业务层组件、
@Scope ⽤于指定scope作⽤域的(⽤在类上)
@javax.annotation.PostConstruct 修饰init⽅法,那么spring就会在该bean的依赖关系注⼊完成之后回调该⽅法。
@PreDestroy destroy⽅法之后,实例
@Async异步⽅法调⽤
springMVC注解
1、@Controller
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把⽤户请求的数据经过业务处理层处理之后封装成⼀个Model ,然后再把该Model 返回给对应的View 进⾏展⽰。在SpringMVC 中提供了⼀个⾮常简便的定义Controller 的⽅法,你⽆需继承特定的类或实现特定的接⼝,只需使⽤@Controller 标记⼀个类是Controller ,然后使⽤@RequestMapping 和@RequestParam 等⼀些注解⽤以定义URL 请求和Controller ⽅法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的⽅法参数灵活的获取到。
@Controller ⽤于标记在⼀个类上,使⽤它标记的类就是⼀个SpringMVC Controller 对象。分发处理器将会扫描使⽤了该注解的类的⽅法,并检测该⽅法是否使⽤了@RequestMapping 注解。@Controller 只是定义了⼀个控制器类,⽽使⽤@RequestMapping 注解的⽅法才是真正处理请求的处理器。单单使⽤@Controller 标记在⼀个类上还不能真正意义上的说它就是SpringMVC 的⼀个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种⽅式: (1)在SpringMVC 的配置⽂件中定义MyController 的bean 对象。
(2)在SpringMVC 的配置⽂件中告诉Spring 该到哪⾥去标记为@Controller 的Controller 控制器。
<!--⽅式⼀-->
<bean class="com.host.ller.MyController"/>
<!--⽅式⼆-->
< context:component-scan base-package = "com.host.app.web" />//路径写到controller的上⼀层(扫描包详解见下⾯浅析)
2、@RequestMapping
RequestMapping是⼀个⽤来处理请求地址映射的注解,可⽤于类或⽅法上。⽤于类上,表⽰类中的所有响应请求的⽅法都是以该地址作为⽗路径。
RequestMapping注解有六个属性,下⾯我们把她分成三类进⾏说明(下⾯有相应⽰例)。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后⾯将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params: 指定request中必须包含某些参数值是,才让该⽅法处理。
el表达式获取session中的值headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求。
3、@Resource和@Autowired
@Resource和@Autowired都是做bean的注⼊时使⽤,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导⼊,但是Spring⽀持该注解的注⼊。
4、@ModelAttribute和 @SessionAttributes
代表的是:该Controller的所有⽅法在调⽤前,先执⾏此@ModelAttribute⽅法,可⽤于注解和⽅法参数中,可以把这个
@ModelAttribute特性,应⽤在BaseController当中,所有的Controller继承BaseController,即可实现在调⽤Controller时,先执⾏
@ModelAttribute⽅法。
@SessionAttributes即将值放到session作⽤域中,写在class上⾯。
具体⽰例参见下⾯:使⽤ @ModelAttribute 和 @SessionAttributes 传递和保存数据
5、@PathVariable
⽤于将请求URL中的模板变量映射到功能处理⽅法的参数上,即取出uri模板中的变量作为参数。
6、@requestParam
@requestParam主要⽤于在SpringMVC后台控制层获取参数,类似⼀种是Parameter(“name”),它有三个常⽤参数:defaultValue = “0”, required = false, value = “isA
pp”;defaultValue 表⽰设置默认值,required 铜过boolean设置是否是必须要传⼊的参数,value 值表⽰接受的传⼊的参数类型。
7、@ResponseBody
作⽤: 该注解⽤于将Controller的⽅法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写⼊到Response对象的body数据区。
使⽤时机:返回的数据不是html标签的页⾯,⽽是其他某种格式的数据时(如json、xml等)使⽤;
8、@Component
相当于通⽤的注解,当不知道⼀些类归到哪个层时使⽤,但是不建议。
9、@Repository
⽤于注解dao层,在daoImpl类上⾯注解。
注:
1、使⽤ @RequestMapping 来映射 Request 请求与处理器
⽅式⼀、通过常见的类路径和⽅法路径结合访问controller⽅法
⽅式⼆、使⽤uri模板
springboot注解
@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan让spring Boot扫描到Configuration类并把它加⼊到程序上下⽂。
@Configuration 等同于spring的XML配置⽂件;使⽤Java代码可以检查类型安全。
@EnableAutoConfiguration ⾃动配置。
@ComponentScan 组件扫描,可⾃动发现和装配⼀些Bean。
@Component可配合CommandLineRunner使⽤,在程序启动后执⾏⼀些基础任务。
@RestController注解是@Controller和@ResponseBody的合集,表⽰这是个控制器bean,并且是将函数的返回值直 接填⼊HTTP响应体中,是REST风格的控制器。
@Autowired⾃动导⼊。
@PathVariable获取参数。
@JsonBackReference解决嵌套外链问题。
@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使⽤。
@ResponseBody:表⽰该⽅法的返回结果直接写⼊HTTP response body中,⼀般在异步获取数据时使⽤,⽤于构建RESTful的api。在使⽤@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,⽽是直接写⼊HTTP response body中。⽐如异步获取json数据,加上@responsebody后,会直接返回json数据。该注解⼀般会配合@RequestMapping⼀起使⽤。
@RestController:⽤于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@ComponentScan:表⽰将该类⾃动发现扫描组件。
@Import:⽤来导⼊其他配置类。
@ImportResource:⽤来加载xml配置⽂件。
@Autowired:⾃动导⼊依赖的bean
@Value:注⼊Spring boot application.properties配置的属性的值。
hibernate注解
@Entity:将pojo类标记成实体,可以指定⼀个name属性,指定实体类的名称
@Table:注释改持久化类所映射的表
@UniqueConstraints:⽤于数据表的唯⼀约束 columnNames属性
@Index⽤于数据库建⽴索引
@DynamicInsert:指定⽤于插⼊记录的insert语句是否在运⾏时动态⽣成。并且只插⼊那些⾮空字段。默认值时false
@DynamicUpdate:指定⽤于更新巨⿅的update语句是否在运⾏是时动态⽣成,并且只更新那些修改过的字段,默认值是否false
@SelectBeforeUpdate:制动Hbiernate在更新某个持久化对象之前是否进⾏⼀次select(建议false)
@NotBlank只能作⽤在String上,不能为null,⽽且调⽤trim()后,长度必须⼤于0
#swagger2注解
@Api()⽤于类; 表⽰标识这个类是swagger的资源
@ApiOperation()⽤于⽅法; 表⽰⼀个http请求的操作
@ApiParam()⽤于⽅法,参数,字段说明;表⽰对参数的添加元数据(说明或是否必填等)
@ApiModel()⽤于类 表⽰对类进⾏说明,⽤于参数⽤实体类接收
@ApiModelProperty()⽤于⽅法,字段;表⽰对model属性的说明或者数据操作更改
@ApiIgnore()⽤于类,⽅法,⽅法参数 ;表⽰这个⽅法或者类被忽略
@ApiImplicitParam() ⽤于⽅法 ;表⽰单独的请求参数
@ApiImplicitParams() ⽤于⽅法,包含多个 @ApiImplicitParam
Mybaits注解
@Select 简单查询
@Insert 简单插⼊
@Update 简单更新
@Delete 简单删除
@Param : ⼊参
@Results : 结果集合
@Result : 结果
lombok整理
@Data 注解在类上;提供类所有属性的 getting 和 setting ⽅法,此外还提供了equals、canEqual、hashCode、toString ⽅法
@Setter :注解在属性上;为属性提供 setting ⽅法
@Setter :注解在属性上;为属性提供 getting ⽅法
@Log4j :注解在类上;为类提供⼀个 属性名为log 的 log4j ⽇志对象
@NoArgsConstructor :注解在类上;为类提供⼀个⽆参的构造⽅法
@AllArgsConstructor :注解在类上;为类提供⼀个全参的构造⽅法
@Cleanup : 可以关闭流
@Builder : 被注解的类加个构造者模式
@Synchronized : 加个同步锁
@SneakyThrows : 等同于try/catch 捕获异常
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会⽣成set⽅法
@ToString:⽆需启动调试器即可查看您的字段,注解会⾃动重写对应的toStirng⽅法
dubbo整理
@org.fig.annotation.Service //PS:若使⽤的是dubbo的Service注解时,在controller注⼊的时候,要选择
@Reference注解来进⾏注⼊。
@org.fig.annotation.Reference
附:Reference的⼀些核⼼属性
timeout:服务超时时间,单位:毫秒(这个设置是由优先级的,详情见dubbo配置优先级)
version:服务版本,与服务提供者保持⼀致,如果有多个版本的服务提供者可以动态选择
group:服务分组,当⼀个接⼝有多个实现的,可以使⽤分组进⾏区分,必须和服务提供⽅保持⼀致
retires:重试次数,默认为0
loadbalance:负载均衡策略,参数值为:random(随机), roundrobin(轮询), leastactive(最少活跃调⽤)
url:点对点直连服务提供者的地址,可以绕过注册中⼼。因为在dubbo启动之后,注册中⼼宕掉也可以通过本地缓存选择服务提供者进⾏调⽤,所以绕过注册中⼼,直连服务提供者也是可以的。
registry:指定注册中⼼注册获取服务列表,多个注册中⼼的话使⽤逗号隔开。
actives:每个服务消费者每个服务⽅法最⼤并发调⽤数。
protocol:只调⽤指定协议的服务提供⽅
-----------⾃定义便捷注解-----
万能性⽅法环绕注解⽰例:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论