我们可以将没有默认构造函数的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服务方法吗?
答案 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必须将哪些参数传递给构造函数。
答案 2 :(得分:0)
你可以做的只是创建名称和地址的setter,然后将它添加到注入的bean。