深度肝文,spring注解及其应用实例,你知道的和不知道的都有

本文共收录Spring注解几十个,都是常用的注解,每一个都有使用说明,应用实例及应用效果,看完让你编程实力与效率大增,绝对的功力修炼增强篇。由于篇幅太长,建议关注后,收藏备查。

Spring注解

@Autowired

1、说明 对类成员变量、方法及构造函数进行标注。Spring框架会在该注释的变量、方法或构造函数为其找到按类型匹配的Bean并注入。在成员变量上使用时,需要把对应的getter,setter方法去掉。
该注解有个属性为required,可以配置为false,如果配置为false之后,当没有找到相应bean的时,系统不会抛错。
2、注意事项:使用该注释的成员变量要确保其类型只有一个实现。例如:接口或超类A,在项目中只有一个具体实现B。如果有B和C,则需配合@Qualifier使用。或使用@Service(name=“B”)
3、如何使用

@Aspect

1、说明:声明一个类为切面类。和@Component一起使用。可以使用@Order来决定切面类的优先处理顺序,数值越小越先执行。
2、注意事项:声明为切面的类,需创建切入点方法,并将方法标记为@Pointcut,同时创建切入点处理方法并标记为@Before,@Around,@AfterReturning,@After中的一种或几种。注意:在项目中使用多个Aspect类或有@ExceptionHandler时 ,当标记为@Around的处理方法有返回值时,不能将方法体内的处理过程使用try-catch/finnaly捕获异常,否则会出现意想不到的BUG(具体原理请参考spring-web处理过程,切面处理是优先于@ExceptionHandler的)。
3、如何使用:一般使用于日志记录,业务规则过滤,权限规则判断

@Aspect
@Component
@Order(1)
public class MyLogAspect {
   @Pointcut("execution(public * abc.*.controller.*Controller.*(..))")
    public void logPointCut() {
    }
   @Around("logPointCut()")
   public Object doLogAround(ProceedingJoinPoint pjp) throws Throwable {
      //....业务处理过程
      try{//这里不应该使用try-finnaly或try-catch 否则
      Object res =  pjp.proceed();
	  return res;
	  }finnaly {}//这里不应该使用try-finnaly或try-catch 否则
  }
}

切面使用原则:处理完所要处理的业务后原样返回,非必要不捕捉异常,不对参数/结果进行特别处理,因为程序调用流程还要进行下去(生活还要继续下去,你能怎么办),如果别的切面拿到的参数被修改过了就会出问题。

@Bean

1、说明:是spring容器向程序提供的可自定义bean生成机制,它是方法级别上的注解,需与@Configuration、@Component共用。类被添加@Configuration及其方法添加@Bean注解,即向spring容器声明由此方法创建的bean交由spring容器管理。其它类可使用@Autowired或@Service要求spring容器注入此bean。
2、注意事项:当@Bean(name = “myname”)添加别名后,在只有一个实现类时,@Autowired,@Resource都无需指定别名自动装配
3、如何使用

@Controller

1、说明 定义一个控制器类。
2、注意事项:如不加@ResponseBody返回的是与该控制器类对应的视图路径。
3、如何使用 在类方法上与@RequestMapping一起使用。
在方法或在类上与 @ResponseBody使用,返回结果才能是JSON格式数据。

@Cacheable

