Java 在控制器中注入没有默认构造函数的bean
我们可以将没有默认构造函数的服务bean注入控制器吗 我有以下控制器Java 在控制器中注入没有默认构造函数的bean,java,spring,Java,Spring,我们可以将没有默认构造函数的服务bean注入控制器吗 我有以下控制器 @Controller public class ArticleController { @Autowired private WithConstructorService withConstructorService; ... } 我的服务是: @Service public class WithConstructorServiceImpl implements WithConstructorSer
@Controller
public class ArticleController {
@Autowired
private WithConstructorService withConstructorService;
...
}
我的服务是:
@Service
public class WithConstructorServiceImpl implements WithConstructorService {
String name;
String address;
public WithConstructorServiceImpl(String name, String address) {
super();
this.name = name;
this.address = address;
}
}
我得到了一个例外
SEVERE: Servlet /springheat threw load() exception
java.lang.NoSuchMethodException: WithConstructorServiceImpl.<init>()
严重:Servlet/springheat抛出load()异常
java.lang.NoSuchMethodException:WithConstructorServiceImpl.()
更新:
我在这里做一个猜测,但是我们能做一些AOP魔术并且仍然使用带注释的构造函数arg服务方法吗?不,你不能。因为当注入bean时,它使用默认构造函数创建bean本身,并且只有在注入了它的所有属性之后
您可以做的只是为name和address创建setter,然后将其添加到注入的bean中。如果您使用spring 3,您可以使用
@Value
注释连接name和address字段,然后不需要通过构造函数设置它们。或者,不要使用@Service
注释,而是使用适当的
标记在xml中声明bean
无论哪种方式,spring容器都需要知道从何处获取name和address的值,否则它无法使用ConstructorServiceImpl构造您的值。您可以这样做,但因为spring必须实例化bean,所以您必须告诉他哪些值要传递给构造函数 第一种可能性:自动关联两个参数:
@Autowired
public WithConstructorServiceImpl(@Qualifier("theNameBean") String name,
@Qualifier("theAdressBean") String address) {
在本例中,您必须在context.xml文件中声明两个字符串类型的bean,并使用适当的名称
第二种可能性:在context.xml文件中声明bean本身,并告诉Spring它必须传递给构造函数的参数
请看从技术上讲,如果没有默认构造函数,它就不是java“bean”。我是从spring bean的角度提到它的。我在这里做一个猜测,但我们能做一些AOP魔术,并且仍然使用带注释的构造函数arg服务方法吗?。。。用相同的查询更新了问题。为了完整起见,您可以分享如何声明“context.xml中字符串类型的两个bean”吗?