public class ContextArgResolver implements WebArgumentResolver {
private static final String MY_APPLICATION_CONTEXT = "MYAPPLICATIONCONTEXT";
@Override
public Object resolveArgument(MethodParameter methodParameter,NativeWebRequest webRequest) throws Exception {
if (methodParameter.getParameterType() == MyApplicationContext.class) {
return webRequest.getAttribute(MY_APPLICATION_CONTEXT, RequestAttributes.SCOPE_SESSION);
}
return UNRESOLVED;
}
}
配置文件的相关配置如下:
<bean>
<property>
<list>
<ref bean="jacksonConverter"/>
</list>
</property>
<property>
<list>
<ref bean="contextArgResolver"/>
</list>
</property>
</bean>
<bean></bean>
<bean>
<property>
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
优点:
1. 具备第二种方案的所有优点
2. 真正做到了按需分配,只在真正需要对象的位置注入具体的对象,减少其他地方对该对象的依赖。
3. 其他人能很容易地从方法的参数列表得知方法所需要的依赖,API 更清晰易懂。
4. 对于很多方法需要的某一类参数,可以在唯一的设置点用很方便一致的方式进行注入。
不足:
1. 对象依赖注入是针对所有方法的,注入粒度还是较粗。不能做到具体方法访问具体的自定义上下文属性;
以上三种方法,在前后端统一的时候是好用的,但是如果遇到前后端分离的时候,就会变得很痛苦!