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

时间:2011-10-04 16:46:02

标签: java spring

我们可以将没有默认构造函数的Service 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>()

更新

我在这里猜测但是我们可以做一些AOP魔法并仍然使用带注释的构造函数arg服务方法吗?

3 个答案:

答案 0 :(得分:2)

如果您使用的是spring 3,则可以使用@Value注释来连接名称和地址字段,然后不需要通过构造函数设置它们。或者,不要使用@Service注释,而是使用适当的<constructor-arg>标记在xml中声明您的bean。

无论哪种方式,spring容器都需要知道在哪里获取name和address的值,或者它不能构造WithConstructorServiceImpl。

答案 1 :(得分:2)

你可以这样做,但是由于Spring必须实例化bean,你必须告诉他将哪些值传递给构造函数。

第一种可能性:自动装配两个参数:

@Autowired
public WithConstructorServiceImpl(@Qualifier("theNameBean") String name, 
                                  @Qualifier("theAdressBean") String address) {

在这种情况下,您必须在context.xml文件中声明两个类型为String的bean,并使用适当的名称。

第二种可能性:在context.xml文件中声明bean本身并告诉Spring必须将哪些参数传递给构造函数。

请参阅http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-collaborators

答案 2 :(得分:0)

不,你不能。因为当注入bean时,它会使用默认构造函数创建bean本身,并且只有在注入了它的所有属性之后。

你可以做的只是创建名称和地址的setter,然后将它添加到注入的bean。