Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Es problemático el montaje automático del resorte?

¿Es problemático el montaje automático del resorte?

¿Es problemático Spring Autowire?

Una breve introducción al autowire de resorte. Déjame preguntarte primero, ¿crees que el cable automático de resorte es bueno?

Si lo usa, puede reducir la legibilidad y la capacidad de mantenimiento, pero en Spring, todas las dependencias entre clases se usan

La siguiente introducción a Spring nos proporciona Proporciona las propiedades de autowire .

El valor del atributo autowire en el archivo de configuración de Spring es el siguiente:

Análisis de 1: No

No utilice autowiring, este es el valor predeterminado valor del autowire. Las dependencias deben especificarse mediante elementos ref, que es el valor predeterminado.

Caso:

Código Java

//Configuración de app.xml en primavera

lt! - Definir la instancia javabean de empServiceImpl ->;

ltbean id = " empServiceImpl " class = " com . csdn . service . empServiceImpl " gt

ltproperty name = " name " gt;

lt valor gtNan lt/valor gt; lt/propiedad gt;

lt/bean gt

lt! -Defina una instancia javabean de hourEmpServiceImpl para implementar la capa empresarial de EmpServiceImpl ->;

ltbean id = " hourEmpServiceImpl " class = " com . csdn . service . hourEmpServiceImpl " auto wire = " no " gt; /p> p>

lt! —autowire se define como no, lo que indica la necesidad de usar ref->;

ltproperty name = " empServiceImpl " ref = " empServiceImpl " gt/property gt; bean gt;

//Código de empServiceImpl

Paquete com.csdn.service;

Clase pública EmpServiceImpl {

/* * Definir instancia de variable */

Nombre de cadena privada;

/* *Asignar valor mediante el método set*/

public void setName(nombre de cadena){

this.name = nombre

}

}

código hourumpserviceimpl

Paquete com.csdn.service;

p>

Clase pública HourEmpServiceImpl {

/* *Definir el objeto de operación de EmpServiceImpl*/

privado EmpServiceImpl EmpServiceImpl;

/* *Generar el correspondiente */

public void setEmpServiceImpl(EmpServiceImpl EmpServiceImpl){

this .empServiceImpl = empServiceImpl

}

}

//código de clase de prueba junit

@test

Prueba de anulación pública(){

contexto de aplicación AC = new classpathmlaplicationcontext(" app . XML " );

HourEmpServiceImpl HSI =(HourEmpServiceImpl)AC . get bean(" HourEmpServiceImpl ");

}

2: Analizar por nombre

Por nombre de atributo

método para encontrar el contenedor Spring, detectar beans con exactamente el mismo nombre y atributos de javabean, y ensamblarlos automáticamente con los atributos.

Caso:

Código Java

//Configuración de app.xml en primavera

lt! - Definir la instancia javabean de empServiceImpl ->;

ltbean id = " empServiceImpl " class = " com . csdn . service . empServiceImpl " gt

ltproperty name = " name " gt;

lt valor gtNan lt/valor gt; lt/propiedad gt;

lt/bean gt

lt! -Defina una instancia javabean de hourEmpServiceImpl para implementar la capa empresarial de EmpServiceImpl ->;

ltbean id = " hourEmpServiceImpl " class = " com . csdn . service . hourEmpServiceImpl " auto wire = " byName " gt; /p> p>

lt! ——La definición de autowire es que byName representa la implementación de otras clases y el nombre del javabean detectado automáticamente es exactamente el mismo que su atributo.

Nota: Si no se crea una instancia del javabean implementado en el xml de Spring, no se informará como un error, pero será null-gt;

lt/beangt;

// Código de empServiceImpl

Paquete com. csdn. service;

Clase pública EmpServiceImpl {

/* *Definir instancia de variable*/

Nombre de cadena privada;

/* *Asignar valor a través del método set*/

public void setName(nombre de cadena){

this.name = nombre

}

}

Código de hourumpserviceimpl

Paquete com.csdn.service;

