@PostConstruct
-
@PostConstruct该注解被用来修饰一个非静态的void()方法。
-
当bean创建完成的时候,会后置执行@PostConstruct修饰的方法,只会在初始化的时候执行一次。
-
PostConstruct在
构造函数之后
执行,init()方法之前执行。
// 以下两种注入方法,任选一种使用即可
/*************************注入方法一,使用构造器注入*************************************************************/
private final EmailConfigProperties emailConfigProperties;
public EmailConfiguration(EmailConfigProperties emailConfigProperties){
this.emailConfigProperties = emailConfigProperties;
}
/*************************注入方法二,使用@Autowired*************************************************************/
@Autowired
private EmailConfigProperties emailConfigProperties;
@RefreshScope
- 需要动态刷新的类标注@RefreshScope 注解(
比如在nacos想改运行中的配置的时候,这个时候就可以用这个注解,改完之后不用重启项目就可以使用
) - @RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象
- 如属性发生变更会调用 ContextRefresher refresh() -》RefreshScope refreshAll() 进行缓存清理方法调用,并发送刷新事件通知 -》 GenericScope 真正的 清理方法destroy() 实现清理缓存
- 在下一次使用对象的时候,会调用GenericScope get(String name, ObjectFactory<?> objectFactory) 方法创建一个新的对象,并存入缓存中,此时新对象因为Spring 的装配机制就是新的属性了。
@EventListener
- @Async配合@EventListener 可以实现异步事件处理的机制,为了使工作能够得到异步执行,通常还需在Spring项目的上下文中使用注释@EnableAsync。
@Conditional
@Conditional : 条件装配,满足指定条件则进行组件注入
@ConditionalOnXxx : 当容器中有这个才进行组件注入
@ConditionalOnMissingXXX:当容器中没有这个组件则进行组件注入
@SneakyThrows
该注解是lombok下的,相当于是加上该注解就等于抛出异常
-
在
java
的异常体系中Exception
异常有两个分支,一个是运行时异常RuntimeException
,一个是编译时异常。在Exception
下的所有非RuntimeException
异常,比如IOException
、SQLException
等; -
所有的运行时异常不捕获,编译时异常是一定要捕获,否则编译会报错。
@SneakyThrows
就是利用了这一机制,将当前方法抛出的异常,包装成RuntimeException
,骗过编译器,使得调用点可以不用显示处理异常信息。 -
原理:
/** * 如果不使用@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(); }