使用Interceptor注入依赖项

时间:2017-12-16 20:05:55

标签: spring spring-mvc

使用Interceptor类型注入所需的依赖项在技术上是否是一种良好且可接受的做法。例如:

public @interface Inject {
    public Class thisType();
}

public class InjectionInterceptor implements HandlerInterceptor {

    @Override
    public bool preHandle(HttpServletRequest hsr, HttpServletResponse hsr1, Object o) {
        HandlerMethod handlerMethod = (HandlerMethod) o;
        Class type = handlerMethod.getBeanType();
        Annotation[] annotations =  type.getAnnotationsByType(Inject.class);
        for(Annotation annotation: annotations){
            Inject inject = (inject) annotation;
            for(Field field :type.getDeclaredFields()){
                if(field.getType().equals(inject.thisType())){
                    field.setAccessible(true);
                    field.set(handlerMethod.getBean(), Services.find(inject.thisType()));
                }
            }
            ....
      return true;
   }
   ...
}

1 个答案:

答案 0 :(得分:1)

一个bean可以有4个范围。

  1. 单件 将只管理bean的一个共享实例,并且对具有与该bean定义匹配的id或id的bean的所有请求将导致Spring容器返回一个特定的bean实例。

    这是bean的默认范围。

  2. 原型 当请求具有指定标识的bean时,容器返回新实例。

    例如:如果你的弹簧容器中有一个id为“employee”的bean,那么每次你做一个

    Employee emp = context.getBean("employee");

    将返回一个新实例。

  3. 请求,会话和全局会话仅用于基于Web的应用程序

    1. 请求 为每个HTTP请求创建一个新实例。 例如:每次登录都需要不同的实例。

    2. 会话 将使用bean定义在单个HTTP会话的生命周期内为bean创建一个新实例。

    3. 全球 全局会话范围类似于标准HTTP会话范围,实际上仅在基于portlet的Web应用程序的上下文中有意义

    4. 您可以通过两种方式指定bean的范围

      1. 使用XML:
      2. <bean id="employee" class="com.company.Employee" scope="singleton"/>

        1. 使用注释。

          使用@Scope("prototype")

        2. 标记班级

          您可以阅读有关范围here

          的更多信息

          可供参考的示例代码here