El uso de archivos XML para configurar en los archivos de configuración de Spring realmente está pidiendo a Spring que ejecute el código correspondiente, por ejemplo:
Usar el elemento <Bean> es en realidad dejar que Spring ejecute el constructor sin parámetro o que contiene parámetros Use el elemento <Protey>, en realidad para que Spring ejecute el método Setter una vez
Sin embargo, los programas Java también pueden tener otros tipos de declaraciones: llamar a los métodos de Getter, llamar a métodos ordinarios, acceder a campos de clases u objetos, etc. Spring también proporciona una sintaxis de configuración correspondiente para tales declaraciones:
Método Getter de llamadas: use PropertyPathFactoryBean
Llamar al valor archivado de una clase u objeto: use FiledRrievingFactoryBean
Llamar a un método normal: use MethodInvokingFactoryBean
Inyectar los valores de la propiedad de otros frijoles
PropertyPathFactoryBean se usa para obtener el valor de propiedad del bean objetivo (en realidad el valor devuelto llamando al método Getter). El valor obtenido se puede inyectar en otros frijoles, o un nuevo frijol se puede definir directamente. Consulte el siguiente archivo de configuración:
<bean id="person"> <property name="age" value="30" /> <property name="son"> <!-- Use nested beans to define property values --> <bean> <property name="age" value="11" /> </bean> </property></bean><bean id="son2"> <!-- The age property is not directly injected, but assigns the age property of the son in person to the age property of son2--> <property name = "Age"> <!-Tenga en cuenta que el PropertyPathFactoryBean se usa aquí-> <bean id = "persona.son.age"/> </property> </ bean>
Las propiedades de las clases de persona y SON se pueden ver desde el archivo de configuración, que ya no se da. El programa principal es el siguiente:
Prueba de clase pública {public static void main (string args []) {applicationContext ac = new ClassPathXMLApPlicationContext ("ApplicationContext.xml"); System.out.println ("Age =" + ac.getBean ("son2", son.class) .getage ()); }} Resultado de salida:
edad = 11
El valor de la propiedad de una instancia de Bean no solo puede inyectar otro bean, sino también definir directamente el valor de la propiedad de la instancia de Bean como una instancia de Bean. Esto también se realiza a través de PropertyPathFactoryBean. Agregue este párrafo al archivo de configuración anterior:
<bean id = "son1"> <!-Determine el bean de destino, indicando de qué frijol proviene el componente de son1-> <propiedad name = "targetBeanName" value = "persona" /> <!-Determine el atributo, que indica de qué propiedad de SON1 proviene de-> <Property Name = "Propertypath" Value = "Son" /> </ beon>
Ejecute la clase de prueba anterior y reemplace a SON2 con SON1, y el resultado es el mismo.
Inyectar el valor de campo de otros frijoles
A través de la clase FieldrievingFactoryBean, puede inyectar los valores de campo de otros frijoles en otros frijoles, o puede definir directamente un nuevo frijol. Aquí está el clip de configuración:
<bean id = "son"> <propiedad name = "edad"> <bean id = "java.sql.connection.transaction_serializable"/> </property> </bean>
El programa de prueba principal es similar a la definición anterior, y ya no se proporciona aquí, y los resultados de ejecución son los siguientes:
edad = 8
En esta configuración, el valor de la edad del objeto SON es igual al valor de java.sql.connection.transaction_serializable. En la definición anterior, al definir el frijol de fábrica de FieldRecievingFactoryBean, la ID especificada no es el identificador único de la instancia de Bean, sino la expresión del campo (es decir, el valor a sacar).
Nota: El campo puede ser estático o no estático. La expresión de campo especificada por el fragmento de configuración anterior es un valor de campo estático, por lo que se puede acceder directamente a través del nombre de la clase. Si el valor de campo no es estatal, se debe acceder a través de los frijoles que ya existen en el contenedor, es decir, la primera frase de la expresión de campo debe ser los frijoles que ya existen en el contenedor.
El valor de campo también se puede definir como una instancia de Bean, por ejemplo, agregue el siguiente párrafo al archivo de configuración:
<bean id = "edad"> <!-TargetClass Especifica la clase de destino donde se encuentra el campo-> <propiedad name = "targetClass" value = "java.sql.connection" /> <!-TargetField Especifica el nombre del campo-> <Property Name = "Targetfield" Value = "Transaction_Serializable" /> </ Beel>
Agregue la siguiente salida al programa principal:
System.out.println ("edad =" + ac.getBean ("edad"));
El resultado de la ejecución es el mismo que el anterior.
Al usar FieldRetrieVingFactoryBean para obtener el valor de campo, debe especificar las siguientes dos propiedades:
TargetClass o TargetObject: se usa para especificar la acumulación de destino o el objeto de destino donde se encuentra el valor de campo. Si el campo que desea obtener es estático, use TargetClass para especificar la acumulación de destino; Si el campo no es estatal, use TargetObject para especificar el objeto de destino.
Targetfield: especifica el nombre de campo de la clase de destino o objeto de destino
Si el campo es un campo estático, hay una forma más concisa de escribirlo:
<bean id = "edad"> <!-El valor especifica qué valor de dominio estático de qué clase-> <propiedad name = "staticfield" value = "java.sql.connection.transaction_serializable" /> < /bean>
Métodos que inyectan otros valores de retorno de los frijoles
A través del MethodInvokingFactoryBean Bean de fábrica, el valor de retorno del método de destino se puede inyectar en el valor de la propiedad del bean. Este bean de fábrica se utiliza para obtener el valor de retorno del método especificado. El método puede ser un método estático o un método de instancia; Este valor se puede inyectar en el atributo especificado de la instancia de Bean especificada o directamente definido como una instancia de Bean. Ver ejemplo:
<bean id = "valueGenerator" /> <bean id = "son1"> <propiedad name = "edad"> <!-Get Method Value de retorno: llame al método getValue de valueGenerator-> <bean> <propiedad name = "targetObject" ref = "valueGenerator" /> <Property Name = "TargetMethod" Value = "getValue" /> </ bean> < /Property> < / / /bean>
Aquí está el valueGenerator:
public class valueGenerator {public int getValue () {return 2; } public static int getStaticValue () {return 3;}} El programa de prueba aún imprime el valor de la edad en SON1, el código se omite y el resultado es el siguiente:
edad = 2
Si desea llamar a un método estático, modifique la configuración a:
<bean id = "son1"> <propiedad name = "edad"> <!-Get Method Value de retorno: llame al método getStaticValue de valueGenerator-> <bean> <propiedad name = "targetClass" valor = "com.abc.util.valueGenerator"/> <propiedad name = "targetMethod" value = "getStaticValue"/> </bean> </property> </</beay>
Los resultados de la prueba son:
edad = 3
Dado que Java admite la sobrecarga, solo dar el nombre del método no es suficiente para determinar qué método llamar. La configuración anterior se puede llamar con éxito porque ninguno de los métodos en ValueGenerator tiene parámetros. Si hay parámetros en el método, ¿cómo configurarlo? Incluya el siguiente contenido en el archivo de configuración:
<bean id = "sysprops"> <propiedad name = "targetClass" value = "java.lang.system" /> <Property name = "targetMethod" value = "getProperties" /> <bean> <bean id = "javaversion"> <!-señale el sysprops anterior-> <Nombre de propiedad de propiedad de propiedad " value = "getProperty"/> <!-Configurar parámetros aquí-> <Property Name = "Argumentos"> <!-Use el elemento de lista para enumerar múltiples parámetros del método de llamada-> <list> <valor> java.version </value> </list> </Property> <Bean>
En el ejemplo anterior, es equivalente a llamar al método getProperty de java.lang.system con "java.version" como parámetro. El valor de retorno creará un frijol llamado Javaversion. Es decir, equivalente a:
javaversion = java.lang.system.getProperty ("java.version");
Al igual que el campo en el artículo anterior, si el método a llamar es un método estático, también hay un método más conciso:
<bean id = "mybean"> <!-use la propiedad StaticMethod para especificar directamente el método de destino de la clase de destino-> <propiedad = "staticMethod" value = "com.abc.util.valuegenerator.getStaticValue" /> < /bean>
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.