Я не хочу создавать конструктор по умолчанию для моего 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.