1、说明 在标注的方法上使用缓存。使用cacheNames来命名缓存组,使用 key来指定key。例如: @Cacheable(cacheNames=“products”,key=“#id”)。使用传入方法的参数来作为key。
2、注意事项:需要在 SpringBoot 的主启动类开启缓存使用,即标注@EnableCaching。针对方法配置,能够根据方法的请求参数对其结果进行缓存
3、如何使用

//将pId作为缓存key,查询结果p放入到products名称的map里,即map(id,p)
@Cacheable(cacheNames="products",key="#pId")
public Product findById(Long pId){
    Product p = productDao.get(pId);
    return p;
}

@CacheEvict

1、说明 删除指定 key 的缓存数据条目。删除缓存value内key的对象/值
2、注意事项 针对方法配置,能够根据一定的条件对缓存进行清空
3、如何使用

@CacheEvict(value = {"products"},key="#pro.getId()")
public boolean deleteById(Product pro) {        
return 	dao.removeById(id);
}

@CachePut

1、说明 更新缓存value里key的值。确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新
2、注意事项 key = # 下例中表明执行参数。与Cacheable 不同的是,它每次都会触发真实方法的调用。
3、如何使用 如下例,返回对象Product 将以id=Product形式缓存

@CachePut(value="products",key="#product.getId()")
public Product loadProduct(Product product){
}

@Caching

1、说明 Cacheable,CacheEvict,CachePut的组合。适合于有两种以上不同的需求,都是放在同一个方法上。
2、注意事项
3、如何使用

@Caching(cacheable={@Cacheable(value="xxx", key="#id")},
         put={@CachePut(value="XXX",key="#id")},
         evict={@CacheEvict(value={"products"},key="#id")}
    )
    public void getXXXX(String id) {
        return dao.getXXX(id);
    }

@Cleanup

1、说明 Lombok的Cleanup。类似于在try catch 的 finally中关闭IO流资源。业务逻辑处理完后,会自动帮我们调用io.close()方法。如果io没有close()方法,则可以指定无参的方法。即MyInputStream 里有一个myclose()方法。
2、注意事项
3、如何使用 在IO声明前的一行标注

@Cleanup 
InputStream in = new FileInputStream("");
或者
@Cleanup("myclose()")
MyInputStream myin = new MyFileInputStream("");

@CrossOrigin

1、说明 跨源资源共享,可以让程序员在控制器层方法中标注此方法为跨域资源,已经获得授权的登录者使用此资源。也可以标注在控制层类上,以表明该类下的所有方法都被定义为跨域资源。除了此之外Springcloud提供基于过滤器的CORS支持,提供更加通用性的跨源资源共享方案。如果各个系统使用同一单点登录的鉴权系统,那么使用跨域标注,可以省去再次登录的麻烦。
2、注意事项注意SpringMVC的版本要在4.2或以上版本才支持@CrossOrigin。
3、如何使用

@RestController
@RequestMapping("/user/my")
@CrossOrigin
public class MyController {
}

@Component

1、说明 将标注@Component注解的类交由spring管理
2、注意事项 有多个父子关系的类时可以指定名称,指定引入@Resource时注意要加上名称
3、如何使用

@Component("mythreadPool")
@Slf4j
public class ThreadPoolExecutorServiceHolder {
}

@Configuration

1、说明 配置类,应用启动后首先读取*.yml上的参数设置。需要在Application上添加@EnableAutoConfiguration或者添加@SpringBootApplication。与@PostConstruct()
使用起奇效
2、注意事项
3、如何使用 下例是读取*.yml不鉴权的URI。在init方法里也可以使用读取数据库的配置。读取到不鉴权的URI后可以设置spring security的参数

@Configuration
@Data
public class SystemConfig {
    @Value("${security.oauth2.resource.ignore-uris}")
    private String oauth2IgnoreUris;
    public static String[] OAUTH2_SECURITY_IGNORE_URIS;
    @PostConstruct()
    public void init() {
	List<String> uris = JSONArray.parseArray(this.getOauth2IgnoreUris(),String.class);
	OAUTH2_SECURITY_IGNORE_URIS = uris.toArray(new String[uris.size()]);
    }

}

///在ResourceServerConfig中设置非鉴权URI
.authorizeRequests().antMatchers(SystemConfig.OAUTH2_SECURITY_IGNORE_URIS).permitAll()//注意路径不要带webroot

@ConfigurationProperties

1、说明 该标注是让*.yml里的配置参数值,以对象的方式填到对象属性中,省缺@Value,用面向对象的概念读取配置参数值。比@Configuration更简洁
2、注意事项 yml参数与类属性必须按JAVA bean的规范
3、如何使用

*.yml参数
app:
  my:
    mobile: 123
    name: 大象
 
@ConfigurationProperties(prefix="app.my")
@Data
@Component
public class Myelephtant{
	private String mobile;
	private String name;
}

@ControllerAdvice(basePackages = “包路径”)

1、说明 控制层拦截通知标注。定义一组控制层拦截规则,以及异常通知格式。说白了就是处理异常的通用方式
2、注意事项 不要在@Aspect标注的AOP处理类around,before等方法里catch异常,否则标注@ControllerAdvice的类无法捕获controller类抛出的异常。
3、如何使用

@Slf4j
@ControllerAdvice(basePackages = "com.my")
@RestController
public class ExceptionAdviceHandler {
    @ExceptionHandler(Exception.class)
    public Result<Void> BaseExceptionHandler(Exception e) {
        log.error("未捕获异常:",e);
        return Result.failure(ResultCode.ERROR,null,e.getMessage());
    }
}

@ConditionalOnProperty(value = “”,havingValue = “”,matchIfMissing=true)

1、说明 控制配置类是否生效,可以将配置与代码进行分离,实现了更好的控制配置.
@ConditionalOnProperty实现是通过havingValue与配置文件中的值对比,返回为true则配置类生效,反之失效.
2、注意事项
3、如何使用
参考文章开发测试两不误,spring-cloud redis配置,动态切换redis集群单机环境的使用

@ConditionalOnBean

1、说明 当项目中存在某个类时才会使标有该注解的类或方法生效。标识在@Configuration类上,项目中存在@ConditionalOnBean中配置的类该Configuration类才会生效。@ConditionalOnBean标识在@Bean方法上,有只有存在@ConditionalOnBean中配置的类方法才会生效。
2、注意事项 注意自动配置类的先后顺序,可以通过@AutoConfigureBefore、@AutoConfigureAfter @AutoConfigureOrder控制先后顺序
3、如何使用

@Configuration
@ConditionalOnBean(value = {Product.class})
public class ProductConfig {    
  public ProductConfig (){        
	System.out.println("constructor ProductConfig ");    
  }
}

@ConditionalOnMissingBean

1、说明 与@ConditionalOnBean相反
2、注意事项
3、如何使用

@ConditionalOnClass

1、说明 当项目中存在某个类时才会使标有该注解的类或方法生效。标识在@Configuration类上,项目中存在@ConditionalOnClass中配置的类该Configuration类才会生效。@ConditionalOnClass标识在@Bean方法上,有只有存在@ConditionalOnClass中配置的类方法才会生效。
2、注意事项
3、如何使用

@ConditionalOnMissingClass

1、说明 与@ConditionalOnClass相反,当项目中不存在某个类时才会使标有该注解的类或方法生效。
2、注意事项
3、如何使用

@EnableDiscoveryClient

1、说明 开启注册中心发现组件。或者可以理解向注册中心注册服务,以便后继可以使用@FeignClient。开户注册服务时同时向spring框架指明扫描的包路径@EnableFeignClients(basePackages = “com.xx”)
2、注意事项
3、如何使用

@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.xx.xx.xx")
public class MyApplication {
}

@EnableGlobalMethodSecurity(prePostEnabled = true)

1、说明 开启spring方法级安全,既可以在类上联合@Configuration,也可以注解在启动类上。这个注解为我们提供了prePostEnabled 、securedEnabled 和 jsr250Enabled 三种不同的机制来实现同一种功能。参数prePostEnabled = true 会解锁 @PreAuthorize 和 @PostAuthorize 两个注解。即你需在设置prePostEnabled = true后,才可以在任意类的方法上使用@PreAuthorize,@PostAuthorize,使用范例如下。其它开放的方法级安全注解还有@PreFilter,@PostFilter,@Secured以后详说。
2、注意事项
3、如何使用

//开启安全验证
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableFeignClients(basePackages = "cn.xx")
public class MyApplication {
}

@Service
public class UserServiceImpl implements IUserService {
    //必须有管理员角色才能更新
	@PreAuthorize("hasRole('ROLE_ADMIN ')")
    public Result<User> update(User user){
    	......
    }
    //有管理员角色和经理角色
    @PreAuthorize("hasRole('ADMIN') AND hasRole('MANAGER')")
    public Result<ResultCode> delete(int id){
     ...
    }
}

@EnableFeignClients(basePackages = {“”,“”,“”})

1、说明 扫描指定包路径下所有有@FeignClient注解的类,将调用的请求发送给另外的微服务处理,是微服务的一种方式,不同于doubbo的一种云计算方式。
2、注意事项 注解在启动类上
3、如何使用

@EnableFeignClients(basePackages = "cn.xx")
public class MyApplication {
}

@EnableAsync

1、说明 开启异步处理功能,配合@Async使用。开启异步处理功能后@Async注解在类的方法上,表明该方法采用异常处理。
2、注意事项 注解在启动类上。注解@Async的方法真的是异步处理吗
3、如何使用

@Service
public class TestAsyncService {
     /**异步处理*/
    @Async
    public void test(){
    }

@EnableCaching

1、说明 开启缓存使用。后继配合@Cacheable在方法上使用,将返回结果存入缓存中
2、注意事项 注解在启动类上。一个提问:@Cacheable是将结果缓存在spring框架内存上还是缓存在redis上,如果是要缓存在spring框架的内存上如果处理?如果是缓存在redis上又要如何处理?@Cacheable的使用参数上面的说明。
3、如何使用

@EnableCaching
public class MyApplication {
}

@EnableTransactionManagement

1、说明 开启数据库事务管理。
2、注意事项 注解在启动类上。开启数据库事务管理后,在service层如果程序员try-catch了异常,那要重新抛出@Transactional指定的异常,否则事务不回滚,同时数据库要支持事务的引擎
3、如何使用

@EnableTransactionManagement
public class MyApplication {
}
//
@Service
public class UserServiceImpl implements IUserService {
	@Transactional(rollbackOn=SystemException.class)
	public Result<String> edit(User user) throws SystemException{
		try{
		   ......
		} catch(Exception ex){
			throw new SystemException(ex.getMessage());
		}
	}
}

@EnableJpaAuditing

1、说明 开启spring jpa的实体类审计功能,这个功能跟实体类属性被注解为@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy标签有关。如果实体类字段没有被以上四个标签注解则无效。
1、实体类上添加 @EntityListeners(AuditingEntityListener.class)
2、在相应字段加 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy
3、启动类上添加 @EnableJpaAuditing
4、实现AuditorAware类,这个可选,如果这项没有则spring框架只会对@CreatedDate,@LastModifiedDate赋值。
2、注意事项 注解在启动类上
3、如何使用

@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AbstractAuditingEntity implements Serializable {
    @CreatedBy
    @Column(name = "created_by", nullable = false, length = 50, updatable = false)
    private String createdBy;

    @CreatedDate
    @Column(name = "created_date", nullable = false)
    private Date createdDate;

    @LastModifiedBy
    @Column(name = "last_modified_by", length = 50)
    private String lastModifiedBy;

    @LastModifiedDate
    @Column(name = "last_modified_date")
    private Date lastModifiedDate;
}

@Configuration
@Slf4j
public class DBAuditor implements AuditorAware<String> {

    /**
     * 获得当前登录用户,用用户名设置lastModifiedBy,createdBy,设置的操作由spring来做
     * @return
     */
    @Override
    public Optional<String> getCurrentAuditor() {
        UserDetails user;
        try {
            user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            return Optional.ofNullable(user.getUsername());
        }catch (Exception e){
            return Optional.empty();
        }
    }
}

@EnableJpaAuditing
public class MyApplication {
}

@EnableAspectJAutoProxy

1、说明 开启切面注解,如果不开启切面注解是不生效,也就是@Aspect不生效,但springboot已帮开发者完成。如下图*.yml按@ConditionalOnProperty的参数配置即可
在这里插入图片描述

2、注意事项 注解启动类后。@Aspect就可以添加在自己写的切面类上。
3、如何使用 按@Aspect使用

@EnableConfigurationProperties

1、说明 开启配置参数转化为bean对象与@ConfigurationProperties配合使用。@EnableConfigurationProperties({Myelephtant.class}) 注解使ConfigurationProperties注解生效。请查看@ConfigurationProperties的使用。然后Myelephtant就可以 @Autowrited形式用在别的类上
2、注意事项 注解在启动类上
3、如何使用

@EnableDiscoveryClient
@EnableConfigurationProperties({Myelephtant.class}) 
public class MyApplication {
}

@EnableAutoConfiguration

1、说明 自动装配配置类,@ConfigurationProperties配合使用。自动实例化系统参数。也就是说利用EnableAutoConfiguration,使用者可以在项目启动时自动实例化一些参数或类,类似于nacos-client.jar下的自动装配
2、注意事项 注解在启动类上
3、如何使用

@EnableJpaRepositories(basePackages = {“”}, repositoryFactoryBeanClass =)

1、说明 开启自定义的JPA配置参数,覆盖spring的缺省JPA配置。basePackages 指定实体类的包路径,可以是数组。repositoryFactoryBeanClass指定实体类相应的Dao工厂类,这个工厂类可以是程序员自己实现的。
2、注意事项 注解在启动类上。注意自己写的JpaConfiguration类不要脱离spring框架下的数据库线程池管理机制,否则会引起数据库8小时超时异常,即不需要自己管理DataResource。
3、如何使用 添加在启动类上

@EnableResourceServer

1、说明 开启资源提供服务的配置。会根据登录token实施资源授权鉴别,被放入antMatchers的http请求将不会实施鉴别。
2、注意事项 Spring Boot 从 2.3 升级到 2.4 的时候提示会被丢弃。Spring-security-Oauth2要求迁移到spring-security框架中,从而实施更为精细化的鉴权业务。新的spring-security使用此处不宜展开,使用细节太多,将使用验证后择机发文。
3、如何使用

@Configuration
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
                .and()
                .authorizeRequests()
                .antMatchers(IGNORE_URIS).permitAll()
                .anyRequest().authenticated()
                //跨域配置
                .and().cors().configurationSource(request -> {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedOrigin(request.getHeader("Origin"));
            corsConfiguration.addAllowedMethod("*");
            corsConfiguration.setAllowCredentials(true);
            corsConfiguration.setMaxAge(3600L);
            return corsConfiguration;
        });
    }
}

