java常用注解整理

@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注解

  1. @Order注解源码
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
 
    /**
     * 默认是最低优先级,值越小优先级越高
     */
    int value() default Ordered.LOWEST_PRECEDENCE;
}
  1. @Order注解说明
  • 注解可以作用在类(接口、枚举)、方法、字段声明(包括枚举常量);
  • 注解有一个int类型的参数,可以不传,默认是最低优先级
  • 通过常量类的值我们可以推测参数值越小优先级越高

@Bean注解

@Bean 与 xml 文件中的 <bean/> 标签等同,@Bean需要和@Component或者 @Configuration一同使用,通常是和 @Configuration,例:

@Configuration
public class BeanConfig {
    @Bean
    public UserServiceImpl u(){
        return new UserServiceImpl();
    }
}

@Bean的使用

  1. value
public class UserServiceImpl {
}

@Bean({"u1","u2"})  // beanName 为 u1,别名为u2
public UserServiceImpl u(){
    return new UserServiceImpl();
}
  1. 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;
}
  1. initMethod
指定初始化方法,initMethod2。
@Bean(name = {"u1","u2"},initMethod = "initMethod2")
public UserServiceImpl u(){
    return new UserServiceImpl();
}
在 UserServiceImpl类中添加 initMethod2方法。
public void initMethod2(){
    System.out.println("UserServiceImpl = initMethod2");
}
  1. 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();
    }
}
  1. 注意点
    发现@Bean的源码定义中并没有环境激活、懒加载、作用域、是否首选Bean、依赖的设置,它应该和@Profile、@Lazy @Scope、@DependsOn、@Primary 一起使用来声明。
@Profile:指定Bean在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个Bean。
@Scope将 bean 的范围从单例更改为指定范围。
@Lazy只有在默认单例范围的情况下才有实际效果。
@DependsOn强制在创建此 bean 之前创建特定的其他 bean。
@Primary指示当多个候选者有资格自动装配依赖项时,应优先考虑该bean
  1. 更多注意点
    点击查看更多注意点
    @Bean需要和@Component或者 @Configuration一同使用,通常使用 @Configuration。这两者之间有什么区别呢?

@Value注解

  1. 注入普通属性
    @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

所有参数注解含义

详细点这里

自定义注解元注解

注解作用作用范围
@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
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值