Pergunta

Qual é a melhor abordagem para criar uma classe interna não estática na primavera?

class A {
  public class B {}

  B b;
  public void setB(B b) {this.b = b;}
}

Isso parece funcionar, mas quero evitar a necessidade de um argumento construtor:

<bean id="a" class="A">
  <property name="b">
    <bean id="b" class="A$B">
      <constructor-arg ref="a"/>
    </bean>
  </property>
</bean>
Foi útil?

Solução

Em algum momento, você precisa especificar o objeto externo, não há como evitar isso. Você poderia, no entanto, mover isso para o Java e para fora do XML, adicionando um método de fábrica a A que cria o interior B:

public class A {
  public class B {}

  B b;

  public void setB(B b) {this.b = b;}

  public B createB() {return new B();} // this is new
}

E então você pode fazer:

<bean id="a" class="test.A">
  <property name="b">
    <bean id="b" factory-bean="a" factory-method="createB"/>
  </property>
</bean>

Portanto, o XML é mais simples, mas o Java é mais complexo. A primavera é inteligente o suficiente para não ficar chateada com as aparentes referências circulares.

Faça a sua escolha, você precisa fazer um ou outro.

Outras dicas

Quando você instancia uma classe interna (não estática), você precisa da referência da classe externa para criar uma. Não vejo como você pode evitá -lo quando o objeto B só pode ser criado no escopo de uma instância de A.

A.B b = new A().new B

ou

A a = new A();
A.B b = a.new B();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top