Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo Spring gestiona los objetos a través de Beanfactory

Cómo Spring gestiona los objetos a través de Beanfactory

La última versión de struts es administrada por Spring. Dejemos de lado struts2 y miremos específicamente a Spring. A continuación, comenzaremos con el archivo de configuración estándar de Spring. Si queremos inyectar un objeto administrado por Spring. debería ¿Cómo hacerlo? Por ejemplo: si consta de dos objetos A y B, y ahora necesitamos usar el objeto B en el objeto A, ¿cómo inyectamos A en B? Primero, los dos objetos A y B deben ser administrados por el contenedor Spring. Luego debemos definir las propiedades que se inyectarán en el archivo de configuración. Ahora que A y B son administrados por el contenedor Spring, ¿cómo obtengo qué objeto A? ? Debido a que el objeto AB es creado por el contenedor Spring, para obtener el objeto A, primero debe obtener BeanFactory ---- gt; GetA (), y luego puede obtener A. En este momento, la referencia al objeto B. señalado por A debe tener un valor, A se puede inyectar en B.

1. El primer método no recomendado:

Configure de la siguiente manera en el archivo de configuración de Spring: Código Java

Defina una variable de clase (estática, Todas las instancias). de la clase comparten esta variable), inicia el servidor, inicializa Spring al crear BeanFactory, crea el servidor e inicializa Spring al crear BeanFacotry, crea una instancia de todos los objetos al crear BeanFacotry. Es decir, también se crea un objeto roleAssignmentHandler03 y se coloca en su propio bloque de memoria contenedora, y este objeto tiene una referencia a userService porque definí una variable de clase aquí. La próxima vez que se cree el objeto, también habrá un valor en la variable de clase. Pero este método no es aconsejable, es una pérdida de espacio en la memoria, porque Spring ha creado el objeto para nosotros, pero no lo usamos.

Código Java publicclassRoleAssignmentHandler03implementsAssignmentHandler{ privatestaticUserServiceuserService; publicvoidsetUserService(UserService_userService){ userService=_userService}... la clase pública RoleAssignmentHandler03 implementa AssignmentHandler {private static UserService userService; }. .....

2. No se recomienda el segundo método:

No puedo probar a través del nuevo ClassPathXmlApplicationContext("") como de costumbre. Para crearlo, debemos obtenerlo del; entorno actual, entonces, ¿dónde obtenerlo? Entonces es necesario entender cómo se crea, ¿quién lo crea y lo gestiona? Cuando se inicia el servidor, inicializa la información de configuración del linstener web.xml y crea el linstener web.xml.

xml linstener información de configuración, cree un objeto Bean'Factroy y coloque este objeto en ServletContext. Podemos usar una clase de herramienta en primavera para obtener el objeto BeanFactory en ServletContext, pero no se recomienda porque ServletActionContext es la lógica empresarial. Struts Depende demasiado del contenido de la capa de presentación, JBPM no depende del contenido de la capa de presentación y no se recomiendan las dependencias. getServletContext());UserService userService = factory.getBean("userService");

3. No se recomienda el tercer método

Cuando se utiliza la integración SSH y JBPM. desarrollo de proyectos, utilizando paquetes de integración de terceros, podemos obtener soluciones desde aquí (usando jbpm3.1, por lo que su paquete de integración de terceros es JBPM3.1). 1 Entonces, su paquete de integración de terceros es spring-modules-jbpm31.jar). En su documento (jbpm31.html), puede aprender a usar la siguiente configuración:

Configuración del archivo de definición de proceso Código Java roleAssignmentHandler03. roleAssignmentHandler03

El código Java se puede definir en el archivo de configuración de Spring de la siguiente manera

4. El cuarto método:

Mirando hacia atrás, continuaremos pensando en obtener la definición del proceso del archivo BeanFactory, y no modificarlo para evitar destruir su flexibilidad. Entonces la siguiente pregunta a analizar es ¿cómo obtener BeanFactory? Luego profundizaremos en Spring. Ahora veamos una pregunta: ¿Cómo obtener objetos no singleton en un singleton? En otras palabras, cuando B se inyecta en A, A es un singleton, pero B no es un singleton. Si usa recursos directamente o usa la inyección de atributos en el archivo de configuración, solo puede inyectar B en el singleton. objeto. . Entonces, ¿cómo obtener dinámicamente los objetos dependientes en el objeto singleton? Una forma es obtener su objeto de BeanFactory, entonces, ¿cómo hacer que Spring BeanFactory administre el objeto? En otras palabras, para acceder al contenedor en el objeto de instancia del contenedor, existe una interfaz BeanFactoryAware en Spring. Hay un método setBeanFactory (BeanFactory f) en esta interfaz. Podemos implementar esta interfaz y anular este método para obtener nuestro BeanFactory. , obtener dinámicamente nuestro BeanFactory de él, pero aún no es posible ponerlo en la clase de controlador en jbpm para su uso porque Spring no lo administra, por lo que incluso si implementamos la interfaz BeanFactory y anulamos el método, no podemos configurar BeanFactory. valor porque es administrado por Spring. Dado que Spring administra BeanFactory, no puedo inyectar un objeto Bean proporcionado por Spring desde un Bean que no está administrado por Spring.

