2013-09-30 3 views
3

Мне нужна помощь в следующей теме.Весна выдает ошибку: определение бина абстрактно

У меня есть иерархия бобов, просто так:

<bean id="father" class="myPackage.Father" abstract="true"/> 

<bean id="childA" class="myPackage.ChildA" parent="father">  
     <property name="atrib1" value="hello"></property> 
</bean> 

<bean id="childB" class="myPackage.ChildB" parent="father"> 
     <property name="atrib2" value="bye"></property> 
     <property name="atrib3" value="other"></property> 
</bean> 

Мне нужно создать еще один компонент, который содержит ссылку на абстрактный класс. Затем во время выполнения мне нужно будет инициализировать переменную TYPE «myPackage.Father» и создать экземпляр с любым из дочерних классов (механизм полиморфизма). Я имею в виду что-то вроде этого:

<bean id="reference" class="myPackage.Another"> 
     <property name="atrib4" ref="father"></property> 
</bean> 

Заметьте, что ссылка (экземпляр myPackage.Another) не является подкласс myPackage.Father. Но с этими линиями весна вызывает следующую ошибку:

Bean definition is abstract 

Как я могу справиться с этим?

Благодарим за помощь, спасибо заранее!

+2

'abstract' на определение компонента ** ** ** отношение к абстрактному классу. Если вам нужно другое средство создания экземпляра, либо определите «FactoryBean», который содержит эту логику, либо используйте файл свойств, содержащий ссылочный компонент, и используйте «PropertyPlaceHolder», чтобы заменить его во время выполнения. –

ответ

1

Прежде всего абстрактный бобин не имеет ничего общего с абстрактным классом , их даже не нужно сопоставлять классу. Они используются для группировки общих свойств, совместно используемых другими beans. Но вы не можете использовать абстрактный боб в качестве ссылки на проводку свойства в другом компоненте. Если ваш bean myPackage.Некоторые ссылаются на тип myPackage.Father и ваши дочерние бобы могут быть назначены (или продолжения инвентаря) на myPackage.Father, тогда вы можете подключить либо childA, либо childB в свой myPackage. Другие компоненты, подобные этому

<bean id="reference" class="myPackage.Another"> 
      <property name="atrib4" ref="childA"></property> 
    </bean> 
+0

, поэтому вы говорите мне, что во время выполнения, если ссылка на экземпляр может принимать любую из два значения детей, то я понадобятся следующие определения боб: <боб ID = "referenceA" класс = "myPackage.Another"> <имя свойства = "atrib4" исх = "childâ"> Разве не так? –

+0

да, если вы хотите два разных компонента типа myPackage. Другие, каждый из которых имеет atrib4, подключенный с различными дочерними бобами childA и childB – noobandy

2

абстрактные бобы никогда не создаются как объекты, они существуют только в форме определений.

Из документа: http://docs.spring.io/spring/docs/3.0.x/reference/beans.html Родительский компонент нельзя создать самостоятельно, поскольку он неполный, и он также явно обозначен как абстрактный. Когда определение является абстрактным, как это, оно может использоваться только как чистое определение фасонного компонента, которое служит в качестве родительского определения для определений дочерних элементов. Пытаясь использовать такой абстрактный родительский компонент самостоятельно, ссылаясь на него как свойство ref другого компонента или выполняющего явный вызов getBean() с идентификатором родительского компонента, возвращает ошибку. Аналогичным образом внутренний метод preInstantiateSingletons() контейнера игнорирует определения bean-элементов, которые определяются как абстрактные.

В вашем случае

<bean id="reference" class="myPackage.Another"> 
     <property name="atrib4" ref="father"></property> 
</bean> 

имеет в виду боба определяется как реферата, который вызывает проблему.

+0

Спасибо за ваш ответ. Я знаю, что это абстрактный класс, но мой новый вопрос заключается в том, как вы можете перевести следующий код java в beans: myPackage.Father atrib4 = new myPackage.ChildA(). Это возможно в java, но как писать с bean-компонентом? –

+0

@CarlosSaric: весной abstract = «true» используется для шаблона, поэтому вы не можете напрямую ссылаться на него, работа вокруг будет назначать значение свойства во время фазы init, 2- напрямую использовать ref для дочернего объекта, 3- или bean с другим идентификатором, у которого есть родительский Отец, и все реализованы переопределяющее поведение, а затем ссылаются на этот объект. В простой весне applicationcontext разрешает определение bean-объекта объекту, который является конкретным классом. логично подумайте, как вы даете значение для карты весной, если вы хотите указать hastable отдельно, вы даете определение для того же самого и ссылаетесь на это –

0

Существует нет различия между абстрактным классом и абстрактными beans.When вы используете bean-компоненты и ссылаетесь на другой bean-элемент, который является абстрактным, это означает, что вы хотите создать экземпляр абстрактного класса, и он не может работать верно! Будьте осторожны, когда вы используете абстрактный класс! Абстрактный класс используется для класса шаблонов, и вы можете просто расширить его!