我正在研究一种实验方法,该方法将使用bean名称,属性名称和值表达式,并使用Spring SPeL为该bean的属性分配该值。使用此方法的类是ManagedResource,因此我可以从JMX到达它。
然后我定义了另一个简单的类,为其提供了一个属性和一个Component批注。我还将这个类自动连接到jmx bean类中,只是为了验证该类型的bean是否存在。
然后我启动了SpringBoot服务。
然后我从VisualVM调用了该方法。
失败,因为它找不到具有该名称的bean。
现在,更多细节。
这是第一堂课:
@Component
public class SomeRandomThing {
private String id;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
}
这是另一个类:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'SomeRandomThing' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:685)
当我从VisualVM调用方法时,我传递了“ SomeRandomThing”,“ id”和“ xxx”。
此操作失败,并显示以下信息:
def material_code(self):
tableType = self.comboBox.currentText()
tableGrade = self.comboBox_2.currentText()
tableType = tableType.lower()
c.execute('SELECT prefix FROM ' + tableType + ' WHERE grade = ' + tableGrade)
prefix_code = c.fetchone()
print(prefix_code[0])
conn.commit()
我还在方法中设置了一个断点,并查看了“ this”,并确认存在有效的“ thing”属性(如果没有,则该服务将不会启动)。
那么我的默认bean名称算法错误吗?似乎很难相信,因为我还对“ JMXDemonstration”,“ name”和“ George”进行了测试,并且效果很好。
更新:
还请注意,调用“ applicationContext.getBean(SomeRandomThing.class)”将返回该类的bean实例,并且还调用“ applicationContext.getBeanDefinitionNames()”将返回不包含“ SomeRandomThing”的数组,但它确实包含“ JMXDemonstration”。
为什么SomeRandomThing可以通过自动装配和通过类型而不是通过其bean名称作为bean使用?
更新:
哦,因为bean名称是“ someRandomThing”,而不是“ SomeRandomThing”。我想本来应该是前者,但是当我看到“ JMXDemonstration”的bean名称是“ JMXDemonstration”时,我以为是“ SomeRandomThing”,而不是“ someRandomThing”。
答案 0 :(得分:1)
Bean命名
@Component是类级别的注释。在组件扫描期间,Spring Framework自动检测带有@Component注释的类。
@Component
class CarUtility {
// ...
}
默认情况下,此类的Bean实例名称与具有小写首字母的类名称相同。最重要的是,我们可以使用this的可选value参数指定其他名称。注释。
基于注释的配置
对于基于构造型注释的Bean,如果未使用构造型注释的value字段显式指定名称,则该名称再次由
AnnotationBeanNameGenerator
生成,该com.xyz.FooServiceImpl -> fooServiceImpl
是BeanNameGenerator策略接口docs的实现。
如果注释的值不表示bean名称,则将基于类的短名称(首字母小写)构建适当的名称。例如:
FruitController
通过在类路径中扫描组件,Spring会按照前面描述的规则为未命名的组件生成Bean名称:本质上,采用简单的类名称并将其初始字符转换为小写。 但是,在(不寻常的)特殊情况下,如果有多个字符且第一个和第二个字符均为大写字母,则会保留原始大小写。这些规则与 here java.beans.Introspector.decapitalize(Spring在此使用)定义的规则相同。