El alcance de un frijol sin estado es una instancia de singleton. Si inyectamos el bean B de prototipo en el frijol A de singleton y esperamos que se pueda devolver un nuevo bean B cada vez que se llama al getBeanb () de frijol A, este requisito no se puede lograr utilizando métodos de inyección tradicionales. Debido a que la acción de la inyección de frijoles de frijoles de Singleton solo ocurre una vez, aunque el alcance del frijol B es de tipo prototipo, el objeto devuelto a través de GetBeanb () sigue siendo el bean B que se inyectó al principio.
Entonces, si desea devolver un nuevo Beanb cada vez que llame a GEABENB () de Beana, una solución opcional es dejar que Beana implementa la interfaz BeanFactoryaware, para que pueda acceder al contenedor y luego implementarlo de la siguiente manera.
Primero configurar XML:
<bean id = "autor" scope = "prototype"/> <bean id = "book" p: name = "vEil"> </bean>
El alcance del autor de Bean está configurado como prototipo.
La clase de libro implementa la interfaz BeanFactoryaware:
El libro de clase pública implementa BeanFactoryaware {...@overRidePublic void setBeanFactory (BeanFactory BeanFactory) arroja BeanSexception {this.Factory = BeanFactory;} Public Autor getPrototypeAuthor () {return (autor) Factory.getBean ("Autor"); }}Pruebas unitarias:
APLEicleContext context; @beforemethodPublic Void setup () lanza la excepción {context = new ClassPathXMLApPlicationContext ("Beans5-5.xml");}@testPublic void test () {book book = (book) context.getBean ("Libro"); System.out.println (book.getAuthor (). HashCode ()); System.out.println (book.getAuthor (). HashCode ()); System.out.println (book.getPrototypeAuthor (). HashCode ()); System.out.println (book.getPrototypeAuthor (). HashCode ());Resultados de las pruebas
A partir de los resultados, podemos ver que solo las instancias del autor obtenidas de BeanFactory son diferentes.
Esta implementación une la aplicación con el marco Spring. ¿Hay una mejor solución? Sí, es el método de inyección.
1 método de inyección
Los contenedores de primavera dependen de las bibliotecas CGLIB, por lo que el bytecode de la clase se puede operar dinámicamente durante el tiempo de ejecución, como la creación dinámica de subclases o clases de implementación de frijoles.
Interfaz BookInterface:
Interfaz pública BookInterface {Autor getAuthor ();}Configuración XML:
<!-Inyección del método-> <bean id = "autor" scope = "prototype" p: name = "maugham"/> <bean id = "book2"> <bearup-method name = "getAuthor" bean = "autor"/> </ bean>
Pruebas unitarias:
BookInterface Book = (BookInterface) context.getBean ("Book2"); AfirmanA través de este método de configuración, la implementación dinámica se puede proporcionar para la interfaz, y los frijoles devueltos de esta manera son todas instancias nuevas.
Por lo tanto, si desea obtener un bean prototipo en un frijol singleton, puede usar la búsqueda para implementar el método de inyección.
2 Método de reemplazo
En primavera, puede usar un método de cierto frijol para reemplazar otro método de un frijol.
Supongamos que hay un método getName () en el libro para obtener el título:
/*** Título del libro*/Nombre de cadena privada; public String getName () {Return Name;}Ahora creamos un nuevo bean, que implementa la interfaz MethodReplacer para reemplazar el método getName () en el libro:
Public Class Book4 implementa MethodReplacer {@Override Public Object Reimplement (Object obj, método método, objeto [] args) lanza lando {return "vivo"; }}Configuración:
<bean id = "book3" p: name = "Bright Thoush Suns"> <reemplazado-Method name = "getName" replacer = "book4"/> </bean> <bean id = "book4"/>
prueba:
Libro Book = (Libro) context.getBean ("Book3"); Afirmarequals ("Living", Book.getName ()); Resumir
Lo anterior es la implementación del método de inyección o reemplazo en el marco de Spring introducido por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje. ¡El editor responderá a todos a tiempo!