복붙노트

[SPRING] Spring은 모든 빈이 기본 생성자를 필요로 하는가?

SPRING

Spring은 모든 빈이 기본 생성자를 필요로 하는가?

내 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

이게 정말 필요한가요?

해결법

  1. ==============================

    1.아니요, 기본 (arg가없는) 생성자를 사용할 필요가 없습니다.

    아니요, 기본 (arg가없는) 생성자를 사용할 필요가 없습니다.

    빈은 어떻게 정의 했습니까? bean에게 다음 중 하나와 같은 것을 인스턴스화하도록 Spring에게 말했던 것처럼 들린다.

    <bean id="AuditRecord" class="com.bartholem.AuditRecord"/>
    
    <bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
      <property name="someProperty" val="someVal"/>
    </bean>
    

    어디에서 생성자 인수를 제공하지 않았습니다. 이전에는 기본 (또는 arg 없음) 생성자가 사용됩니다. 인수를 취하는 생성자를 사용하려면 constructor-arg 요소를 사용하여 인수를 지정해야합니다.

    <bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
      <constructor-arg val="someVal"/>
    </bean>
    

    응용 프로그램 컨텍스트에서 다른 bean을 참조하려는 경우 val 속성이 아닌 constructor-arg 요소의 ref 속성을 사용하여 수행 할 수 있습니다.

    <bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord">
      <constructor-arg ref="AnotherBean"/>
    </bean>
    
    <bean id="AnotherBean" class="some.other.Class" />
    
  2. ==============================

    2.nicholas의 대답은 XML 구성에 대한 돈에 맞습니다. 주석을 사용하여 빈을 구성 할 때 생성자 주입을 수행하는 것이 더 간단 할뿐만 아니라 훨씬 더 자연스러운 방법이라고 지적하고 싶습니다.

    nicholas의 대답은 XML 구성에 대한 돈에 맞습니다. 주석을 사용하여 빈을 구성 할 때 생성자 주입을 수행하는 것이 더 간단 할뿐만 아니라 훨씬 더 자연스러운 방법이라고 지적하고 싶습니다.

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

    3.생성자 기반 주입을 수행 할 수 있습니다 (예 : 여기에있는 문서에서 가져온 것).

    생성자 기반 주입을 수행 할 수 있습니다 (예 : 여기에있는 문서에서 가져온 것).

    <bean id="foo" class="x.y.Foo">
        <constructor-arg ref="bar"/>
        <constructor-arg ref="baz"/>
    </bean>
    

    그러나 그것이 효과가 있을지 확신하지 못합니다.

    JavaBean을 정의하는 경우 규칙을 따라 public no-arg 생성자를 배치해야합니다.

  4. from https://stackoverflow.com/questions/7492652/does-spring-require-all-beans-to-have-a-default-constructor by cc-by-sa and MIT license