La diferencia entre Spring BeanFactory y FactoryBean

Primero resuma la diferencia entre BeanFactory y FactoryBean

La fábrica de Bean en BeanFactroy spring puede producir nuestras clases y obtener nuestros objetos. Por ejemplo, una de nuestras clases se entrega a Spring para su administración, y podemos obtener BeanName directamente a través de este BeanFactroy.

FactroyBean, es un Bean especial en primavera. Es una interfaz que tiene tres métodos para ser implementados. Los Beans que implementan FactroyBean pueden crear un Bean, que es el Bean realmente devuelto por el método getObject ().

Existen en el contenedor de primavera en diferentes formas.Si necesita obtener un Bean que implemente FactroyBean, debe agregar un símbolo '&' delante del BeanName para obtenerlo. Si necesita obtener el Bean realmente devuelto por el método getObject (), obtenga BeanName directamente

Veamos el código para lograr

Primero veamos un objeto ordinario de la siguiente manera

package org.springframework.test.main.entity;

public class Student {

	public void query(){
		System.out.println("org.springframework.test.main.entity.Student.query");
	}

}

Aquí hay otra clase administrada por Spring, que se realiza aquí usando anotaciones

package org.springframework.test.main.entity;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class Parent implements FactoryBean {
	@Override
	public Object getObject() throws Exception {
		return new Student();
	}

	@Override
	public Class<?> getObjectType() {
		return Student.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	public void query(){
		System.out.println("org.springframework.test.main.entity.Parent.query");
	}
}

Probemos la clase de nuevo

package org.springframework.test.main;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.main.config.ScanConfig;
import org.springframework.test.main.entity.Parent;
import org.springframework.test.main.entity.Student;

public class MainDemo {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScanConfig.class);
		Parent parent =(Parent) ac.getBean("parent");
		parent.query();
	}

}

Centrémonos en esta línea de código para getBean. En circunstancias normales, si nuestro padre no implementa la interfaz FactoryBean, podemos llamar al método query () en el padre.

Pero si una vez que se implementa la interfaz FactoryBean, el método getObject () interno se reescribe, y el bean devuelto por este método es el Bean finalmente obtenido.
Con esta conclusión, ejecutar el código anterior obviamente reportará un error. Vemos una conversión de tipo excepción.
 

D:\java\jdk8\bin\java.exe "
Exception in thread "main" java.lang.ClassCastException: org.springframework.test.main.entity.Student cannot be cast to org.springframework.test.main.entity.Parent
	at org.springframework.test.main.MainDemo.main(MainDemo.java:12)

Process finished with exit code 1

Vamos a cambiarlo. Agregamos el ampersand a getBean ("& parent"); y encontraremos que el método query () en parent se llama con éxito cuando ejecutamos.

Volvamos al problema de la excepción de conversión de tipo anterior.Cuando cambiamos el padre al método Student devuelto en el método getObject (), el resultado fue una llamada exitosa al método query () del estudiante. Es decir, Student parent = (Student) ac.getBean ("parent");

 

Sabemos que cuando se inicia el contenedor de resorte, el objeto anotado con @Component se entregará al contenedor de resorte para su administración, como el Padre en este artículo. Cuando lo obtengamos directamente, se puede obtener getBean ("padre") normalmente. Pero cuando nuestro bean implementa la interfaz FactoryBean y sobrescribe un método getObject () dentro, necesitamos agregar getBean ("& parent") para obtener este bean, y el objeto devuelto por nuestro método getObject () puede ser GetBean ("parent") directamente.
Por ejemplo, el texto en el texto es normal.

Parent parent =(Parent) ac.getBean("&parent");//实现了FactoryBean的bean
Student parent =(Student) ac.getBean("parent");//实现了FactoryBean的bean重写的getObject()方法中返回的Bean

Esta es una buena respuesta al resumen anterior.

El escenario de aplicación más común es el objeto SqlSessionFactory en Mybaits.
 

Supongo que te gusta

Origin blog.csdn.net/qq_38108719/article/details/93489624
Recomendado
Clasificación