前言
我们一说到spring,可能第一个想到的是 IOC
(控制反转) 和 AOP
(面向切面编程)。
没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。
除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强
。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。
今天跟大家一起聊聊,在Spring中最常用的11个扩展点。
1.自定义拦截器
spring mvc拦截器根spring拦截器相比,它里面能够获取HttpServletRequest
和HttpServletResponse
等web对象实例。
spring mvc拦截器的顶层接口是:HandlerInterceptor
,包含三个方法:
-
preHandle 目标方法执行前执行
-
postHandle 目标方法执行后执行
-
afterCompletion 请求完成时执行
为了方便我们一般情况会用HandlerInterceptor
接口的实现类HandlerInterceptorAdapter
类。
假如有权限认证、日志、统计的场景,可以使用该拦截器。
第一步,继承HandlerInterceptorAdapter
类定义拦截器:
public class AuthInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestUrl = request.getRequestURI();
if (checkAuth(requestUrl)) {
return true;
}
return false;
}
private boolean checkAuth(String requestUrl) {
System.out.println("===权限校验===");
return true;
}
}
第二步,将该拦截器注册到spring容器:
@Configuration
public class WebAuthConfig extends WebMvcConfigurerAdapter {
@Bean
public AuthInterceptor getAuthInterceptor() {
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor());
}
}
第三步,在请求接口时spring mvc通过该拦截器,能够自动拦截该接口,并且校验权限。
2.获取Spring容器对象
在我们日常开发中,经常需要从Spring容器中获取Bean,但你知道如何获取Spring容器对象吗?
2.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.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
接口,然后重