Требуется ли Spring для всех компонентов, имеющих конструктор по умолчанию?

Я не хочу создавать конструктор по умолчанию для моего classа auditRecord .

Но Весна, похоже, настаивает на этом:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'auditRecord' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.bartholem.AuditRecord]: No default constructor found; nested exception is java.security.PrivilegedActionException: java.lang.NoSuchMethodException: com.bartholem.AuditRecord 

Это действительно необходимо?

Нет, вы не обязаны использовать конструкторы default (no arg).

Как вы определили свой bean-компонент? Похоже, вы, возможно, сказали Spring, чтобы создать экземпляр вашего компонента, как-то вроде этого:

     

Где вы не указали аргумент конструктора. Предыдущие будут использовать конструкторы default (или no arg). Если вы хотите использовать конструктор, который принимает аргументы, вам нужно указать их с элементом constructor-arg следующим образом:

    

Если вы хотите ссылаться на другой компонент в контексте приложения, вы можете сделать это, используя атрибут ref элемента constructor-arg а не атрибут val .

     

Ответ Николаса на деньги для XML-конфигурации. Я просто хотел бы отметить, что при использовании аннотаций для настройки ваших bean-компонентов, это не только упрощает конструкторскую инъекцию, но гораздо более естественный способ сделать это:

 class Foo { private SomeDependency someDependency; private OtherDependency otherDependency; @Autowired public Foo(SomeDependency someDependency, OtherDependency otherDependency) { this.someDependency = someDependency; this.otherDependency = otherDependency; } } 

Вы могли бы сделать инъекцию на основе конструктора, то есть нечто подобное (взятое из документации, найденной здесь )

     

но я не уверен, что это сработает.

Если вы определяете JavaBean, вам нужно следовать этому соглашению и помещать на него публичный конструктор no-arg.