2016-10-25 4 views
2

Я утверждал, что:Является ли @Autowired аннотация, обработанная BeanPostProcessor весной?

  1. Spring определения чтения боба из Java конфигурации
  2. BeanFactory Создать бобы из defenitions
  3. Тогда зависимости впрыскивают по BeanPostProcessors

Но случилось так, что это не точно:

@Configuration 
@ImportResource("classpath:spring_config.xml") 
public class JavaConfig { 

    @Autowired 
    MyBean bean; 

    @Bean 
    public Boolean isBeanAutowired(){ 
     return bean != null; 
    } 
} 

Bean был инициализирован true.

Вопрос:

Как это происходит, что Autowired логика работы перед всеми бобами в контексте были инициализированы?

+0

«Поля вводятся сразу после построения компонента, прежде чем будут задействованы любые методы конфигурации». [http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html](http://docs.spring.io/spring- рамки/документы/2.5.x/API/орг/springframework/бобы/завод/аннотаций/Autowired.html) – Alessandro

ответ

-1

Это не простой BeanPostProcessor. Если вы пытаетесь осуществить это просто, как это:

public class MyAutowiredBeanPostProcessor implements BeanPostProcessor { 

     @Autowired 
     ApplicationContext context; 

     @Override 
     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
      Class<?> beanClass = bean.getClass(); 
      Field[] declaredFields = beanClass.getDeclaredFields(); 
      for (Field field : declaredFields) { 
       MyAutowired annotation = field.getAnnotation(MyAutowired.class); 
       if (annotation != null){ 
        Class<?> type = field.getType(); 
        Object beanForInjection = context.getBean(type); 
        field.setAccessible(true); 
        ReflectionUtils.setField(field, bean, beanForInjection); 
       } 
      } 
      return bean; 
     } 

Вы увидите, что это прекрасно «провод» бобы внутри других бобов, но «провода» ничего в Java Configuration классе. Кроме того, если вы отслеживать порядок, в котором бобы приходят к БППАМ просто Println beanName в postProcessBeforeInitialization методе вы увидите:

Bean came to bpp: org.springframework.context.event.internalEventListenerProcessor 
Bean came to bpp: org.springframework.context.event.internalEventListenerFactory 
Bean came to bpp: javaConfig 
Initialized isBeanAutowired, and myBean is: null 
Bean came to bpp: isBeanAutowired 
Bean came to bpp: myBean 

анализ зависимостей боба (другие бобы, которые должны быть проводными) и определить порядок, в котором будут инициализированы компоненты.

Так что же AutowiredAnnotationBeanPostProcessor звучит как небольшое нарушение первоначальной философии BPP. Это не отдельная ответственность.

3

Да @Autowired обрабатывается BeanPostProcessor. См. org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor для получения дополнительной информации и в качестве точки входа, если вы попытаетесь узнать об этом подробнее.

https://github.com/spring-projects/spring-framework/blob/master/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html

В конце концов Spring способен анализировать зависимости боба (другие бобы, которые должны быть подключены) и определяет порядок, в котором будут инициализированы бобы. Таким образом, это возможно, для автоподготовки непосредственно после создания компонента. Существует одно исключение, которое возникает, когда Spring пытается разрешить круговые зависимости. Затем Spring создаст обе бобовые и передаст их друг другу друг другу. Однако это работает только ограниченно.

Смежные вопросы