@EnableScheduling

1、说明 开启定时任务功能。开启后即可在具体类方法上添加 @Scheduled(cron = "0 */1 * * * * ") 来实现方法的定时执行
2、注意事项 在springboot启动类上加@EnableScheduling。或在config类上加@Component @Configurable @EnableScheduling
3、如何使用

@Component
@Configurable
@EnableScheduling
public class ScheduledTasks {
    //每分钟执行一次
    @Scheduled(cron = "0 */1 *  * * * ") 
    public void reportCurrentTime(){
        System.out.println ("我的任务");
    }
}

@EnableWebSecurity

1、说明 开启SpringSecurity组件功能。需要导入SpringSecurity相关包。SpringSecurity组件的使用细节不在这里述说。看官可以在CSDN其他文章学习
2、注意事项 注解在启动类上
3、如何使用 暂无

@JsonFormat

1、说明 JSON映射对象时,用于格式化入参。例如日期,可与fastjson的JSONField一起使用
2、注意事项 给出pattern规则。如果是日期属性,在中国地区应该加上timezone=“GMT+8”。
3、如何使用 下例是以RFC3339标准的日期入参

//{"create_at": "2020-12-01T00:00:00+08:00"}
@JSONField(alternateNames= {"create_at"})
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX",timezone="GMT+8")
    private Date createAt;

