Deconstruyo cómo Spring maneja los objetos Java con un ejemplo simple.
Primero, defina un POJO simple, el código es el siguiente:
paquete com.jvk.ken.spring; public class Demo {private String name; public demos () {name = "Soy demo.";} public void printname () {System.out.println (name);} public void setName (name de cadena) {this.name = name;}}El archivo de configuración de resorte correspondiente es el siguiente:
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" "" "" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/context http://www.springframework.org/schema/scontetext/. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/Beans/spring-beans-3.1.xsd "> <<remo Id =" Demo "
El código de prueba simple es el siguiente:
paquete com.jvk.ken.spring; import org.springframework.beans.factory.beanfactory; import org.springframework.beans.factory.xml.xmlBeanFactory; importar org.springframework.core.io.classpathResource; public class de clase pública {testSpring ();} private static void testSpring () lanza la excepción {beanFactory bf = new XMLBeanFactory (new ClassPathResource ("ApplicationContext.xml")); Demo Bean = (Demo) bf.getBean ("DEMO"); System.Println (bean.getClass ();Ejecute la clase de prueba y genere la siguiente información, lo que indica que se ha ejecutado con éxito un ejemplo de resorte simple.
2012-3-28 22:18:07 org.springframework.beans.factory.xml.xmlBeanDefinitionReader LoadBeanDefinitions Información: Carga de definiciones de XML Bean de clases Rath Resource [Application.xml] Class com.jvk.ken.spring.demo I'm Delo.
Desde el código de Java corto y el archivo de configuración XML, podemos ver que XMLBeanFactory ensambla Javabean leyendo el archivo de configuración XML y devuelve el objeto requerido cuando el usuario llama al método GetBean. Para imitar su comportamiento, defino una fábrica de frijoles simple.
paquete com.jvk.ken.spring; import java.util.hashmap; import java.util.map; public class myBeanFactory {// Guardar la definición de mapa de bean <string, class> beans = new Hashmap <String, class> (); public Object GetBean (ID de cadena) tira InstantatiationException, ilegalaccessexception {Return frijoless.get (id) .newinstance ();} private String xmlFile; public myBeanFactory (String xmlFile) lanza ClassNotFoundException {super (); this.xmlfile = xmlfile; init ();} private void init () lanza ClassNotFoundException {// Inicializar y analizar XML, el análisis real de XML se omite aquí, y usa código duro para imitar System.out.println ("Archivo de configuración:"+XMLFile); Caded ClassName = "com.jvk.ken.spring.demo"; class <?> LoadClass = this.getClass (). GetClassLoader (). LoadClass (classname); beans.put ("demo", loadclass);}}El código de prueba es el siguiente:
paquete com.jvk.ken.spring; prueba de clase pública {public static void main (string [] args) lanza excepción {testNotspring ();} private static void testNotSpring () arroja excepción {myBeanFactory bf = new MyBeanFactory ("ApplicationContext.XMML"); Demo Bean = (DEMO) bf.getBean ("demo"); system.out.println (bean.getclass ()); bean.printname ();}}Después de ejecutar, se emite la siguiente información:
Archivo de configuración: AplicationContext.xml Class com.jvk.ken.spring.demo I'm Demo.
El código corto anterior muestra cómo la primavera actúa como la fábrica de frijoles más simple. Ajustemos el código ligeramente a continuación para analizar lo que sucede en la primavera. Primero, cambie el método de construcción sin parámetros de la clase de demostración a privado.
private demo () {name = "Soy demo"; }La ejecución del código de prueba reveló que no había diferencia en los resultados de la prueba de primavera, pero mi myBeanFactory personalizado informó el siguiente mensaje de error:
Excepción en el hilo "principal" java.lang.illegalaccessexception: class com.jvk.ken.spring.mybeanfactory no puede acceder a un miembro de la clase com.jvk.ken.spring.demo con modificadores "privados" en sun.reflect.reflection.ensurememberaccess (reflexión.java:65) java.lang.class.newinstance0 (class.java:349) en java.lang.class.newinstance (class.java:308) en com.jvk.ken.spring.mybeanfactory.getbean (mybeanfactory.java:12) en com.jvk.ken.spring.test.testnotspring (test.java:25) en com.jvk.ken.spring.test.main (test.java:9)
La primavera es tan mágica? No, el código que escribí es demasiado simple y se puede ejecutar directamente con una ligera modificación.
Public Object GetBean (ID de cadena) lanza la excepción {class1 = beans.get (id); Constructor declaradoconstructor = class1.getDeClaredConstructor (); declaradoconstructor.setAccessible (verdadero); regreso declaradoconstructor.newinstance (); }Lo anterior es el Javabean más puro administrado por Spring Container. Spring también es compatible con otro tipo de frijol, llamado fábrica, el ejemplo es mejor que mil palabras, consulte el código
paquete com.jvk.ken.spring; import org.springframework.beanss.factory.factoryry; public class demofactory implementa factorybean {@override public object getObject () lanza excepción {return new Demo ();}} ogride public class getObjectType () {return Demo.class;}@public BoLide Demo ();}@Class public GetObjectType () {return Demo.class;}@public BoLide Demo (); FALSO;}}Después de agregar la clase Demofactory, modifique el archivo de configuración de Spring al mismo tiempo
<bean id = "demo" />
Los otros códigos no se modifican. Después de ejecutar el código de prueba, los resultados de la salida son exactamente los mismos que antes. ¿Por qué la clase com.jvk.ken.spring.demoFactory con ID está configurada, pero el resultado devuelto es una instancia de demostración? Esto se debe a que Spring detecta que la demofactoria es un frijol especial que implementa la interfaz de fábrica. Se llamará al método GetObject antes de devolver el resultado, por lo que el resultado final es el objeto de demostración. Por supuesto, si realmente necesitamos obtener el frijol de fábrica, podemos escribir bf.getbean ("y demostración") como este.
Resumir
Lo anterior es toda la explicación detallada del código de creación de objetos de la implementación de primavera, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!