Spring接口注入示例

到目前为止,没有人能够在Spring Framework中提供正确的接口注入示例。 Martin Fowler的文章不是为了凡人,其他一切只是以非常令人困惑的方式定位。 我已经浏览过三篇文章,其中人们要么告诉“Spring不直接支持界面注入”(“因为我不确切地知道我将如何描述setter和构造函数注入”)或者“我会在我的讨论中讨论它”其他线程“或者下面会有一些评论说这是错误的例子。 我不要求解释,例如BEG。

注入有三种类型:构造函数,Setter和接口。 Spring不直接支持最新版本(正如我观察人们所说)。 那怎么做呢?

谢谢,

根据DI的Variants在spring

DI存在两个主要变体,基于构造函数的dependency injection和基于Setter的dependency injection。

另请参阅Spring中未实现的接口注入明确说明它。

所以DI只有两种变体。 因此,如果文档没有说明接口注入,那么很明显它不存在。 那些认为通过在接口中提供setter方法来完成接口注入的人回答我:

  1. 为什么spring ref doc还提到了接口注入?
  2. 为什么不能通过提供setter方法来接口注入被视为setter注入本身。 为什么在引入界面不影响任何东西时创建特殊术语,我的意思是它仍然以相同的方式配置。 如果它们不同,那么如何通过查看配置找到它。 不应该透明,在配置中并没有看到实际配置的类实现某些接口的impl?
  3. 就像Instantiation使用实例工厂方法和Instantiation使用静态工厂方法一样 ,一些bean属性应该澄清接口注入?

通过接口注入,接口显式定义了可以设置依赖关系的点:

interface InjectPerson { public void injectHere(Person p); } class Company implements InjectPerson { Person injectedPerson; public void injectHere(Person p) { this.injectedPerson = p; } } 

嗨,我尝试了一个非常简单的方法,可以澄清你的答案。

以下是我使用两个接口和两个bean类构建的代码。

名为Job的第一个接口。

 public interface Job { public void setmyJob(String myJob); public String getmyJob(); } 

和一个类实现此接口,名称为MyJob

 public class MyJob implements Job { public String myJob; public MyJob() { System.out.println("From MyJob default Constructor and the ID= "+this); } public void setmyJob(String myJob) { this.myJob=myJob; } public String getmyJob() { return myJob; } } 

在下一步中,我创建了另一个名称为Service的接口

 public interface Service { public void setJob(Job job); public Job getJob(); } 

然后再次实现此服务接口的另一个类。

 public class MyService implements Service { public Job job; public void setJob(Job job) { this.job=job; System.out.println("Hello from Myservice: Job ID="+job); } public Job getJob() { return job; } } 

然后我用main函数在main类上创建并编写如下代码:

 import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApplication { public static void main(String...a) { BeanFactory beanfactory=new ClassPathXmlApplicationContext("Beans.xml"); MyService myservice=(MyService)beanfactory.getBean("myservice"); System.out.println("Before print"); System.out.println(myservice.getJob().getmyJob()); } } 

在我的Beans.xml文件中,我提到了如下代码并且它有效。

           

我也参考了另一个在线教程,然后得到了这种解决方案。 如果您对此代码有任何问题,请告诉我。 它对我有用。

我想有人在这里回答了你的问题我也不知道接口注入是什么,直到我从“Pro Spring MVC with web flow book”中读到这句话。

“请注意,Spring Framework不支持基于接口的dependency injection。这意味着我们需要指定为特定接口注入哪个具体实现。”

有三种类型的依赖注射: –

 1. Constructor Injection(Eg Pico Container, Spring supports it). 2. Setter Injection(Eg Spring supports it). 3. Interface Injection(Eg Avalon, Spring does not support it). 

Spring仅支持基于构造函数和基于setter的注入。 看起来你在不同类型(3)和spring支持(其中2个)中感到困惑。

请查看下面的示例,了解其表面注射情况。

有一个形状界面和2个具体的类,其中的形状即方形和矩形。

界面

 package di.interfaceinjection; public interface Shape { public String shapeName(); public void displayName(); } 

2实施的课程

 package di.interfaceinjection; public class Square implements Shape { @Override public String shapeName() { return "Square"; } @Override public void displayName() { System.out.println("Square"); } } package di.interfaceinjection; public class Rectangle implements Shape{ @Override public String shapeName() { return "Rectangle"; } @Override public void displayName() { System.out.println("Rectangle"); } } 

现在,我们有一个设置形状的类。

 public class ShapeSetter { private Shape shape; public Shape getShape() { return shape; } public void setShape(Shape shape) { this.shape = shape; } } 

最后是配置

         

这里,

我们正在注入不同的形状。

 package di.interfaceinjection; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class InterfaceInjeection { /** * @param args */ public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext("intro.xml"); ShapeSetter shape = (ShapeSetter)appContext.getBean("shape2"); shape.getShape().displayName(); } } 

我认为,界面注入的混乱是由于误解了“界面注入”这个术语实际意味着什么。 根据我的理解,接口注入描述了bean竞争者向bean注入新接口的能力,无论该bean的类定义没有实现它。

这里给出的所有示例都显示了如何使用具体类创建bean,然后如何将其注入另一个bean。 事实上,在所有情况下,bean被注入到定义为接口的字段中并不重要 – 所有操作都是使用由具体实例创建的bean完成的。

我还可以提供另一个引人注目的例子:

 package creditCards; interface PaymentCard { Boolean isDebitAllowed(); }       

正如你在这里看到的,甚至可以用接口创建一个bean! 尽管如此,它不是一个接口注入,因为IoC contener通过它自己初始化这个bean的instanse。 换句话说, card bean是一个初始化对象,而不是一个接口,是什么使得这个问题的选定答案是正确的。