Pero podemos resolver este problema mediante otro método: crear una clase auxiliar BeanFactroyHelper y dejar que implemente la interfaz BeanFactoryAware, de la siguiente manera: Código Java publicclassBeanFactoryHelperimplementsBeanFactoryAware{ privatestaticBeanFactoryfactory(); publicvoidsetBeanFactory(BeanFactoryf) throwsBeansException{ factory=f } publicstaticBeanFactorygetFactory() { returnfactory; }} la clase pública BeanFactoryHelper implementa BeanFactoryAware {fábrica privada estática de BeanFactory; public void setBeanFactory(BeanFactory f) lanza BeansException {factory = f;} public static BeanFactory getFactory(){return factory;}}

Entonces, dejemos la clase anterior ingresa a Spring Management, y la configuración en Spring es la siguiente: Código Java

Finalmente, en nuestra clase de controlador, puede usar directamente el código Java BeanFactoryfactory = BeanFactoryHelper.getFactory(); BeanFactoryHelper.getFactory();

Este método también se puede completar, pero no lo uso porque el cuarto método ya se completó para mí. Por tanto, no es necesario repetir estas tareas similares. Así que tampoco adoptaré este enfoque.

5. El quinto método:

El método anterior se implementa de manera similar en el desarrollador del paquete de integración de terceros spring-modules.jar. Entonces, ¿cómo lo logran? Esto requiere comprender los principios básicos de jbpmHandlerProxy. La clase JbpmHandlerProxy implementa interfaces como ActionHandler, AssignmentHandler, DecisionHandler y TaskControllerHandler. Al implementar diferentes interfaces, se llamarán sus diferentes métodos de ejecución, asignación, decisión, etc. ...

ServiceLocator, Spring también proporciona una interfaz del patrón de diseño ServiceLocator, BeanFactoryLocator, es decir, la interfaz BeanFactoryReference. Para comprender su mecanismo interno en detalle, debemos dedicar más esfuerzos a analizar su fuente. código. (No entraré en un análisis detallado aquí) Aquí solo entiendo la idea general del mecanismo de implementación de la clase jbpmFactoryPorxy, por lo que daré una descripción general de las siguientes ideas de implementación específicas en la clase proxy: Obtener BeanFactory objeto en la clase JbpmHandlerProxy, principalmente Obtenga BeanFactoryReference a través de JbpmFactoryLocator y obtenga Factory a través de BeanFactoryReference.

Entonces, ¿de dónde lo obtiene JbpmFactoryLocator en la clase JbpmHandlerProxy? Al observar el código fuente, podemos ver que hay un método setBeanFactory() en su clase JbpmFactoryLocator. Entonces, ¿quién llama a este método? Al mirar, podemos ver que lo llama la clase LocalJbpmConfigurationFactoryBean. El análisis principal de esta figura es el siguiente:

La figura anterior muestra el mecanismo interno de jbpmFactoryProxy.

Hablaré sobre la solución específica a continuación:

Primero, use el método retrieveBeanFactory en la clase de implementación jbpmFactoryProxy para obtener la forma específica en que jbpm se ha inyectado en el objeto BeanFactory en el Implementación A continuación, lo encapsularé aún más para implementar la función de inyección automática.

Primero publique el uso específico en la clase de controlador jbpm y el mismo uso en el objeto bean usando spring.

El código Java /**** es inyectado automáticamente por BaseAutowire */@ResourceprivateUserServiceuserServce; /**** es inyectado automáticamente por BaseAutowire */@Resourceprivate UserService /**** es inyectado automáticamente por BaseAutowire UserServce inyectado automáticamente por BaseAutowire será la clase base extraída: Código Java /** * Inyecta automáticamente la clase base BeanFactory *@authorlzh * */publicclassBaseAutowire{ /** * Se llama automáticamente al llamar a una subclase * Se llama en el Método constructor retrieveBeanFactory(), obtiene el objeto BeanFactory en el constructor * Utilice su configuración de interfaz de implementación para configurarse para inyectar subclases automáticamente */publicBaseAutowire(){ ((AutowireCapableBeanFactory)) retrieveBeanFactory()) .autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, verdadero } protectedBeanFactoryretrieveBeanFactory(){ BeanFactoryLocatorfactoryLocator=newJbpmFactoryLocator(); BeanFactoryReferencefactory= factoryLocator.useBeanFactory(null); if(factory==null) thrownewIllegalArgumentException("nobeanFactoryfoundunderkey=" null); factory.release(); } }}}/**** Inyecta automáticamente la clase base BeanFactory* @author lzh**/public class BaseAutowire {/**** Se llama automáticamente al llamar a una subclase.

Llamar * Llame al método retrieveBeanFactory() en el constructor para obtener el objeto BeanFactory * Utilice su configuración de interfaz de implementación para inyectarse automáticamente en la subclase */public BaseAutowire() {((AutowireCapableBeanFactory)) retrieveBeanFactory()).autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, verdadero); } protected BeanFactory retrieveBeanFactory() { BeanFactoryLocator factoryLocator = new JbpmFactoryLocator(); " null); prueba {return factory.