2014-12-09 2 views
1

Это BeanClass.javaSpring @Required & @Mandatory аннотаций

package com.practice.spring; 

import org.springframework.beans.factory.annotation.Required; 

import com.apress.springrecipes.sequence.Mandatory; 

public class BeanClass { 

    private int count; 
    private String prefix; 

    public BeanClass() { 
     System.out.println("Default Constructor"); 
    } 

    public BeanClass(int count, String prefix) { 
     this.count = count; 
     this.prefix = prefix; 
     System.out.println(prefix+count); 
    } 

    @Required 
    public void setCount(int count) { 
     this.count = count; 
    } 

    @Mandatory 
    public void setPrefix(String prefix) { 
     this.prefix = prefix; 
    } 

    @Override 
    public String toString() { 
     return prefix+count; 
    } 

} 

Это beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     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.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:annotation-config /> 

    <bean id="beanClass1" 
      class="com.practice.spring.BeanClass"> 
     <property name="count" value="1" /> 
     <property name="prefix" value="Bean" /> 
    </bean> 
    <bean id="beanClass2" 
      class="com.practice.spring.BeanClass"> 
     <constructor-arg value="2" /> 
     <constructor-arg value="Bean" /> 
    </bean> 
    <bean id="beanClass3" 
      class="com.practice.spring.BeanClass"> 
     <constructor-arg> 
      <value>3</value> 
     </constructor-arg> 
     <constructor-arg> 
      <value>Bean</value> 
     </constructor-arg> 
    </bean> 
</beans> 

И это, как я создаю экземпляр контекста.

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

Задача: требуется

Количество свойство & префикс является обязательным. Если вы видите beanClass2 Я устанавливаю свойство через конструктор и же в beanClass3

Но когда я выполняю код, он бросает исключение. Важно то, что это меня смущает то:

Исключение в потоке «основной» org.springframework.beans.factory.BeanCreationException: Ошибка создании компонента с именем «beanClass2», определенный в пути класса ресурса [beans.xml ]: Инициализация компонента не выполнена; вложенное исключение org.springframework.beans.factory.BeanInitializationException: Свойство 'Количество' требуется для боба 'beanClass2'

Он печатает по умолчанию Конструктор & Bean2. Я также наклеивать весь StackTrace здесь:

9 декабря 2014 8:47:33 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Освежающий org.springframework.context.support.ClassPathXmlApplicationContext @ 1a71e93: дата запуска [Вт дек 09 20:47:33 PKT 2014]; корень контекста иерархии 9 декабря 2014 8:47:33 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Загрузка определения XML-бобов из класса пути ресурс [beans.xml] 9 декабря 2014 8 : 47: 33 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-инстанцировании одиночек в org.s[email protected]4aed64: определяющие бобы [org.springframework. context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context. annotation.internalCommonAnnotationProcessor, beanClass1, beanClass2, beanClass3]; корень заводской иерархии

По умолчанию Конструктор

Bean2

9 декабря 2014 8:47:33 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons INFO: Уничтожение одиночек в org.s[email protected]4aed64: задающих бобов [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, орг. springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, beanClass1, beanClass2, beanClass3]; корень фабричной иерархии Исключение в потоке «main» org.springframework.beans.factory.BeanCreationException: ошибка создание bean-компонента с именем 'beanClass2', определенным в ресурсе пути класса [beans.xml]: Инициализация компонента не выполнена; вложенное исключение org.springframework.beans.factory.BeanInitializationException: Свойство «Количество» требуется для боба «beanClass2» в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:527) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:456) на org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:291) в орг. springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) по адресу org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:288) на org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:190) на org.springframework. beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:563) на org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:872) на org.springframework.context.support.AbstractApplicationContext. обновить (AbstractApplicationContext.java:423) по адресу org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplica . TionContext.java:139) на org.springframework.context.support.ClassPathXmlApplicationContext (ClassPathXmlApplicationContext.java:83) на com.practice.spring.Main.main (Main.java:13) Вызванный: орг. springframework.beans.factory.BeanInitializationException: Свойство 'Количество' требуется для боба 'beanClass2' в org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(RequiredAnnotationBeanPostProcessor.java:149) в org.springframework.beans .factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1064) по адресу org.springframework.beans.factory.support.AbstractAutowireCapableBeanFact ory.doCreateBean (AbstractAutowireCapableBeanFactory.java:517) ... 11 более

+0

Возможно, проблема заключается в том, что вы требуете, чтобы ваши сеттеры вызывались, но в вашем конструкторе вы настраиваете свойства вручную. Что произойдет, если вы измените свой конструктор, чтобы вызвать сеттеры? –

+0

Какой смысл? Мы можем вводить через сеттеров или конструкторов, нет? – dosdebug

+0

Да. Но вы сказали код, который setCount должен быть вызван, и вы его не называете. Весна не знает, что вы собираетесь делать в своем сеттере - вы можете делать что-то другое, кроме как устанавливать свойство; например, вы можете рассчитывать свойство. Таким образом, он не знает, что то, что вы делаете в конструкторе, функционально эквивалентно тому, что вы сказали. –

ответ

1

@Required подразумевает, что вы используете сеттер инъекции, вместо инъекции конструктора. Они предназначены для двух вариантов: одновременное выполнение обоих вариантов.

ПримечаниеЭтот из блога в Spring -

@ Обязательно позволяет инструктировать Spring Чтобы проверить требуется зависимостей для вас.В случае, если вы не в состоянии использовать инъекции конструктора или по каким-либо другим причинам, вы предпочитаете инъекции установщика, @ Обязательный путь.

Setter Injection vs Constructor Injection.

Совсем недавно

@ Требуется Marks метод (как правило, метод JavaBean-сеттер), как быть «требуется»: то есть, метод установки должен быть сконфигурирован, чтобы быть зависимостей впрыском со значением ,

RequiredAnnotation

Итак, вы пометив его как имеющие быть зависимость впрыскивается - не конструктор впрыскивается.

+0

Лучше, если вы добавите ссылку на оригинальные документы. – dosdebug

+1

Хороший звонок. Я добавил соответствующую часть предыдущих комментариев, включая ссылки. –

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