1.依赖注入:
IOC的作用:降低程序之间的耦合(依赖关系)
概念:依赖关系的管理交给spring维护,在当前类需要用到其他类的对象,由spring为我们提供,只需在配置文件中说明关系的维护;
2.问题
平时使用spring 框架的时候,我们知道从前端传递参数,后端可以用@RequestBody,来创建并将参数注入到对象当中,突然某一时刻,前端不传递参数,但是我们想拿一个对象使用,比如 用户的登录信息。前端只传递了一个token,我们想通过在控制类写一个类似于 User 的对象,他就能自动返回当前操作的用户是谁,那该怎么做呢?
3.解决
这里需要实现一个类:
HandlerMethodArgumentResolver 处理函数参数的分解器,用来处理用户信息
@Component public class UserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired IRedisService redisService; @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.getParameterType().equals(ZfUser.class); } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { String token = nativeWebRequest.getParameter("token"); if(StringUtils.isNotEmpty(token)){ return redisService.queryUserByToken(token); } return null; } }
将解析器添加到解析链路中:
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Autowired UserInfoMethodArgumentResolver userInfoMethodArgumentResolver; @Override public void addInterceptors(InterceptorRegistry registry) { } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(userInfoMethodArgumentResolver); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }