老师,springboot是怎么把@Bean注解的自定义Filter自动包装成为FilterRegistrationBean对象的

来源:3-13 监听 Spring Boot 事件

烟台果农

2018-10-18

写回答

1回答

小马哥

2018-10-18

可参考实现类:org.springframework.boot.web.servlet.ServletContextInitializerBeans


获取 Bean 对象:

private <T, B extends T> void addAsRegistrationBean(ListableBeanFactory beanFactory,
      Class<T> type, Class<B> beanType, RegistrationBeanAdapter<T> adapter) {
   List<Map.Entry<String, B>> beans = getOrderedBeansOfType(beanFactory, beanType,
         this.seen);
   for (Entry<String, B> bean : beans) {
      if (this.seen.add(bean.getValue())) {
         int order = getOrder(bean.getValue());
         String beanName = bean.getKey();
         // One that we haven't already seen
         RegistrationBean registration = adapter.createRegistrationBean(beanName,
               bean.getValue(), beans.size());
         registration.setOrder(order);
         this.initializers.add(type, registration);
         if (ServletContextInitializerBeans.logger.isDebugEnabled()) {
            ServletContextInitializerBeans.logger.debug(
                  "Created " + type.getSimpleName() + " initializer for bean '"
                        + beanName + "'; order=" + order + ", resource="
                        + getResourceDescription(beanName, beanFactory));
         }
      }
   }
}


private static class FilterRegistrationBeanAdapter
      implements RegistrationBeanAdapter<Filter> {

   @Override
   public RegistrationBean createRegistrationBean(String name, Filter source,
         int totalNumberOfSourceBeans) {
      FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(source);
      bean.setName(name);
      return bean;
   }

}


0
0

Spring Boot2.0深度实践 核心原理拆解+源码分析

系统化剖析Spring Boot 2.0,掌握技术原理,学习源码阅读技巧

2904 学习 · 213 问题

查看课程