2014-12-21 6 views
1

У меня есть три класса 1) Интерфейс 2) класс, который реализует интерфейс 3) статический завод, который возвратит второй класс экземпляра как экземпляр интерфейса классаКак создать боб как экземпляр интерфейса класса

public Interface MyInterface { 
} 

public class Myclass implements MyInterface { 
} 

public Class MyStaticFactory { 

    public static MyInterface getInstance() { 
     MyInterface myClassInstance = new Myclass(); 
     return myClassInstance; 
    } 
} 

Я хочу создать компонент MyClass в качестве экземпляра MyInterface. Mycode для этого является

<bean id="staticFactory" class="MyStaticFactory"> 
</bean> 

<bean id="myclass" class="MyInterface" factory-bean="staticFactory" factory-method="getInstance"> 
</bean> 

Но приведенный выше код я получаю исключение

org.springframework.beans.factory.BeanCreationException: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private MyInterface ; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [MyInterface] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at com.amazon.coral.reflect.instantiate.SpringInstantiatorFactory$1.newInstance(SpringInstantiatorFactory.java:175) 

Я пытаюсь получить доступ к компоненту, используя следующий код

@Autowired 
private MyInterface MyclassInstance 

ли это действительный предмет создать компонент как экземпляр интерфейса InterfaceClass? Как загрузить экземпляр MyClass в переменной класса MyInterface с помощью Spring?

+0

Вы использовали Autowired в любом месте или вы маскировать любой код из выше? Пожалуйста, вставьте фактический код, поскольку я думаю, что что-то не хватает из вашего фактического кода и кода, который вы вставили выше? Также почему вы создаете экземпляр MyStaticFactory, поскольку он не имеет смысла там, и у вас есть что-то вроде ' ' – SMA

+0

Я использую autwired для доступа к моему боб. Я обновил в своем вопросе, как я использую компонент. Я сомневаюсь, как мы расскажем весне, что мы собираемся создать экземпляр «MyClass» в переменной класса «MyInterface» с помощью snipper-кода » ' –

ответ

0

Вам не нужно автоповорачивать любое поле, так как у вас есть собственный завод, который будет создавать экземпляр bean для вас. Также вам не нужно создавать экземпляр своего фабричного класса со статическим методом. Вместо этого вы можете просто остаться с:

<bean id="staticFactory" class="MyStaticFactory" factory-method="getInstance" /> 

Теперь предположим, что у вас есть несколько реализации MyInterface, вы могли бы сделать это, передавая параметр, как:

<bean id="staticFactory" class="MyStaticFactory" factory-method="getInstance" scope="prototype"> 
    <constructor-arg value="MyClass" /> 
</bean> 

И в вашем заводе классе вы могли бы использовать либо (от JDK 7) или если еще одна лестница, чтобы проверить, что запрашивается в методе метода getInstance, и создать экземпляр соответствующего компонента.

Вы могли бы сделать следующее:

public static void main(String args[]) { 
    Application context = new ...... 
    MyInterface myIface = context.getBean("staticFactory", MyInterface.class); 
    //myIface.mymethod(); 
} 
+0

Как мы можем использовать bean без autowiring в любом поле? –

+0

Разве мы не можем это сделать, автоувеличивая его? Если мы его автоусилием, модульное тестирование станет легче для меня. Я могу загрузить издевательский экземпляр во время модульного тестирования. –

Смежные вопросы