Kau*_*ele 9 spring annotations default-constructor constructor-injection
我创建了2个简单的类.一个类的构造函数注释为@Autowired.它接受另一个类的对象.但是这段代码失败了.
类: - 1)SimpleBean.java
@Configuration
public class SimpleBean {
InnerBean prop1;
public InnerBean getProp1() {
return prop1;
}
public void setProp1( InnerBean prop1) {
System.out.println("inside setProp1 input inner's property is "
+ prop1.getSimpleProp1());
this.prop1 = prop1;
}
@Autowired(required=true)
public SimpleBean(InnerBean prop1) {
super();
System.out.println("inside SimpleBean constructor inner's property is "
+ prop1.getSimpleProp1());
this.prop1 = prop1;
}
}
Run Code Online (Sandbox Code Playgroud)
2)Inner.java
@Configuration
public class InnerBean {
String simpleProp1;
public String getSimpleProp1() {
return simpleProp1;
}
public void setSimpleProp1(String simpleProp1) {
this.simpleProp1 = simpleProp1;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试加载ApplicationConext时
ApplicationContext acnxt = new AnnotationConfigApplicationContext("com.domain");
Run Code Online (Sandbox Code Playgroud)
它给出以下错误: -
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'simpleBean' defined in file [C:\Users\owner\Documents\Java Project\MyWorkSpace\springMVCSecond\WebContent\WEB-INF\classes\com\domain\SimpleBean.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.domain.SimpleBean$$EnhancerByCGLIB$$4bc418be]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.domain.SimpleBean$$EnhancerByCGLIB$$4bc418be.<init>()
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:75)
at com.test.SpringAnnotationTest.main(SpringAnnotationTest.java:12)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.domain.SimpleBean$$EnhancerByCGLIB$$4bc418be]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.domain.SimpleBean$$EnhancerByCGLIB$$4bc418be.<init>()
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:70)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)
... 12 more
Caused by: java.lang.NoSuchMethodException: com.domain.SimpleBean$$EnhancerByCGLIB$$4bc418be.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65)
... 13 more
Run Code Online (Sandbox Code Playgroud)
如果我在SimpleBean类中引入no-arg构造函数.它不会给出错误.但是这并没有给我一些SimpleBean的预先对象(就像在使用<constructor-arg>的XML配置中那样).所以在使用注释时,是否必须使用no-arg构造函数?适当的出路是什么?
art*_*tol 20
来自javadoc @Configuration:
Configuration is meta-annotated as a {@link Component}, therefore Configuration
classes are candidates for component-scanning and may also take advantage of
{@link Autowired} at the field and method but not at the constructor level.
Run Code Online (Sandbox Code Playgroud)
不幸的是,你必须找到其他方法来做到这一点.
我相信你正在混淆@Configuration和@Component注释.根据spring docs,@Configuration用于使用Java代码创建bean(任何使用@Beancreate a bean 注释的方法,而注释的类@Component是自动创建的..
我希望以下内容说明了这一点:
InnerBean.java:
// this bean will be created by Config
public class InnerBean {
String simpleProp1;
public String getSimpleProp1() {
return simpleProp1;
}
public void setSimpleProp1(String simpleProp1) {
this.simpleProp1 = simpleProp1;
}
}
Run Code Online (Sandbox Code Playgroud)
SimpleBean.java:
// This bean will be created because of the @Component annotation,
// using the constructor with the inner bean autowired in
@Component
public class SimpleBean {
InnerBean prop1;
public InnerBean getProp1() {
return prop1;
}
@Autowired(required = true)
public SimpleBean(InnerBean prop1) {
this.prop1 = prop1;
}
}
Run Code Online (Sandbox Code Playgroud)
OuterBean.java
// this bean will be created by Config and have the SimpleBean autowired.
public class OuterBean {
SimpleBean simpleBean;
@Autowired
public void setSimpleBean(SimpleBean simpleBean) {
this.simpleBean = simpleBean;
}
public SimpleBean getSimpleBean() {
return simpleBean;
}
}
Run Code Online (Sandbox Code Playgroud)
Config.java
// this class will create other beans
@Configuration
public class Config {
@Bean
public OuterBean outerBean() {
return new OuterBean();
}
@Bean
public InnerBean innerBean() {
InnerBean innerBean = new InnerBean();
innerBean.setSimpleProp1("test123");
return innerBean;
}
}
Run Code Online (Sandbox Code Playgroud)
Main.java:
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.acme");
OuterBean outerBean = ctx.getBean("outerBean", OuterBean.class);
System.out.println(outerBean.getSimpleBean().getProp1().getSimpleProp1());
}
}
Run Code Online (Sandbox Code Playgroud)
主类使用AnnotationConfigApplicationContext扫描两者@Configuration和@Component注释并相应地创建bean.
| 归档时间: |
|
| 查看次数: |
24682 次 |
| 最近记录: |