Java 为什么可以';t弹簧autowire简单类型?

Java 为什么可以';t弹簧autowire简单类型?,java,spring,dependency-injection,autowired,Java,Spring,Dependency Injection,Autowired,在我们使用的具体案例中: context.getAutowireCapableBeanFactory().autowireBeanProperties( serializer, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false ); 今天,我必须在序列化程序bean上自动连接一个值,该值由FactoryBean提供 我的第一次尝试只是使用简单的factorybean id,但没有成功 之后,我尝试了许多我在这里读到的解决方案,使用@Re

在我们使用的具体案例中:

context.getAutowireCapableBeanFactory().autowireBeanProperties(
   serializer, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false
);
今天,我必须在序列化程序bean上自动连接一个值,该值由
FactoryBean
提供

我的第一次尝试只是使用简单的factorybean id,但没有成功

之后,我尝试了许多我在这里读到的解决方案,使用
@Resource
@Autowired
@Qualifier
等等

最后,在查看bean注入是如何工作的之后,我发现Spring从不注入“简单属性”

/**
*返回不满意的非简单bean属性数组。
*这些很可能是对中其他bean的不满意引用
*工厂。不包括基本体或字符串等简单属性。
*@param mbd创建bean时使用的合并bean定义
*@param bw创建bean时使用的BeanRapper
*@return一个bean属性名数组
*@see org.springframework.beans.BeanUtils#isSimpleProperty
*/
受保护字符串[]未满足不简单属性(AbstractBeanDefinition mbd,BeanRapper bw){
设置结果=新树集();
PropertyValues pvs=mbd.getPropertyValues();
PropertyDescriptor[]pds=bw.getPropertyDescriptors();
对于(PropertyDescriptor pd:pds){
if(pd.getWriteMethod()!=null&&!isExcludedFromDependencyCheck(pd)&&&!pvs.contains(pd.getName())&&
!BeanUtils.isSimpleProperty(pd.getPropertyType()){
add(pd.getName());
}
}
返回StringUtils.toStringArray(结果);
}
我还在Spring文档中发现:

还请注意,目前无法自动连线 所谓的简单属性,如原语、字符串和类 (以及这些简单属性的数组)。(这是设计的,应该 这将被视为一项功能。)

最后,我知道了为什么我的工厂bean不能注入我的属性:要注入的bean是一个枚举,它是一个“简单属性”(根据代码)

我只是想知道为什么在设计上禁止自动关联简单属性,特别是在由
FactoryBean
注入的简单属性的情况下


此外,我也看到了按类型自动生成字符串可能是个问题,但是通过名称自动调用它,有什么关系?

< P>,考虑上下文中有相同(原始)类型的多个“bean”的情况。Spring怎么可能知道应该注射哪一种呢

这与Spring自动连接任何东西的情况基本相同,但在Spring上下文中更有可能有多个String或Integer实例,然后是com.yourcorp.SomeClass实例。事实上,如果您在spring上下文中枚举bean,您将看到其中几乎总是有多个String实例


我猜Spring开发人员只是认为该功能的麻烦大于好处,因为它几乎总是不起作用。

您应该能够通过springEL实现您所需要的:

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

事实上,我不是100%确定这会像上面那样工作,但是你明白了,你可以试试
{myBean.someMethod()}

检查我问题的最后一行。按名称自动连接应该能够工作,因为按名称对简单类型进行xml连接可以工作。。。
class MyClass {
  @Value("#{factoryBeanName}")
  private int myValue;
  ...
}