Spring DI可以从Autofac等代码中推断出依赖性,而无需注释吗?

时间:2014-01-01 17:37:26

标签: spring ioc-container autofac

Autofac是.net的Inversion of Control容器。它具有吸引力(对我而言)的特点:

  

当Autofac实例化组件时,它满足组件的要求   通过查找和实例化其他组件来实现依赖关系。

     

组件将其与Autofac的依赖关系表达为构造函数   参数:

public class TaskController : IController 
{
    public TaskController(ITaskRepository tasks) { ... }
}
     

在这种情况下,Autofac将寻找另一个提供该组件的组件   ITaskRepository服务并调用TaskController的构造函数   将该组件作为参数。

(来源:http://code.google.com/p/autofac/

对于给定接口的单个​​实现的最简单情况,这可以很好地工作 - 不需要任何关于依赖项的元数据(属性/ XML / config类)。

Java的“Spring DI”容器是否支持相同的功能?

1 个答案:

答案 0 :(得分:1)

  

我正在寻找DI容器从中推断出这些信息   字节码而不是我必须用XML提供它。

我不相信Spring有这样的功能。如果你可以像这样注释你的构造函数

@Autowired
public TaskController(ITaskRepository tasks) { ... }

并且只有一个bean在上下文中实现ITaskRepository,然后Spring可以解决它,但是你需要注释。


如果我误解了你的问题,请纠正我。

如果您无法控制类添加注释,则仍可以使用<bean> <constructor-arg>元素在调用构造函数时引用并使用另一个bean。

<bean id="taskRepository" class="com.some.TaskRepositoryImpl" />

<bean id="taskController" class="com.some.TaskController">
    <constructor-arg ref="taskRepository" />
</bean>

或者,使用Java配置

@Bean
public ITaskRepository taskRepository() {
    return new TaskRepositoryImpl();
}

@Bean
public TaskController taskController() {
    return new TaskController(taskRepository());
}