Clase pública HourEmpServiceImpl {

/* *Definir el objeto de operación de EmpServiceImpl*/

private EmpServiceImpl EmpServiceImpl;

/* *Generar el correspondiente */

public void setEmpServiceImpl(EmpServiceImpl EmpServiceImpl){

this empServiceImpl = empServiceImpl;

}

}

//junit Código de clase de prueba;

@test

Prueba de anulación pública(){

contexto de aplicación AC = new classpathmlaplicationcontext(" app . XML ");

HourEmpServiceImpl HSI =(HourEmpServiceImpl)AC . get bean(" HourEmpServiceImpl ");

}

Análisis de 3: Por tipo

Si en el contenedor Un bean del mismo tipo que existe la propiedad especificada, si no se encuentra ningún bean coincidente, la propiedad no se ensamblará. Si hay varios beans de este tipo, se generará una excepción que indica que el cableado automático no se puede realizar por tipo.

Caso:

Código Java

//Configuración de app.xml en primavera

lt! - Definir la instancia javabean de empServiceImpl ->;

ltbean id = " empServiceImpl " class = " com . csdn . service . empServiceImpl " gt

ltproperty name = " name " gt;

lt valor gtNan lt/valor gt; lt/propiedad gt;

lt/bean gt

lt! -Defina una instancia javabean de HourAddressServiceImpl e implemente el javabean de EmpServiceImpl, luego habrá un error:

org.spring framework.insatisfieddependencyexception: creado y definido en el recurso de ruta de clase [ap p. .xml] Error con el bean llamado 'hourEmpServiceImpl': Dependencia insatisfecha representada por la propiedad del bean 'EmpServiceImpl': Bean único no definido de tipo [com.csdn.service.empServiceImpl]: Se esperaba un único bean coincidente, pero se encontró Obtuve 2: [empServiceImpl, com.csdn.service.houraddresserviceimpl#0]; la excepción anidada es org.spring framework.beans.factory.nosuchbeandetificationException: bean de tipo único no definido [com.csdn.service.empServiceImpl]: se esperaba un único bean coincidente, pero encontré 2: [empServiceImpl, com.csdn.servicio.houraddresserviceimpl #0]

en org.spring framework.java: 1091)

Ubicado en org.spring framework.beans.factory.support.abstractautowirecapablebean factory.populatebean(abstractautowirecapablebean factory.Java: 982)

Ubicado en org.spring framework docreatebean factory. (abstractautowirecapablebean factory. Java: 472)

Ubicado en org spring fr.

amework . beans . soporte . abstractautowirecapablebean factory $ 1 . org . spring framework . factory . soporte . abstractautowirecapablebeanfactory . Java :264)

Ubicado en org.spring framework.beans.factory.support.defaultsingletonbeanregistry.getSingleton(defaultsingletonbeanregistry.Java:222)

Ubicado en org.spring framework.beans. soporte de fábrica. 185 )

Ubicado en org . spring framework . beans factory . abstract bean factory . . beans . soporte de fábrica. defaultlistablebeanfactory. preinstantiatesingletons(defaultlistablebeanfactory. Java: 429) en org. contexto de aplicación abstracta. > en org. contexto de primavera.

t .refresh(abstractapplicationcontext .Java:380)

Ubicado en org .spring framework .context .support .classpathmlaplicationcontext .lt;init gt(classpathmlaplicationcontext .Java:139)

Ubicado en org . spring framework.context.support.classpathmlaplicationcontext.lt;init gt(ClassPathXmlApplicationContext.java:83)

ubicado en com.csdn.JUnit.emptest.test(emptest.Java:13)

Ubicado en sun. sun . reflejar .delegatingmethodaccessorimpl .invoke(delegatingmethodaccessorimpl.Java:25)

En Java.lang.reflect.method.invoke(method.Java:597)

En org.JUnit. método runners.model.framework $ 1. runreflectivecall (método de marco. Java: 44)

Ubicado en org. JUnit internal . /p>

