
P8架构师从业几年spring中最喜欢也是用的最多的几个技能
Spring可以做些什么了? 实现BeanFactoryAware接口、如何初始化bean?如何轻松自定义类型转换?spring mvc拦截器等等
以上的东西对于我的工作效率以及竞争力等方面 还是帮助很大的
也希望可以帮助到你们 记得点赞和评论
一 如何获取spring容器对象
1.实现BeanFactoryAware接口的方法
@Service
public class PersonService implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void add() {
Person person = (Person) beanFactory.getBean("person");
}
}
实现BeanFactoryAware接口,然后重写setBeanFactory方法,就能从该方法中获取到spring容器对象。
2.实现ApplicationContextAware接口
@Service
public class PersonService2 implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void add() {
Person person = (Person) applicationContext.getBean("person");
}
}
实现ApplicationContextAware接口,然后重写setApplicationContext方法,也能从该方法中获取到spring容器对象。
3.实现ApplicationListener接口
@Service
public class PersonService3 implements ApplicationListener<ContextRefreshedEvent> {
private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
applicationContext = event.getApplicationContext();
}
public void add() {
Person person = (Person) applicationContext.getBean("person");
}
}
实现ApplicationListener接口,需要注意的是该接口接收的泛型是ContextRefreshedEvent类,然后重写onApplicationEvent方法,也能从该方法中获取到spring容器对象。
此外,不得不提一下Aware接口,它其实是一个空接口,里面不包含任何方法。
它表示已感知的意思,通过这类接口可以获取指定对象,比如:
- 通过BeanFactoryAware获取BeanFactory
- 通过ApplicationContextAware获取ApplicationContext
- 通过BeanNameAware获取BeanName等
Aware接口是很常用的功能,目前包含如下功能:

二 如何初始化bean?
spring中支持3种初始化bean的方法:
- xml中指定init-method方法
- 使用@PostConstruct注解
- 实现InitializingBean接口
1.使用@PostConstruct注解
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("记录请求日志");
chain.doFilter(request, response);
System.out.println("记录响应日志");
}
@Override
public void destroy() {
}
}
在需要初始化的方法上增加@PostConstruct注解,这样就有初始化的能力。
2.实现InitializingBean接口
@ConditionalOnWebApplication
public class LogFilterWebConfig {
@Bean
public LogFilter timeFilter() {
return new LogFilter();
}
}
实现InitializingBean接口,重写afterPropertiesSet方法,该方法中可以完成初始化功能。
这里顺便抛出一个有趣的问题:init-method、PostConstruct 和 InitializingBean 的执行顺序是什么样的?
决定他们调用顺序的关键代码在AbstractAutowireCapableBeanFactory类的initializeBean方法中。

这段代码中会先调用BeanPostProcessor的postProcessBeforeInitialization方法,而PostConstruct是通过InitDestroyAnnotationBeanPostProcessor实现的,它就是一个BeanPostProcessor,所以PostConstruct先执行。
而invokeInitMethods方法中的代码:

本文分享了一位阿里P8架构师借助Spring的10大功能提升到P9的经验,包括获取Spring容器对象、初始化bean、自定义Scope、类型转换、FactoryBean的应用、Spring MVC拦截器、RestTemplate拦截器、统一异常处理、异步处理和缓存使用。这些技巧对于提高工作效率和竞争力有很大帮助。
最低0.47元/天 解锁文章

315

被折叠的 条评论
为什么被折叠?



