Objetivo definitivo
Deixe -me descrever brevemente o problema que este artigo deseja resolver: como não usar mais o Spring para criar instâncias de feijão na primavera, mas transfira o processo de criação de feijões para os desenvolvedores.
Pensamento claro
Como criar uma instância de feijão:
1) através do construtor (com ou sem parâmetros)
Método: <bean id=""/>
2) através do método de fábrica estática
Método: <bean id="" factory-method="静态工厂方法"/>
Nota: a instância da classe de fábrica não foi criada
3) Através do método da fábrica de instância (método não estático)
Caminho:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Nota: a instância da classe de fábrica é criada
Método prático
Exemplo 1 :
precisar:
1 Não quero instanciar o feijão quando o bean.xml estiver carregado, mas quero separar o bean.xml carregado do objeto instanciado.
2 Implementar o feijão Singleton
Nas situações acima, o feijão pode ser criado através do método de fábrica.
Dessa forma, quando o bean.xml é carregado, o feijão não será instanciado diretamente, mas só começará a ser realmente instanciado quando o método referido pelo método de fábrica for chamado.
Implementação: Crie um Bean Singleton através do Spring Factory-Method
Primeiro, crie um objeto Singleton através de uma classe interna estática
pacote com.spring.test.FactoryMethod; Public Class Stage {public void perform () {System.out.println ("Show Start ..."); } private STAGE () {} classe estática privada StagesingLeondOholder {estático de estágio = new Stage (); } estático público estático getInstance () {return stagesingLetoneholder.instance; }}Especifique o método de carregamento no arquivo de configuração da mola GetInstance
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-innsthance" xmlns = "http://wwwwwwwwwwwww.springrance" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-bans-3.0.xsd"> <ban> <Bestage "fábrica
Obtenha a instância ligando para feijões no contexto do aplicativo
pacote com.spring.test.factorymethod; importar org.springframework.context.applicationContext; importar org.springframework.context.support.classpathphxmlapplicationContext; public class Test {public static void main (string [] args) {aplicação ClassPathXMLApplicationContext ("bean.xml"); Estágio de estágio = ((estágio) ctx.getBean ("testage")); //. GetInstance (); stage.perform (); }}Resultados da execução
24 de janeiro de 2015 18:38:18 Org.springframework.context.support.abstractapplicationContext PrepareRefresh Informações: refrescante org.springframework.context.support.classpathxmlapplicationContext@512dbd1a: startup [startup [saturup [satup 1815: startUppporp.classpathxmlapplicationContext@512dbd1a: startup [startup [saturup [saturppatup.n15; Raiz do contexto Hierarchyjan 24 de 2015 18:38:19 org.springframework.beans.factory.xml.xmlbeanndefinitionReReader LoadBeanDefinitions Informações: Carregando as definições xml de grão do recurso de caminho [bean.xml] JANEIRO 24, 2015: 18:17 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons information: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2d1879ea: defining beans [duke,sonnet29,poeticDuke, theStage]; Raiz da fábrica O desempenho da hierarquia começa ...
Introdução ao feijão de criação de métodos de fábrica
1. Crie um feijão usando um método de fábrica estática
Ao criar uma instância do feijão usando o método de fábrica estática, o atributo de classe também deve ser especificado, mas neste momento o atributo de classe não é a classe de implementação que especifica a instância do feijão, mas a classe de fábrica estática. Porque a primavera precisa saber qual fábrica usar para criar a instância do feijão. Além disso, você precisa usar método de fábrica para especificar o nome do método de fábrica estática. A primavera chamará o método de fábrica estática (pode conter um conjunto de parâmetros) para retornar uma instância do feijão. Depois que a instância especificada do feijão é obtida, as etapas de processamento após a mola são exatamente as mesmas que a criação da instância do feijão usando métodos comuns. Deve-se notar que, ao usar métodos estáticos de fábrica para criar feijões, esse método de fábrica deve ser estático. Esta passagem parece um pouco tonto, sem dizer muito, adicione o código:
Primeiro defina uma interface, e o método estático produzirá uma instância da interface:
Public Interface Animal {public void SayHello ();}Aqui estão duas classes de implementação da interface:
classe pública Cat implementa Animal {private String msg; // O método do setter exigido durante a injeção de dependência public void setmsg (string msg) {this.msg = msg; } @Override public void SayHello () {System.out.println (msg + ", meow ~ meow ~"); }} classe pública Dog implementa Animal {Private String msg; // O método do setter exigido durante a injeção de dependência public void setmsg (string msg) {this.msg = msg; } @Override public void SayHello () {System.out.println (msg + ", forte ~ forte ~"); }}A fábrica animal de formação abaixo contém um método estático de getAnimal, que determinará qual objeto criar com base nos parâmetros passados. Este é um padrão típico de design de fábrica estática.
public clas animalfactory {public estático getAnimal (tipo string) {if ("cat" .equalsignorecase (tipo)) {return cat (); } else {return new Dog (); }}}Se você precisar especificar que a primavera use o AnimalFactory para gerar objetos animais, você pode configurar o seguinte no arquivo de configuração da mola:
<!-Configure o método getanimal do getAnimalFactory para gerar gato-> <bean id = "cat" fábrica-method = "getanimal"> <!-Configure os parâmetros do método de fábrica estática, o método getanimal gerará objetos de cat-type-> <Constructor-ARG TUDE = " name = "msg" value = "cat" /> </ean> <!-configure o método getanimal do getAnImalFactory para gerar cachorro-> <bean id = "cão" fábrica-method = "getanimal"> <!-Configurar os parâmetros do método de fábrica estática, o método getAnimal gerará como gerar dog-TYP. Propriedades injetadas através do setter-> <propriedade name = "msg" value = "cão" /> </shean>
A partir da configuração acima, podemos ver que a classe e o método de fábrica das duas configurações de gato e cão são exatamente iguais, porque ambas as instâncias são geradas usando a mesma classe de fábrica estática e o mesmo método de fábrica estática. É apenas que os parâmetros especificados para esse método de fábrica estática são diferentes, use o elemento <construtor-arg /> para especificar parâmetros para o método de fábrica estática.
O método do programa principal para obter duas instâncias de feijão que o gato e o cão permanece inalterado. Você só precisa ligar para getBean () do recipiente de mola:
public class Test {public static void main (string args []) {ApplicationContext context = new ClassPathXMLApplicationContext ("ApplicationContext.xml"); Animal A1 = context.getBean ("Cat", Animal.class); A1.sayhello (); Animal A2 = context.getBean ("cão", animal.class); A2.Sayhello (); }}Resultado da saída:
<code> gato, meow ~ meow ~ cachorro, forte ~ forte ~ </code>
Ao criar uma instância usando um método estático de fábrica, você deve fornecer a classe de fábrica e o método estático de fábrica que gera a instância. Ao criar uma instância através de um método estático de fábrica, você precisa fazer as seguintes alterações no arquivo de configuração da mola;
O atributo de classe não é a classe de implementação da instância do feijão, mas a classe estática de fábrica que gera a instância do feijão
Use o método de fábrica para especificar um método estático de fábrica para produzir uma instância de feijão
Se o método estático de fábrica requer parâmetros, use o elemento <construtor-arg /> para configurá-lo
Quando especificarmos que a primavera usa um método de fábrica estática para criar uma instância do feijão, a primavera analisa primeiro o arquivo de configuração e chama o método estático da fábrica da classe de fábrica estática através da reflexão com base nas informações especificadas pelo arquivo de configuração e usamos o valor de retorno do método de fábrica estática como a instância do feijão. Nesse processo, a primavera não é mais responsável por criar uma instância de feijão, e a instância do feijão é fornecida pelo método estático de fábrica fornecido pelo usuário.
2. Crie um feijão usando o método de fábrica de instância
O método de fábrica da instância é apenas um pouco diferente do método de fábrica estática: chamar o método estático de fábrica requer apenas o uso da classe de fábrica e chamar o método da fábrica de instância deve usar a instância da fábrica. Portanto, existe apenas uma diferença na configuração da mola: configure o método estático de fábrica para especificar a classe estática de fábrica e configurar o método da fábrica de instância para especificar a instância da fábrica. O mesmo exemplo acima muda AnimalFactory para:
public clas animalfactory {public animal getAnimal (tipo de string) {// aqui, a palavra -chave estática é removida apenas se ("cat" .equalsignorecase (type)) {return Cat (); } else {return new Dog (); }}}O arquivo de primavera é modificado para:
<!-Configure a classe de fábrica primeiro-> <bean id = "AnimalFactory" /> <!-Aqui usamos o Factory-Bean para especificar o objeto de classe de fábrica da instância-> <bean id = "cat" factory-bean = "animalfactory" fábrica-method = "getAnimal"> <!-também especifique os parâmetros de fábrica "Methods-> value = "Cat" /> </ Bean> <bean id = "cão" factory-bean = "animalfactory" factory-method = "getanimal"> <construtor-arg value = "cão" /> <names name = "msg" value = "cão" /> </ Bean>
A classe de teste não precisa ser modificada, os resultados da saída são os mesmos acima.
Em muitos casos, <bean id = "bean1" class = "..." /> é usado para definir um feijão. Dessa forma, a primavera chamará o construtor sem parâmetros padrão para criar uma instância do feijão. Além disso, você também pode usar a fábrica para criar instâncias de feijão para separar a criação e o uso do feijão e entregar o trabalho de criação de feijão à fábrica para concluir.
Existem três maneiras de configurar o feijão de fábrica.
Interface abstrata:
interface pública imusicbox {public void play (); } 1. Obtenha exemplos de feijão para o método de fábrica estática
Categoria de fábrica:
public class MusicBoxFactory {public static iMusicbox CreateMusicBox () {retorna new iMusicBox () {public void play () {System.out.println ("tocar piano ..."); }}; }}Arquivo de configuração:
<bean id = "musicbox" factory-method = "createemusicbox" />
Classe de teste:
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXMLApplicationContext ("Bean-config.xml"); IMusicBox musicbox = (iMusicBox) ctx.getBean ("musicbox"); MusicBox.Play (); }2. O método da instância da fábrica obtém a instância do feijão
Categoria de fábrica:
public class MusicBoxFactory {public iMusicBox CreateMusicBox () {// Nenhuma modificação estática retorna new iMusicBox () {public void play () {System.out.println ("tocar piano ..."); }}; }}Arquivo de configuração:
<bean id = "FactoryBean" /> <bean id = "musicbox" factory-bean = "factorybean" fábrica-method = "createmusicbox" />
O atributo "Factory-Bean" especifica o feijão da fábrica e o atributo "Method Method" especifica o método da fábrica para obter a instância do feijão.
Classe de teste:
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXMLApplicationContext ("Bean-config.xml"); IMusicBox musicbox = (iMusicBox) ctx.getBean ("musicbox"); MusicBox.Play (); } 3. A classe de fábrica implementa Org.springframework.beans.factory.facotrybean Interface
Categoria de fábrica:
importar org.springframework.beans.factory.factoryBean; public class MusicBoxFactory2 implementa a FactoryBean {public Object getObject () lança exceção {retorna new iMusicBox () {public void play () {System.out.println ("Toque piano ..."); }}; } classe pública getObjectType () {return iMusicBox.class; } public boolean Issingleton () {return false; }}Arquivo de configuração:
<bean id = "musicbox"/>
Classe de teste:
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXMLApplicationContext ("Bean-config.xml"); // não adicionado e retorna o "Produto" do IMusicBox MusicBox da fábrica = (iMusicBox) ctx.getBean ("MusicBox"); MusicBox.Play (); // Adicionar e retorna o objeto de instância da classe de fábrica obj = ctx.getbean ("& musicbox"); System.out.println (obj.getclass (). GetName ()); }As classes que implementam a interface FactoryBean não serão consideradas feijões comuns, a primavera os detectará automaticamente e chamará o método GetObject para obter a instância do feijão.
Resumir
Este é o fim da introdução às instâncias de feijão instanciais nos métodos de fábrica de primavera. Se você tiver alguma falha, pode deixar uma mensagem para apontar. Obrigado amigos pelo seu apoio para este site!