@ExceptionHandler(IllegalArgumentException.class)

1、说明
2、注意事项 注解在启动类上
3、如何使用

@FeignClient(name = “app-name”,path = “/abc”)

@Nullable

1、说明
用在参数、返回值和字段,说明该参数,返回值、字段可以为空。可以与@NonNullApi或@NonNullalFields关联使用
2、注意事项
3、如何使用

@Nullable
private EntityManagerFactory entityManagerFactory;
public static <K, V> void mergePropertiesIntoMap(@Nullable Properties props, Map<K, V> map) {
		if (props != null) {
			for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) {
				String key = (String) en.nextElement();
				Object value = props.get(key);
				if (value == null) {
					// Allow for defaults fallback or potentially overridden accessor...
					value = props.getProperty(key);
				}
				map.put((K) key, (V) value);
			}
		}
	}
public static Object[] toObjectArray(@Nullable Object source) {
		if (source instanceof Object[]) {
			return (Object[]) source;
		}
		if (source == null) {
			return EMPTY_OBJECT_ARRAY;
		}
		....
}

从代码上看,“可以为空”这个语义的意思是在方法体内,如果参数不为空程序员需处理参数。参数如果为空,不作任何处理

实体注释

@Id
@GenericGenerator(name=“snowFlakeIdGenerator”, strategy=“cn.suitong.core.data.support.SnowFlakeIdGenerator”)
@GeneratedValue(generator=“snowFlakeIdGenerator”)
@JsonSerialize(using = ToStringSerializer.class)
@Column(name = “id”,columnDefinition = “bigint(20) COMMENT ‘商户ID’”)

@NotNull(message=“水费单价不能为空,格式:##.##”)
@Size(min=1, max=5)
@DecimalMin(value=“0”,message=“必须是大于0的数”)
@Column(name = “water_unit_price”)
@Convert(converter = ColumnRMBYuanToFenConverter.class)
@Transient

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值