什么是解释一个很好的方式依赖注入 ?
我发现在谷歌几个教程,但没有人会假定读者是一个Java初学者。 你会如何解释这是新手?
什么是解释一个很好的方式依赖注入 ?
我发现在谷歌几个教程,但没有人会假定读者是一个Java初学者。 你会如何解释这是新手?
我给你依赖注入五岁。
当你去拿东西从冰箱里拿出你自己的,你可能会导致问题。 你可能会敞开大门,你可能会得到一些东西的妈妈或爸爸不希望你有。 你甚至可能寻找的东西,我们甚至没有或已过期。
你应该做的是指出有必要,“我需要的东西午餐喝,”然后我们将确保你有什么事情,当你坐下来吃饭。
那这个呢?
如果你有一个一流的Employee
和该员工有一个Address
,你可以让Employee
定义类,如下所示:
class Employee {
private Address address;
// constructor
public Employee( Address newAddress ) {
this.address = newAddress;
}
public Address getAddress() {
return this.address;
}
public void setAddress( Address newAddress ) {
this.address = newAddress;
}
}
一切都看起来不错迄今。
这段代码显示了HAS-A的员工和他的地址之间的关系,这很好。
现在,这已经-A的关系创造了他们之间的依赖关系。 这个问题是在构造函数中。
每次你想创建一个Employee
,你需要一个实例Address
的实例:
Address someAddress = ....
Employee oscar = new Employee( someAddress );
尤其是当您要执行单元测试这种方式工作变得困难。
当你需要测试一个特定的对象,主要问题就来了,你需要创建其他对象的实例,并最有可能你需要再创建其他对象的实例来做到这一点。 链可能会变得难以管理。
为了避免这种情况,你可以改变这样的构造:
public Employee(){
}
使用无参数的构造函数。
然后,当你永远想你可以设置地址:
Address someAddress = ....
Employee oscar = new Employee();
oscar.setAddress( someAddress );
现在,这可能是一个累赘,如果你有几个属性,或者如果对象是努力创造。
然而,想想这一点,让我们说,你添加Department
属性:
class Employee {
private Address address;
private Department department;
....
如果你有300名员工,他们都需要具有相同的部门,加上同一部门必须有一些其他对象之间共享(如部门的公司名单,或者角色的每个部门都等),然后你会也很难与知名度Department
对象,并通过对象的所有网络分享。
什么是依赖注入是所有关于它来帮助你,那么,在你的代码“注入”这些依赖关系。 大部分的框架允许你通过一个外部文件中指定要做到这一点,有什么目的在于注入。
假设一个虚构的依赖注入属性文件:
#mock employee
employee.address = MockAddress.class
employee.department = MockDepartment.class
#production setup
employee.address = RealAddress.class
employee.department = RealDepartment.class
你会怎样定义为给定的情况下注入。
什么是依赖注入框架将做的是设置正确的对象为你,所以你不必代码setAddress
或setDepartment
。 这要么通过反射或通过代码生成或其他技术来完成。
所以,下一次你需要测试的Employee
类,你可以注入模拟Address
和Departments
对象,而无需编写所有的设置/获取您的所有测试。 更妙的是,你可以注入真正的 Address
和Department
在生产代码的对象,而且还有你的代码工作作为测试的信心。
这是相当多了。
不过我不认为这解释适用于5岁老当你提出要求。
我希望你还是觉得它有用。
当写一个类,它是自然为它使用的其他对象。 你可能有一个数据库连接,例如,或者你使用一些其他的服务。 这些其他对象(或服务)的依赖。 写代码最简单的方法就是创建和使用的其他对象。 但是,这意味着你的对象必须依赖那些僵硬的关系:不管为什么要调用你的对象,它使用相同的依赖关系。
一个更强大的技术是能够创建你的对象,并为其提供依赖使用。 所以,你可以创建一个数据库连接使用,然后将它交给你的对象。 通过这种方式,你可以创建在不同时间的不同依赖你的对象,使你的对象更加灵活。 这是依赖注入,在那里你“注入”的依赖关系为对象。
BTW:在使用Flickr照片来说明概念的现代表现风格,这可以用一个吸毒者自己拍摄了药物说明。 哦,等等,这是注射的依赖...... OK,对不起,拙劣的玩笑。
我不知道任何简单的教程,但我可以给你一个几乎25 250字或多或少版本:
依赖注入的对象不配置其自身的组成部分是基于它已经知道,而对象是由更高层次的逻辑配置的东西,然后调用它没有内置的预知组件。 我们的想法是使一个组件的对象的更多和更小的应用,在较高的水平重定位配置任务。 这使得对象更可能是在未来或具有不同配置是有用的。
这对测试更好,最好当谈到时间来修改申请。 典型的实现放入XML配置和使用一个框架,以动态加载的类。
当你得到赋予了新的任天堂,你可以使用按钮和触摸屏玩游戏。
但在任天堂的工厂,他们需要知道如何把一个在一起。
当聪明的人在工厂带来了任天堂的DS,这将是不同的里面,但你还是会知道如何使用它。