2012-02-22 15 views
37

Las clases abstractas no se pueden crear instancias en Java. Pero la primavera dice algo así como la creación de frijoles con abstract="true". Si un estado de una clase abstracta se inicializa solo por su instancia de clase hija (supongo que estoy en lo cierto), entonces si necesito usar ese atributo dentro del método que se define en la clase abstracta, entonces ... ¿hay alguna posibilidad de que ¿eso? Tengo un conjunto de código de la siguiente manera:¿Qué significa abstract = "true" en primavera?

class abstract A { 
    private Something somethingObj; 
    // getters and setters are present. 

    public void logSomething() { 
     try{ 
      //some code which throws exception 
     } 
     catch(Exception e){ 
      somethingObj.logIt(e);// I have some logic inlogIt method. 
     } 
    } 
} 

Respuesta

83

Los beans abstractos en Spring son algo diferentes de las clases abstractas. De hecho, abstract bean en Spring ni siquiera tiene que estar mapeado en ninguna clase. Toma esto como un ejemplo:

<bean id="dao" abstract="true"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="someHelper" ref="someHelper"/> 
</bean> 

<bean id="fooDao" class="FooDao" parent="dao"> 
    <property name="fooHelper" ref="fooHelper"/> 
</bean> 
<bean id="barDao" class="BarDao" parent="dao"> 
    <property name="barHelper" ref="barHelper"/> 
</bean> 

y clases:

public class FooDao { 
    private DataSource dataSource; 
    private SomeHelper someHelper; 
    private FooHelper fooHelper; 

    //setters 
} 

public class BarDao { 
    private DataSource dataSource; 
    private SomeHelper someHelper; 
    private BarHelper barHelper; 

    //setters 
} 

Tenga en cuenta que FooDao y BarDao no tienen ningún padre clase base (abstracto o no) en común. La definición primaria de bean padre se usa solo para propiedades comunes del grupo, por lo que se evita la repetición en XML.

Por otro lado la introducción de la clase abstracta Dao que tanto FooDao y BarDao Heredar del sería una buena idea:

public abstract Dao { 
    protected DataSource dataSource; 
    protected SomeHelper someHelper; 

    //setters 
} 

public class FooDao extends Dao { 
    private FooHelper fooHelper; 

    //setters 
} 

public class BarDao extends Dao { 
    private BarHelper barHelper; 

    //setters 
} 

Pero aún dao frijol no tiene que definir una clase. Trate los beans abstractos como una forma de reducir la duplicación en XML cuando varios beans concretos tienen las mismas dependencias.

+0

Cabe señalar que los beans abstractos no son instanciados por Spring –

0

En realidad, el bean padre abstracto no es necesario para definir el atributo de clase, es posible que solo necesite una propiedad común para compartir.

De acuerdo con esta tutorial

El grano de los padres no puede ser instanciada por su propia cuenta, ya que es incompleta, y también está marcado explícitamente como abstracto. Cuando una definición es abstracta como esta, solo se puede utilizar como una definición de bean de plantilla pura que sirve como definición principal para las definiciones secundarias.