Это 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 более
Возможно, проблема заключается в том, что вы требуете, чтобы ваши сеттеры вызывались, но в вашем конструкторе вы настраиваете свойства вручную. Что произойдет, если вы измените свой конструктор, чтобы вызвать сеттеры? –
Какой смысл? Мы можем вводить через сеттеров или конструкторов, нет? – dosdebug
Да. Но вы сказали код, который setCount должен быть вызван, и вы его не называете. Весна не знает, что вы собираетесь делать в своем сеттере - вы можете делать что-то другое, кроме как устанавливать свойство; например, вы можете рассчитывать свойство. Таким образом, он не знает, что то, что вы делаете в конструкторе, функционально эквивалентно тому, что вы сказали. –