依赖注入java
下面是依赖项注入的一个有效示例依赖注入java,java,dependency-injection,Java,Dependency Injection,下面是依赖项注入的一个有效示例 public class Employee { private String name; private String company; public Employee(String name, String company){ this.name = name; this.company = company; } public String getName(){ retu
public class Employee {
private String name;
private String company;
public Employee(String name, String company){
this.name = name;
this.company = company;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getCompany(){
return company;
}
public void setCompany(String company){
this.company = company;
}
}
应用程序
类依赖于员工
public class Application {
private static Employee emp;
private static String name;
private static String company;
public Application(Employee emp){
this.emp = emp;
}
public static String getApplication(){
name = emp.getName();
company = emp.getCompany();
return "Name: " + name + "\nCompany: " + company;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
System.out.println(app1.getApplication());
}
}
您正在此处成功注入依赖项:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
由于应用程序的实例
需要员工的实例
,因此在其构造函数上声明必须提供一个实例。这是一个颠倒依赖关系的教科书示例。(或者,简化为“需要,不要实例化”)
但是,如何存储这种依赖关系有点值得怀疑:
private static Employee emp;
在提供的示例中,这可能不会导致任何问题。但是,当您需要创建另一个需要另一个Employee
依赖项实例的应用程序
实例时,会发生什么情况?第二个实例将覆盖第一个实例并打破其依赖关系
如果实例需要依赖项,则实例应存储依赖项:
private Employee emp;
(甚至可以将其设置为final
,除非您有理由在实例生命周期内更改它。)
诚然,名称
应用程序的语义意味着只有一个实例。但在这种情况下,单例实例可能比static
成员更好。作为面向对象编程的一般经验法则,在使用static
成员时一定要谨慎。它们有自己的用途,但也很容易被误用。您在这里成功地注入了依赖关系:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
由于应用程序的实例
需要员工的实例
,因此在其构造函数上声明必须提供一个实例。这是一个颠倒依赖关系的教科书示例。(或者,简化为“需要,不要实例化”)
但是,如何存储这种依赖关系有点值得怀疑:
private static Employee emp;
在提供的示例中,这可能不会导致任何问题。但是,当您需要创建另一个需要另一个Employee
依赖项实例的应用程序
实例时,会发生什么情况?第二个实例将覆盖第一个实例并打破其依赖关系
如果实例需要依赖项,则实例应存储依赖项:
private Employee emp;
(甚至可以将其设置为final
,除非您有理由在实例生命周期内更改它。)
诚然,名称应用程序的语义意味着只有一个实例。但在这种情况下,单例实例可能比static
成员更好。作为面向对象编程的一般经验法则,在使用static
成员时一定要谨慎。它们有自己的用途,但也很容易被误用。这是DI的一个例子。你可以在这里做:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
public Application(Employee emp){
this.emp = emp;
}
您可以在这里实现它:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
public Application(Employee emp){
this.emp = emp;
}
这种DI称为构造函数注入。
如果您的应用程序类中有一个雇员的setter,并且您使用该setter设置了雇员,那么它将被称为setter injection,这是DI的一个示例。你可以在这里做:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
public Application(Employee emp){
this.emp = emp;
}
您可以在这里实现它:
Employee emp1 = new Employee("John", "ABC");
Application app1 = new Application(emp1);
public Application(Employee emp){
this.emp = emp;
}
这种DI称为构造函数注入。
如果您的应用程序类中有一个employee setter,并且您使用该setter设置了employee,那么它将被称为setter injection首先您可能想了解何时使用依赖项注入。
注入一个没有功能的简单类的实例对我来说毫无意义
您通常为同样具有行为的类使用接口,它不仅仅是数据的包装器。删除static,可能添加final,并在注入中为该接口发送一个实现实例
像这样:
public class TextEditor {
/*Interface SpellChecker**/
private final SpellChecker spellChecker;
private String text;
/**An implementation for the SpellChecker is provided*/
public TextEditor(final SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public Boolean spellCheck(){
return this.spellChecker.isSpellingCorrectForText(this.text);
}
}
正如您在上面的示例中所看到的,拼写检查职责被委托给一个外部依赖项,该依赖项被注入构造函数中。TextEditor不需要知道如何进行拼写检查,只需使用方法调用接口即可
我们为什么要这样做?要尊重实体(SRP):
详情如下:
首先,您可能想了解何时使用依赖项注入。
注入一个没有功能的简单类的实例对我来说毫无意义
您通常为同样具有行为的类使用接口,它不仅仅是数据的包装器。删除static,可能添加final,并在注入中为该接口发送一个实现实例
像这样:
public class TextEditor {
/*Interface SpellChecker**/
private final SpellChecker spellChecker;
private String text;
/**An implementation for the SpellChecker is provided*/
public TextEditor(final SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
public Boolean spellCheck(){
return this.spellChecker.isSpellingCorrectForText(this.text);
}
}
正如您在上面的示例中所看到的,拼写检查职责被委托给一个外部依赖项,该依赖项被注入构造函数中。TextEditor不需要知道如何进行拼写检查,只需使用方法调用接口即可
我们为什么要这样做?要尊重实体(SRP):
详情如下:
私人静态员工emp代码>。。。静止的不,不是。除了在main
方法上,您不需要static
。private static emp代码>。。。静止的不,不是。除了在main
方法上,您不需要static
。