Java 在控制器中注入没有默认构造函数的bean

Java 在控制器中注入没有默认构造函数的bean,java,spring,Java,Spring,我们可以将没有默认构造函数的服务bean注入控制器吗 我有以下控制器 @Controller public class ArticleController { @Autowired private WithConstructorService withConstructorService; ... } 我的服务是: @Service public class WithConstructorServiceImpl implements WithConstructorSer

我们可以将没有默认构造函数的服务bean注入控制器吗

我有以下控制器

@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”吗?