没有人到目前为止是能够在Spring框架提供接口注入的工作正确的例子。 Martin Fowler的文章不是凡人,一切只是定位在一个非常混乱的方式的话。 我已经冲浪三十多篇,其中人要么说“春犯规直接支持接口注入”(“因为我不知道究竟怎么会只描述setter和构造注射”)或不是“我将在讨论我的其他线程”或任一会有下面说,这是错误的榜样几点意见。 我不要求解释,我乞求例子。
有三种类型的注入:构造函数,setter和接口。 Spring不支持最新的直接(如我所观察到的人说)。 那么它是如何做到准确?
谢谢,
根据春季DI的变种
DI主要有两种变型,基于构造函数的依赖注射和基于setter方法的依赖注入。
另请参阅接口注入是不是在春天实施明确规定它。
因此,有只有两个DI的变体。 因此,如果文件没有提到接口注入,其明确表示,它不存在。 这些谁相信,接口注入是通过接口提供的setter方法回答我做的:
- 为什么春天REF DOC左接口注入的提?
- 为什么水湿通过提供不被视为setter注入本身setter方法接口注入。 为什么要为特殊用语时引入接口不会影响任何东西,我的意思是它仍然以相同方式配置。 如果他们是不同的,那么怎样才能通过一个看到的配置中找到它。 它不应该是透明的,在配置和没有看到实际配置的类IMPL实现了一些接口?
- 就像使用实例工厂方法实例化与使用静态工厂方法实例 ,有些bean的属性应该澄清接口注入?
与接口注入接口明确定义了一个依赖可设置点:
interface InjectPerson {
public void injectHere(Person p);
}
class Company implements InjectPerson {
Person injectedPerson;
public void injectHere(Person p) {
this.injectedPerson = p;
}
}
您好我试图用一个非常简单的方法可阐明你的答案。
以下是我已经建立了使用两个接口和两个bean类的代码。
第一界面名的作业。
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;
}
}
在接下来的步骤i创建的另一个接口,具有名称服务
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;
}
}
然后我上与主功能的主类创建并写入代码,如下所示:
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文件我提到的代码如下所示,它的工作。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="myjob" class="MyJob">
<property name="myJob" value="My First String"/>
</bean>
<bean id="myservice" class="MyService">
<property name="job" ref="myjob"/>
</bean>
</beans>
我也下文称到另一个在线教程,然后得到了这种解决方案。 请让我知道,如果你有这个代码的任何问题。 这是为我工作。
有3种类型的依赖注射: -
1. Constructor Injection(E.g Pico Container, Spring supports it).
2. Setter Injection(E.g Spring supports it).
3. Interface Injection(E.g Avalon, Spring does not support it).
Spring支持唯一的构造和setter基于注射。 看起来就像你在不同类型(3),什么Spring支持(其中2)混淆。
我觉得有人回答您的问题在这里我也根本不知道接口注入是什么,直到我读从这句话中“临春MVC与网络流量的书”
“需要注意的是基于接口的依赖注入不是由Spring框架的支持。这意味着我们需要指定在某一个接口注入其具体实施。”
请检查iterface注入下面的例子。
有一种形状接口和2 imiplements形状即正方形和长方形的具体类。
接口
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;
}
}
最后配置
<bean id="shape1" class="di.interfaceinjection.ShapeSetter">
<property name="shape" ref="square"></property>
</bean>
<bean id="shape2" class="di.interfaceinjection.ShapeSetter">
<property name="shape" ref="rectangle"></property>
</bean>
<bean id="square" class="di.interfaceinjection.Square"></bean>
<bean id="rectangle" class="di.interfaceinjection.Rectangle"></bean>
这里,
我们注入不同的形状。
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();
}
}
我认为,各地接口注入的混乱是由missunderstanding什么术语“界面注入”实际上是指造成的。 在我的理解,接口注入描述一个bean contener的注入新的接口的bean的能力,无论这个bean的类定义没有实现它。
本文讨论的例子说明如何将出具体类的创建一个bean,然后如何将其注入到另一个bean。 事实上,在所有情况下豆类注入定义为接口不就事论事所有操作的领域与创造出来的具体实例的豆完成。
我还可以提供另一种吸引人的例子:
package creditCards;
interface PaymentCard {
Boolean isDebitAllowed();
}
<bean id="card" class="creditCards.PaymentCard">
<lookup-method name="isDebitAllowed" bean="boolValue"/>
</bean>
<bean id="boolValue" class="java.lang.Boolean">
<constructor-arg type="boolean" value="true"/>
</bean>
正如你在这里看到的,它甚至有可能出接口创建一个bean! 不过,它不是一个接口注入,为国际奥委会contener初始化instanse这个bean通过它自己的。 换句话说, card
bean是一个初始化的对象,而不是一个接口,是什么让,对于这个问题的答案选择是正确的。