O uso de arquivos XML para configurar nos arquivos de configuração do Spring está realmente pedindo à Spring para executar o código correspondente, por exemplo:
Usando o elemento <Bean> é realmente deixar a mola executar o construtor não parameétrico ou contendo parâmetro use o elemento <propriedade>, na verdade, para deixar a mola executar o método do setter uma vez
No entanto, os programas Java também podem ter outros tipos de declarações: chamando métodos getter, chamando métodos comuns, acessando campos de classes ou objetos etc. A primavera também fornece sintaxe de configuração correspondente para essas declarações:
Ligue para getter Método: Use PropertyPathFactoryBean
Chamando o valor arquivado de uma classe ou objeto: use fileDretrievingFactoryBean
Chamando um método normal: Use MethodInvingFactoryBean
Injetar os valores da propriedade de outros feijões
PropertyPathFactoryBean é usado para obter o valor da propriedade do feijão de destino (na verdade, o valor retornado chamando o método getter). O valor obtido pode ser injetado em outros feijões, ou um novo feijão pode ser definido diretamente. Consulte o seguinte arquivo de configuração:
<bean id = "pessoa"> <propriedade name = "idade" value = "30"/> <propriedade name = "filho"> <!-use feijões aninhados para definir valores de propriedades-> <ean> <nome da propriedade = "idade" value = "11"/> </bean> SON2-> <Propriedade name = "Age"> <!-Observe que o PropertyPathFactoryBean é usado aqui-> <bean id = "Person.son.age"/> </erouse> </i bean>
As propriedades das classes de pessoa e filho podem ser vistas no arquivo de configuração, que não é mais fornecido. O programa principal é o seguinte:
public class Test {public static void main (string args []) {ApplicationContext AC = novo ClassPathXMLApplicationContext ("ApplicationContext.xml"); System.out.println ("AGE =" + ac.getBean ("SON2", SON.CLASS) .GETAGE ()); }} Resultado da saída:
idade = 11
O valor da propriedade de uma instância do feijão pode não apenas injetar outro feijão, mas também define diretamente o valor da propriedade da instância do feijão como uma instância do feijão. Isso também é feito através do PropertyPathFactoryBean. Adicione este parágrafo ao arquivo de configuração acima:
<bean id = "SON1"> <!-Determine o feijão-alvo, indicando qual feijão o componente do SON1 vem de-> <propriedade name = "TargetBeanName" value = "pessoa" /> <!-Determine o atributo, indicando qual propriedade de SON1 vem de-> <nome da propriedade = "PropertyPath" Value = "Son" /> < /Bean>
Execute a classe de teste acima e substitua o SON2 por SON1, e o resultado é o mesmo.
Injetar o valor do campo de outros feijões
Através da classe FieldRetrievingFactoryBean, você pode injetar os valores de campo de outros feijões em outros feijões ou definir diretamente um novo feijão. Aqui está o clipe de configuração:
<bean id = "filho"> <nome da propriedade = "Age"> <bean id = "java.sql.connection.transaction_serializable"/> </propriedade> </i bean>
O programa principal de teste é semelhante à definição acima e não é mais fornecida aqui, e os resultados da execução são os seguintes:
idade = 8
Nesta configuração, o valor da idade do objeto SON é igual ao valor de java.sql.connection.Transaction_Serializable. Na definição acima, ao definir o feijão de fábrica FieldRetrievrievingFactoryBean, o ID especificado não é o identificador exclusivo da instância do feijão, mas a expressão do campo (ou seja, o valor a ser retirado).
Nota: O campo pode ser estático ou não estático. A expressão de campo especificada pelo trecho de configuração acima é um valor estático de campo, para que possa ser acessado diretamente através do nome da classe. Se o valor do campo não for estático, ele deve ser acessado através dos feijões que já existem no contêiner - ou seja, a primeira frase da expressão de campo deve ser os feijões que já existem no contêiner.
O valor do campo também pode ser definido como uma instância do feijão, por exemplo, adicione o parágrafo a seguir ao arquivo de configuração:
<bean id = "idade"> <!-TargetClass especifica a classe de destino em que o campo está localizado-> <propriedade name = "TargetClass" value = "java.sql.Connection" /> <!-Fargetfield especifica o nome do campo-> <Nome da propriedade "" Targetfield "=" Transaction_Serializable " /> < /Bean>
Adicione a seguinte saída ao programa principal:
System.out.println ("AGE =" + Ac.getBean ("Age"));
O resultado da execução é o mesmo que acima.
Ao usar o FieldretrievingFactoryBean para obter o valor do campo, você deve especificar as duas propriedades a seguir:
TargetClass ou TargetObject: Usado para especificar o acúmulo de destino ou o objeto de destino onde o valor do campo está localizado. Se o campo que você deseja obter for estático, use o TargetClass para especificar o acúmulo de destino; Se o campo não for estático, use o TargetObject para especificar o objeto de destino.
TargetField: especifica o nome de campo da classe de destino ou objeto de destino
Se o campo for um campo estático, existe uma maneira mais concisa de escrevê -lo:
<bean id = "idade"> <!-Valor especifica qual valor de domínio estático de qual classe-> <propriedade name = "staticfield" value = "java.sql.connection.transaction_serializable" /> </shean>
Métodos que injetam outros feijões retornam valores
Através do feijão MethodInvingFactoryBean, o valor de retorno do método de destino pode ser injetado no valor da propriedade do feijão. Este feijão de fábrica é usado para obter o valor de retorno do método especificado. O método pode ser um método estático ou um método de instância; Esse valor pode ser injetado no atributo especificado da instância do feijão especificado ou diretamente definido como uma instância de feijão. Veja o exemplo:
<bean id="valueGenerator" /><bean id="son1"> <property name="age"> <!-- Get method return value: call the getValue method of valueGenerator--> <bean > <property name="targetObject" ref="valueGenerator" /> <property name="targetMethod" value="getValue" /> </bean> </property></bean>
Aqui está o ValueGenerator:
classe pública ValueGenerator {public int getValue () {return 2; } public static int getStaticValue () {return 3;}} O programa de teste ainda imprime o valor da idade no SON1, o código é omitido e o resultado é o seguinte:
idade = 2
Se você deseja chamar um método estático, modifique a configuração para:
<bean id = "SON1"> <Nome da propriedade = "Age"> <!-Get Method Return Value: Ligue para o método getStaticValue do valueGenerator-> <Bean> <Propriedade name = "TargetClass" value = "com.abc.util.valueGenerator"/> <nome da propriedade "TargetMethod"/"GetStaticLee"/>
Os resultados dos testes são:
idade = 3
Como o Java suporta a sobrecarga, apenas dar o nome do método não é suficiente para determinar qual método chamar. A configuração acima pode ser chamada com sucesso, porque nenhum método no ValueGenerator possui parâmetros. Se houver parâmetros no método, como configurá -lo? Inclua o seguinte conteúdo no arquivo de configuração:
<bean id = "sysProps"> <propriedade name = "TargetClass" value = "java.lang.system" /> <propriedade name = "TargetMethod" value = "getProperties" /> <bean> <bean id = "TotingObject"> <!-Point para o sysProps acima "names" names "" value = "getProperty"/> <!-Configure parâmetros aqui-> <propriedade name = "argumentos"> <!-Use o elemento da lista para listar vários parâmetros do método de chamada-> <list> <value> java.version </value> </list> </oither> </bean>
No exemplo acima, é equivalente a chamar o método getProperty de java.lang.system com "java.version" como um parâmetro. O valor de retorno criará um feijão chamado Javaversion. Isto é, equivalente a:
javaversion = java.lang.system.getProperty ("java.version");
Como o campo no artigo anterior, se o método a ser chamado for um método estático, também existe um método mais conciso:
<bean id = "mybean"> <!-use a propriedade StaticMethod para especificar diretamente o método de destino da classe de destino-> <propriedade name = "staticmethod" value = "com.abc.util.valueGenerator.getstaticValue" /> </ Bean>
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.