【发布时间】:2011-07-01 14:03:03
【问题描述】:
我正在使用 Spring,这是一个控制器:
@Controller
public class PersonController {
@Resource(name="PersonService")
private PersonService personService;
@RequestMapping(value = "/Person", method = RequestMethod.GET)
public String getPersons(Model model) {
// Retrieve all persons by delegating the call to PersonService
List<Person> persons = personService.getAll();
// Attach persons to the Model
model.addAttribute("persons", persons);
//then return to view jsp
}
这是一项服务:
@Service("personService")
@Transactional
public class PersonService {
public List<Person> getAll() {
//do whatever
}
}
但是,要正确使用 DI,我应该更改控制器以使用接口 (?),如下所示:
@Controller
public class PersonController {
@Resource(name="personService")
private IPersonService personService; //Now an interface
}
例如,这将允许我使用两项服务,一项是测试服务,一项是实时服务。我可以通过添加/删除服务上的注释来改变:
@Service("personService") // this line would be added/removed
@Transactional
public class LivePersonService implements IPersonService {
public List<Person> getAll() {
//do whatever
}
}
和
@Service("personService") //this line would be added/removed
@Transactional
public class TestPersonService implements IPersonService {
public List<Person> getAll() {
//do something else
}
}
但是,由于必须重新编译代码这一事实而失去了主要好处之一?而如果我使用 xml 查找,我可以即时更改依赖关系?
【问题讨论】:
-
我不会将其列为 DI 的一项重要优势 - 我认为这也许是一个不错的选择,但仅此而已。
-
这将是相当主观的 - 有些人喜欢外部 XML 配置,有些人喜欢相对简洁的注释。没有人是“正确的”。
-
@skaffman,还有哪些重要的好处?
-
@NimChimpsky:DI 是的主要好处,即从外部注入依赖项,而不是代码去获取它。
-
@skaffman,好的,那么 DI 对日常编码还有哪些其他实际好处。我可以看到根据您的配置(实时、测试、客户)查找不同服务的好处。还有什么?
标签: java unit-testing spring dependency-injection