2012-03-15 5 views
2

На работе для конкретного случая мы используем:Почему нельзя использовать простые типы проводов?

context.getAutowireCapableBeanFactory().autowireBeanProperties(
    serializer, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false 
); 

Сегодня я должен был autowire значения на моем сериализаторе бобе, который предоставляется в FactoryBean.

Моя первая попытка состояла только в том, чтобы использовать простой id фабрики, но это не сработало.

После того, что я пытался много решений я читал здесь, используя @Resource, @Autowired, @Qualifier и т.д ...

Наконец после просмотра, как инъекция фасоли работала, я обнаружил, что весна никогда не впрыскивать «простые свойства»

/** 
* Return an array of non-simple bean properties that are unsatisfied. 
* These are probably unsatisfied references to other beans in the 
* factory. Does not include simple properties like primitives or Strings. 
* @param mbd the merged bean definition the bean was created with 
* @param bw the BeanWrapper the bean was created with 
* @return an array of bean property names 
* @see org.springframework.beans.BeanUtils#isSimpleProperty 
*/ 
protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) { 
    Set<String> result = new TreeSet<String>(); 
    PropertyValues pvs = mbd.getPropertyValues(); 
    PropertyDescriptor[] pds = bw.getPropertyDescriptors(); 
    for (PropertyDescriptor pd : pds) { 
     if (pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) && 
       !BeanUtils.isSimpleProperty(pd.getPropertyType())) { 
      result.add(pd.getName()); 
     } 
    } 
    return StringUtils.toStringArray(result); 
} 

Я также нашел в весенней документации:

Пожалуйста, обратите внимание, что это не возможно в настоящее время т o autowire так называемые простые свойства, такие как примитивы, строки и классы (и массивы таких простых свойств). (Это по-дизайн и должно рассматриваться как функция.)

Наконец я знаю, почему мой завод боб не может привнести в моей собственности: фасоль впрыснуть является Enum, который является «простым свойством» (в соответствии с кодом)

Мне просто интересно, почему, по дизайну, запрещено автопроверить простые свойства, особенно в случае простого свойства, введенного FactoryBean.

Кроме того, я вижу, как может возникнуть проблема с автопостановкой строки по типу, но автоустановка по имени, в чем дело?

ответ

0

Ну, рассмотрим случай, когда в контексте есть несколько «бобов» того же (примитивного) типа. Как могла весна выяснить, какой из них нужно вводить?

Это, в основном, та же самая ситуация. Весна имеет с autowiring что-нибудь, но гораздо вероятнее, что в весеннем контексте есть несколько экземпляров String или Integer, тогда есть экземпляры com.yourcorp.SomeClass. Фактически, если вы перечисляете компоненты в вашем весеннем контексте, вы увидите, что в нем почти всегда есть несколько экземпляров String.

Я предполагаю, что разработчики Spring решили, что в этой функции было больше проблем, чем пользы, так как это почти всегда не сработает.

+0

Проверьте последнюю строку моего вопроса. Autowiring по имени должен иметь возможность работать, поскольку проводка xml для простых типов, по имени, работает ... –

2

Вы должны быть в состоянии добиться того, что вам нужно с springEL:

class MyClass { 
    @Value("#{factoryBeanName}") 
    private int myValue; 
    ... 
} 

на самом деле я не 100% уверен, что это будет работать точно так, как указано выше, но вы получите идею, вы можете попробовать #{myBean.someMethod()} вместо этого.

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