Spring框架中常用注解分析

@PostConstruct

  1. @PostConstruct该注解被用来修饰一个非静态的void()方法。

  2. 当bean创建完成的时候,会后置执行@PostConstruct修饰的方法,只会在初始化的时候执行一次。

  3. PostConstruct在构造函数之后执行,init()方法之前执行。

// 以下两种注入方法,任选一种使用即可
/*************************注入方法一,使用构造器注入*************************************************************/
       private final EmailConfigProperties emailConfigProperties;
	public EmailConfiguration(EmailConfigProperties emailConfigProperties){
		this.emailConfigProperties = emailConfigProperties;
	}
/*************************注入方法二,使用@Autowired*************************************************************/
	@Autowired
	private EmailConfigProperties emailConfigProperties;

@RefreshScope

  1. 需要动态刷新的类标注@RefreshScope 注解(比如在nacos想改运行中的配置的时候,这个时候就可以用这个注解,改完之后不用重启项目就可以使用
  2. @RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象
  3. 如属性发生变更会调用 ContextRefresher refresh() -》RefreshScope refreshAll() 进行缓存清理方法调用,并发送刷新事件通知 -》 GenericScope 真正的 清理方法destroy() 实现清理缓存
  4. 在下一次使用对象的时候,会调用GenericScope get(String name, ObjectFactory<?> objectFactory) 方法创建一个新的对象,并存入缓存中,此时新对象因为Spring 的装配机制就是新的属性了。

@EventListener

  1. @Async配合@EventListener 可以实现异步事件处理的机制,为了使工作能够得到异步执行,通常还需在Spring项目的上下文中使用注释@EnableAsync。

@Conditional

@Conditional : 条件装配,满足指定条件则进行组件注入

@ConditionalOnXxx : 当容器中有这个才进行组件注入

@ConditionalOnMissingXXX:当容器中没有这个组件则进行组件注入

@SneakyThrows

该注解是lombok下的,相当于是加上该注解就等于抛出异常

  1. java的异常体系中Exception异常有两个分支,一个是运行时异常RuntimeException,一个是编译时异常。在Exception下的所有非RuntimeException异常,比如IOExceptionSQLException等;

  2. 所有的运行时异常不捕获,编译时异常是一定要捕获,否则编译会报错。@SneakyThrows就是利用了这一机制,将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息。

  3. 原理:

    /**
    *   如果不使用@SneakyThrows注解,point.proceed() 会抛出Throwable异常,加上此注解之后就可以不用在代码中捕获异常
     */
    @SneakyThrows
    @Around("@annotation(inside)")
    public Object around(ProceedingJoinPoint point, Inside inside) {
        
    	String header = request.getHeader(SecurityConstants.FROM);
        
            // 如果@inside(value=false),则跳过权限认证,直接执行目标方法
    	if (inside.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) {
    		log.warn("访问接口 {} 没有权限", point.getSignature().getName());
    		throw new AccessDeniedException("访问被拒绝,没有权限");
    	}
    	return point.proceed();
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值