原文链接:
– java常用注解整理
– @Validated 常用的注解
@ConditionalOnExpression
@ApiOperation
@ApiModelProperty
@ControllerAdvice
@ExceptionHandler
@ResponseStatus
@FeignClient
@EnableScheduling
@Scheduled
@KafkaListener
@Lazy
@Transactional
@Async
@Documented
@Constraint
@Slf4j
@EnableAsync
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
@EnableTransactionManagement
@EnableSwagger2
@MapperScan({"com.rs.topo.dao"})
@ServletComponentScan
@EnableAspectJAutoProxy(exposeProxy = true)
分类整理
Controller中常用的注解
注解 | 作用 | 作用位置 |
---|---|---|
@Controller | 处理http请求,@Controller 定义了一个控制器类,它需要配合使用@RequestMapping 注解的方法才是真正处理请求的处理器。使用此注解返回的不是Json数据,而是页面类数据。 | 标明在类上 |
@RestController | @RestController注解包含了原来的 @Controller 和 @ResponseBody 注解。使用@RestController注解的方法表示一个控制器,返回json。原来返回一个json需要@Controller和@RequestBody配合使用。 | 标注在类上 |
@PathVariable | 获取url中的参数。通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。即获取路径参数。格式为:url/{id} | 作用在参数前 |
@RequestParam | 获取请求参数的值.@RequestParam用于获取查询参数。格式为:url?name=AAA | 作用在参数前 |
@Vaild | @Vaild是验证参数的合法性 | 作用在参数前 |
@RequestMapping | 配置url映射,需要多个时可以将value写成一个集合 | 可以标明在类上也可以标明在方法上 |
@GetMapping | 组合注解,相当于@RequestMapping(method = RequestMethod.GET) | 可以标明在类上也可以标明在方法上 |
@PostMapping | 组合注解,相当于@RequestMapping(method = RequestMethod.POST) | 可以标明在类上也可以标明在方法上 |
@PutMapping | 组合注解,相当于@RequestMapping(method = RequestMethod.PUT) | 可以标明在类上也可以标明在方法上 |
@DeleteMapping | 组合注解,相当于@RequestMapping(method = RequestMethod.DELETE) | 可以标明在类上也可以标明在方法上 |
@RequestBody | @RequestBody传递的需要是对象 | 作用在参数前 |
@ResponseBody | @ResponseBody表示该方法的返回结果直接写入HTTP响应正文(ResponseBody)中,默认返回值是跳转路径; | 作用在方法上 |
依赖于Lombok的注解
注解 | 作用 | 使用位置 |
---|---|---|
@Accessors(chain = true) | 链式编程,依赖于 ·Lombok | 作用在实体类上 |
@Getter/@Setter | 使用@Getter/@Setter来代替 getter 和 setter 方法 | 作用在实体类上 |
@ToString | @ToString 会给类自动生成易阅读的 toString 方法,带上有所非静态字段的属性名称和值 | 作用在实体类上 |
@EqualsAndHashCode | @EqualsAndHashCode 注解就是用于根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法,方便我们用于对象间的比较 | 作用在实体类上 |
@Data/@Value | 等价于@Getter,@FieldDefaults,@AllArgsConstructor, @ToString,@EqualsAndHashCode, @Data | 作用在实体类上 |
@NonNull | @NonNull 用于标记类中不能允许为 null 的字段或者参数上,任何使用该字段的地方都生成空指针判断代码,若@NonNull 标记的变量为 null,抛出 NullPointException (NPE) 异常。 | 用在字段或者参数上 |
@NoArgsConstructor | @NoArgsConstructor 为实体类生成无参的构造器方法 | 作用在实体类上 |
@AllArgsConstructor | @AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法 | 作用在实体类上 |
@RequiredArgsConstructor | @RequiredArgsConstructor 为实体类生成指定字段的构造器方法,而这些字段需要被 final,或者 @NonNull修饰。 | 作用在实体类上 |
@Builder | @Builder 是一个非常强大的注解,提供了一种基于建造者模式的构建对象的 API。使用 @Builder 注解为给我们的实体类自动生成 builder() 方法,并且直接根据字段名称方法进行字段赋值,最后使用 build()方法构建出一个实体对象。 | 作用在实体类上 |
@Builder 注解
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class LombokBuilder {
private int id;
private String name;
}
public class TestMain {
public static void main(String[] args) {
LombokBuilder lombokBuilder = LombokBuilder.builder().id(2).build();
}
}
@Builder 不支持父类字段的生成,当一个实体类存在父类时,@Builder 只能生成当前类的字段构建方法。若需要用到父类的字段方法时, Lombok 提供了新的注解 @SuperBuilder 来应对这种情况,下面是 @SuperBuilder 注解的使用方式。
@SuperBuilder
@Data
public class LombokBuilderParent {
private String value;
}
@Data
@SuperBuilder
public class LombokBuilder extends LombokBuilderParent{
private int id;
private String name;
}
日志注解
Lombok也支持了各式各样的日志注解,对应的注解如下:
@CommonsLog 等价效果: private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger 等价效果: private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBosLog 等价效果: private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log 等价效果: private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j 等价效果: private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2 等价效果: private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j 等价效果: private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j 等价效果: private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
Service层注解
注解 | 作用 | 使用位置 |
---|---|---|
@Slf4j | 用作日志输出,在该类添加了该注释之后,就可以在代码中直接引用log.info( ) 打印日志了,该注解需要lombok插件 | 作用在类上 |
@Transactional | @Transactional:是声明式事务管理,只有public的方法才起作用,只读的接口不需要使用事务接口。 | 在接口实现类或接口实现方法上添加 |
Mapper层注解
注解 | 作用 | 使用位置 |
---|---|---|
@Mapper | @Mapper注解是由Mybatis框架中定义的一个描述数据层接口(dao)的注解,注解往往起到的都是一个描述性作用,用于告诉spring框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。 | 作用在类上 |
@Param | @Param的作用就是给参数命名 | 基本类型的参数与JavaBean对象 |
@Param
实例一:@Param注解基本类型的参数
mapper中的方法
public User selectUser(@Param("userName") String name,@Param("password") String pwd);
映射到xml中的标签
<select id="selectUser" resultMap="User">
select * from user where user_name = #{userName} and user_password=#{password}
</select>
其中where user_name = #{userName} and user_password = #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。
实例二:@Param注解JavaBean对象
SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制
mapper中的方法:
public List<User> getAllUser(@Param("user") User u);
映射到xml中的标签
<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">
select
from user t where 1=1
and t.user_name = #{user.userName}
and t.user_age = #{user.userAge}
</select>
注意点
- 当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。
- 当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
- 不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
@Select("SELECT * from Table where id = #{id}")
Enchashment selectUserById(User user);
spring注解
注解 | 作用 | 作用位置 |
---|---|---|
@Resource(“名称”) | 声明需要自动装配的bean,@Resource是名称驱动的注入,只要保证bean命名唯一就不会出现多bean的问题。 | 写在字段上,或写在setter方法上 |
@Autowired | 声明需要自动装配的bean,@Autowired是类型驱动的注入,存在多bean问题 | 写在字段上,或写在setter方法上 |
@Qualifier(“名称”) | @Qualifier来限定注入的Bean,@Autowired想使用名称装配可以结合@Qualifier注解进行使用 | 写在字段上,或写在setter方法上 |
@component | 是实现bean的注入,使用注解 取代 xml配置文件,@Repository(“名称”):dao层,@Service(“名称”):service层,@Controller(“名称”):web层 | 写在类上 |
@ConditionalOnExpression | ||
@Configuration | @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。 | 作用在类上 |
@Conditional | 满足指定的条件,则进行组件注入 | 作用在类上 |
@Import | @Import注解是用来导入配置类或者一些需要前置加载的类. | |
@Order | 作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序 | 注解可以作用在类(接口、枚举)、方法、字段声明(包括枚举常量) |
@Bean | @Bean标注的方法会生成一个由 Spring 容器管理的 bean。 | 应用在方法(还可以用在注解上)上 |
@Value | 通常用于注入外部化属性 | 作用在属性上 |
@Autowired与@Qualifier的使用
@Autowired(required = false)
private Date date ;
@Autowired
@Qualifier("birth")
private Date birthday ;
@Conditional的使用
1.主程序类 2.实体类 3.测试配置类
@ConditionalOnBean:表示当容器中存在某个组件才进行组件注入
@ConditionalOnMissingBean:表示当容器中没有某个组件才进行组件注入
@Order注解
- @Order注解源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
/**
* 默认是最低优先级,值越小优先级越高
*/
int value() default Ordered.LOWEST_PRECEDENCE;
}
- @Order注解说明
- 注解可以作用在类(接口、枚举)、方法、字段声明(包括枚举常量);
- 注解有一个int类型的参数,可以不传,默认是最低优先级;
- 通过常量类的值我们可以推测参数值越小优先级越高
@Bean注解
@Bean 与 xml 文件中的 <bean/>
标签等同,@Bean需要和@Component或者 @Configuration一同使用,通常是和 @Configuration,例:
@Configuration
public class BeanConfig {
@Bean
public UserServiceImpl u(){
return new UserServiceImpl();
}
}
@Bean的使用
- value
public class UserServiceImpl {
}
@Bean({"u1","u2"}) // beanName 为 u1,别名为u2
public UserServiceImpl u(){
return new UserServiceImpl();
}
- autowireCandidate
autowireCandidate属性设置为 false,在 ProductServiceImpl类中使用 @Autowired进行注入,这时会报错。
@Bean(name = {"u1","u2"},autowireCandidate = false)
public UserServiceImpl u(){
return new UserServiceImpl();
}
@Component
public class ProductServiceImpl {
//此处添加@Autowired便会报错
@Autowired
private UserServiceImpl userService;
}
- initMethod
指定初始化方法为initMethod2。
@Bean(name = {"u1","u2"},initMethod = "initMethod2")
public UserServiceImpl u(){
return new UserServiceImpl();
}
在 UserServiceImpl类中添加 initMethod2方法。
public void initMethod2(){
System.out.println("UserServiceImpl = initMethod2");
}
- destroyMethod
指定销毁方法,destroyMethod2。
@Bean(name = {"u1","u2"},initMethod = "initMethod2",destroyMethod = "destroyMethod2")
在 UserServiceImpl类中添加 destroyMethod2方法。
public void destroyMethod2(){
System.out.println("UserServiceImpl = destroyMethod2");
}
在容器停止时,会调用 destroyMethod2方法。不过,只是有单例 bean 才会调用该方法,如果是其他作用域,不会调用该方法。
如果你在 UserServiceImpl中添加了名为“close”或“shutdown”的公共、无参数方法,即使你不指定 destroyMethod属性,也会被调用,如果想禁用,请将destroyMethod 属性值设置为 “”。
@ComponentScan(basePackages = "com.cxyxj.beandemo")
public class AppMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppMain.class);
// 打印 bean 名称
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String name : beanDefinitionNames){
System.out.println(name);
}
//根据 beanName 获得别名
String[] u1s = context.getAliases("u1");
System.out.println("别名" + Arrays.asList(u1s));
// 关闭容器
context.close();
}
}
- 注意点
发现@Bean的源码定义中并没有环境激活、懒加载、作用域、是否首选Bean、依赖的设置,它应该和@Profile、@Lazy @Scope、@DependsOn、@Primary 一起使用来声明。
@Profile:指定Bean在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个Bean。
@Scope将 bean 的范围从单例更改为指定范围。
@Lazy只有在默认单例范围的情况下才有实际效果。
@DependsOn强制在创建此 bean 之前创建特定的其他 bean。
@Primary指示当多个候选者有资格自动装配依赖项时,应优先考虑该bean
- 更多注意点
点击查看更多注意点
@Bean需要和@Component或者 @Configuration一同使用,通常使用 @Configuration。这两者之间有什么区别呢?
@Value注解
- 注入普通属性
@Value
注解可以注入一些字段的普通属性,并且会自动进行类型转换
例子:
@Repository
public class ConnectionPool {
@Value("jdbc:mysql://localhost:3306/test")
private String url;
@Value("com.mysql.jdbc.Driver")
private String driveName;
@Value("Scott")
private String userName;
@Value("10")
private int no;
//重写下toString方法
}
定义配置类,用于扫描bean
@Configuration
@ComponentScan("com.fx.dao")
public class myConfig2 { }
SpringBoot 注解
注解 | 作用 | 作用位置 |
---|---|---|
@ConfigurationProperties () | @ConfigurationProperties 注解,可以获取application.properties 或 application.yml 文件中参数值 | 作用在类上 |
@Validated | 对传输的参数进行数据校验的注解 | 作用在类、方法和参数上 |
@ConfigurationProperties注解
@ConfigurationProperties 的三种使用方式
1.@ConfigurationProperties需要和@Configuration配合使用,通常在一个POJO里面进行配置`
`以下代码会读取properties文件中所有以mail开头的属性,并和bean中的字段进行匹配
@Data
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
}
2.@EnableConfigurationProperties注解中手动导入配置文件
@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class ConfigPropApp {
public static void main(String[] args) {
SpringApplication.run(ConfigPropApp.class,args);
}
}
3.@ConfigurationPropertiesScan中指定Config文件的路径:
@SpringBootApplication
@ConfigurationPropertiesScan("com.flydean.config")
public class ConfigPropApp {
public static void main(String[] args) {
SpringApplication.run(ConfigPropApp.class,args);
}
}
@Import支持 三种方式
1.带有@Configuration的配置类(4.2 版本之前只可以导入配置类,4.2版本之后 也可以导入 普通类)
2.ImportSelector 的实现
3.ImportBeanDefinitionRegistrar 的实现
@Validated
所有参数注解含义
空检查
注解 | 描述 |
---|---|
@Null | 验证对象是否为null |
@NotNull | 验证对象是否不为null, 无法查检长度为0的字符串 |
@NotBlank | 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格 |
@NotEmpty | 检查约束元素是否为NULL或者是EMPTY |
Booelan检查
注解 | 描述 |
---|---|
@AssertTrue | 验证 Boolean 对象是否为 true |
@AssertFalse | 验证 Boolean 对象是否为 false |
长度检查
注解 | 描述 |
---|---|
@Size(min=, max=) | 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
@Length(min=, max=) | 验证字符串的长度是否在给定的范围之内,包含两端 |
日期检查
注解 | 描述 |
---|---|
@Past | 验证 Date 和 Calendar 对象是否在当前时间之前 |
@Future | 验证 Date 和 Calendar 对象是否在当前时间之后 |
数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为””,Integer为null
注解 | 描述 |
---|---|
@Min | 验证 Number 和 String 对象是否大等于指定的值 |
@Max | 验证 Number 和 String 对象是否小等于指定的值 |
@DecimalMax | 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 |
@DecimalMin | 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 |
@Digits | 验证 Number 和 String 的构成是否合法 |
@Digits(integer=,fraction=) | 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 |
@Range(min=, max=) | 检查带注释的值是否位于(包括)指定的最小值和最大值之间。 |
验证是否是邮件地址,如果为null,不进行验证,算通过验证 |
自定义注解元注解
注解 | 作用 | 作用范围 |
---|---|---|
@Retention作用是定义被它所注解的注解保留多久 | ||
@Target | 指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。 | 作用在注解类上 |
@Retention | 指明修饰的注解的生存周期,即会保留到哪个阶段。 | 作用在注解类上 |
@Documented | @Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员 | 作用在注解类上 |
@Retention注解
一共有三种策略,定义在RetentionPolicy枚举中.
从注释上看:
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码
明确生命周期长度 SOURCE < CLASS < RUNTIME ,如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作就用 CLASS注解;如果只是做一些检查性的操作则可选用 SOURCE 注解。
@Target
- @Target:注解的作用目标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Retention注解
- @Retention:注解的保留位置
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
@Documented 注解
SpringAOP注解
注解 | 作用 | 作用位置 |
---|---|---|
@Aspcet | @Aspcet 把当前类标识为一个切面,供容器读取。 | |
@Pointcut | @Pointcut 定义切入点,例如@Pointcut("execution(* com.sz.blog.service.UserService.*())") 中第一个* 代表接受返回类型,* 代表可以接受任意返回返回值。com.sz.blog.service.UserService其中UserService是类名称,可以替换为* 号通配service包下所有的类。也可以指定类的前缀或者后缀作为通配例如:* Service,通配所有以service结尾的类。最后一个*() ,表示这个类下的所有方法。 |
|
@Around | @Around 环绕增强,@Around可以在一个方法里面完成 @Before和@After的功能。 | |
@AfterReturning | @AfterReturning 后置增强,相当于AfterReturnningAdvice,方法正常退出时执行 | |
@Before | @Before 表示一个前置增强方法,相当于BeForeAdvice的功能。代理方法前执行 | |
@AfterThrowing | @AfterThrowing 异常抛出增强,相当于ThrowsAdvice | |
@After | @After final增强,不管是抛出异常或是正常退出都会正常执行。 |
swagger提供的注解
注解 | 作用 | 作用范围 |
---|---|---|
@ApiOperation |
java自带注解
注解 | 作用 | 作用范围 |
---|---|---|
@PostConstruct | 在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。 | 作用在方法上(@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。) |
@PostConstruct注解
执行顺序
其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象a和对象p,才能执行注入。所以,如果一个类A中有个成员变量p被@Autowried注解,那么@Autowired注入是发生在A的构造方法执行完之后的。
如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么久无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
Constructor >> @Autowired >> @PostConstruct