Ubicado en org.JUnit.runners.model. .evaluar(invocar método. Java: 20)

Ubicado en org.JUnit.runners ejecutar antes. org.JUnit.runners.declaraciones.runafters.evaluar(runafters.Java:31)

Ubicado en org.JUnit runners.

er . run child (bloque corredor de clase JUnit 4. Java: 73)

ubicado en org. JUnit runners. bloque corredor de clase JUnit 4. / p>

En org.JUnit runners.ejecutar hijos(padre runner.Java:180)

En org.JUnit runners. Java :41)

Ubicado en org.JUnit.runners.parentrunner$1.evaluate(parent runner.Java:173)

Ubicado en org.JUnit.internal.runners.statements. ejecutar antes . org.JUnit .corredor principal .run(corredor principal. Java: 220)

Ubicado en org.eclipse JDT .JUnit 4 test. referencia Java: 46)

Ubicado en org.eclipse.JDT.internal.JUnit.runner.testrun.run(testexecution.Java:38)

Ubicado en org. eclipse.JDT.internal.JUnit runner.ejecutor de pruebas remotas. (ejecutor de prueba remoto. Java: 683)

Ubicado en org.eclipse.JDT.internal.JUnit.runner.remotetestrunner.run(remotetestrunner.Java:390)

Ubicado en org .eclipse.JDT interno.JUnit.ejecutor de prueba remoto.principal(ejecutor de prueba remoto.Java:197)

Causado por: org.springframework.beans.factory.nosuchbeanddefinitionException: Bean único no definido de tipo [com.csdn.service.empServiceImpl]: se esperaba un único bean coincidente, pero se encontró 2: [empServiceImpl, com.csdn serviceimpl # 0. ]

Ubicado en org.spring framework.beans.factory.support.defaultlistablebeanfactory.resolveddependency(defaultlistablebeanfactory.Java:621)

Ubicado en org.spring framework.beans support factory. . abstractautowirecapablebean factory . autowirebytype(abstractautowirecapablebean factory . Java: 1076)

...y 40 más

ltbean class = " com . csdn . service . hourdaddressserviceimpl " gt; gt;

-gt;

lt! -Defina una instancia javabean de hourEmpServiceImpl para implementar la capa empresarial de EmpServiceImpl ->;

ltbean id = " hourEmpServiceImpl " class = " com . csdn . service . hourEmpServiceImpl " auto wire = " byType " gt; /p> p>

lt! —La asociación automática se define como byType- gt;

lt/bean gt;

//Código de empServiceImpl

Paquete com.csdn.service;

p>

Clase pública EmpServiceImpl {

/* *Definir instancia de variable*/

Nombre de cadena privada;

/* * Asignar valor mediante el método set */

public void setName(nombre de cadena){

this.name = nombre

}

}

Código de hourumpserviceimpl

Paquete com.csdn.service;

Clase pública HourEmpServiceImpl {

/* *Definir el objeto de operación de EmpServiceImpl*/

private EmpServiceImpl EmpServiceImpl;

/* *Generar el correspondiente*/

public void setEmpServiceImpl(EmpServiceImpl EmpServiceImpl){

esto. empServiceImpl = empServiceImpl;

>

}

}

Código de hourraddressserviceimpl

Paquete com.csdn.service;

//Esto es solo un herencia Instancia javabean de EmpServiceImpl.

La clase pública HourAddressServiceImpl extiende EmpServiceImpl {

}

//código de clase de prueba junit

@test

public void test(){

contexto de aplicación AC = new classpathmlaplicationcontext(" app . XML ");

HourEmpServiceImpl HSI =(HourEmpServiceImpl)AC get bean(" HourEmpServiceImpl ");

}

Nota: La forma en que la clase principal coincide con la subclase es que la subclase se carga automáticamente como un objeto de la clase principal.

Interfaz y clase de implementación: Los objetos de las clases de implementación se pueden cargar automáticamente en objetos de las interfaces. De lo contrario, se producirá una excepción de puntero nulo.