- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一种实验方法,该方法将采用 bean 名称、属性名称和值表达式,并使用 Spring SPeL 为该 bean 的该属性分配该值。具有此方法的类是 ManagedResource,因此我可以从 JMX 访问它。
然后我定义了另一个简单的类,给它一个属性和一个组件注释。我还将此类 Autowiring 到 jmx bean 类中,只是为了验证该类型的 bean 是否存在。
然后我启动了 SpringBoot 服务。
然后我从 VisualVM 调用该方法。
它失败了,说它找不到具有该名称的 bean。
那么,现在提供更多详细信息。
这是第一个类:
@Component
@ManagedResource
public class JMXDemonstration {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private SomeRandomThing thing;
@Value("${jmxDemonstration.name}")
private String name;
@ManagedAttribute
public String getName() { return name; }
@ManagedAttribute
public void setName(String name) { this.name = name; }
@ManagedOperation
public String buildHelloWorldMessage() {
return "Hello, " + name + ": " + thing.getId();
}
@ManagedOperation
public void assignValueToBeanProperty(String beanName, String propertyName, String expression) {
Object bean = applicationContext.getBean(beanName);
ExpressionParser parser = new SpelExpressionParser();
SimpleEvaluationContext evalContext = SimpleEvaluationContext.forReadWriteDataBinding().build();
parser.parseExpression(propertyName).setValue(evalContext, bean, expression);
}
}
这是另一个类:
@Component
public class SomeRandomThing {
private String id;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
}
当我从 VisualVM 调用该方法时,我传递“SomeRandomThing”、“id”和“xxx”。
此操作失败:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'SomeRandomThing' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:685)
我还在该方法中设置了一个断点并查看了“this”,并确认存在有效的“thing”属性(如果没有,服务将不会启动)。
那么我的默认 bean 名称算法是否错误?这似乎令人难以置信,因为我还对“JMXDemonstration”、“name”和“George”进行了测试,效果非常好。
更新:
另请注意,调用“applicationContext.getBean(SomeRandomThing.class)”返回该类的 bean 实例,并且调用“applicationContext.getBeanDefinitionNames()”返回一个不包含“SomeRandomThing”的数组,但它包含“JMX演示”。
为什么 SomeRandomThing 可以通过 Autowiring 和类型作为 Bean 使用,而不是通过它的 Bean 名称?
更新:
哦,因为 bean 名称是“someRandomThing”,而不是“SomeRandomThing”。我想我最初会期望前者,但是当我看到“JMXDemonstration”的 bean 名称是“JMXDemonstration”时,我认为它会是“SomeRandomThing”,而不是“someRandomThing”。
最佳答案
Bean 命名
@Component is a class level annotation. During the component scan, Spring Framework automatically detects classes annotated with @Component.
@Component
class CarUtility {
// ...
}
By default, the bean instances of this class have the same name as the class name with a lowercase initial. On top of that, we can specify a different name using the optional value argument of this annotation.
基于注释的配置
For stereotype annotation based bean, if the name is not explicitly specified with the value field of stereotype annotations, then the name is again generated by
AnnotationBeanNameGenerator
which is an implementation of the BeanNameGenerator strategy interface here
如果注释的值不指示 Bean 名称,则会根据类的短名称(首字母小写)构建适当的名称。例如:
com.xyz.FooServiceImpl -> fooServiceImpl
With component scanning in the classpath, Spring generates bean names for unnamed components, following the rules described earlier: essentially, taking the simple class name and turning its initial character to lower-case. However, in the (unusual) special case when there is more than one character and both the first and second characters are upper case, the original casing gets preserved. These are the same rules as defined by doc java.beans.Introspector.decapitalize (which Spring uses here).
关于java - 当 applicationContext.getBean(beanName) 明显存在时,为什么它返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408164/
使用 @Qualifier("beanName") 和 @Component("beanName") 有什么区别吗?如果没有,是否有首选方法? 最佳答案 通常,您在组件上使用 @Component("
使用 @Qualifier("beanName") 和 @Component("beanName") 有什么区别吗?如果没有,是否有首选方法? 最佳答案 通常,您在组件上使用 @Component("
有人知道使用@Resource和getBean获取bean的过程有何不同吗?现在我遇到的情况是这样的: @Autowired ApplicationContext applicationContext
我相当确信存在一些类或 jar 问题,但我不清楚它是什么。 beanName 错误不会在任何类型的搜索中提供非常有用的数据。当我收到错误时,我正在尝试在 Tomcat 8 上启动它。我在 hibern
嗨@All :) 我这里有一个奇怪的问题。我想用 @EJB(beanName="user") 在类中注入(inject) UserBean 托管实体。如果我不使用 beanName 属性,我会收到以下
在我的简单 Spring Batch 应用程序中,出现错误 'beanName' 不能为空。我不知道,spring 配置中缺少什么。 spring-beans.xml
问题 有一个Processor处理基于其 typesToProcess 的类: import org.springframework.stereotype.Component; @Component
问题是我需要使 beanName 可为空。因为 spring 的某些部分传递了 null 而不是有效的 bean 名称(例如 Quartz)。 Java 上的相同实现可以正常工作。 我尝试添加 Jet
这可能吗?我想这样做: @EJB(beanName = "MyStratImpl") public DateTimeReadImpl(MyStrategy myStrategy) { this.s
class 标签的 beanName 属性和 jsp:useBean 属性有什么区别。 最佳答案 只需阅读 the documentation (page 35) 。这是相关性的摘录: class=
我正在研究一种实验方法,该方法将采用 bean 名称、属性名称和值表达式,并使用 Spring SPeL 为该 bean 的该属性分配该值。具有此方法的类是 ManagedResource,因此我可以
name 和有什么区别, beanName和 mappedName注释属性 @EJB在 EJB3.0 中? 我在以下链接在网上找到了这个 - http://www.tutorialspoint.com
我在很多情况下都见过 .handle("someBean", "someMethod") EIP 方法,在集成流程中发挥着巨大的作用。我可以理解它只是以前的 XML 配置中的一个服务激活器,但我需要一
我是 Spring MVC 的初学者,我不明白为什么我总是收到同样的错误: java.lang.IllegalStateException: Neither BindingResult nor pla
我是一名优秀的程序员,十分优秀!