O escopo de um feijão apátrida é uma instância singleton. Se injetarmos o feijão B do protótipo no feijão A de Singleton e esperamos que um novo feijão B possa ser retornado toda vez que o getBeanB () do feijão A é chamado, esse requisito não pode ser alcançado usando métodos tradicionais de injeção. Como a ação da injeção de feijões associados de singleton ocorre apenas uma vez, embora o escopo do feijão B seja o tipo de protótipo, o objeto retornado através do getBeanB () ainda é o feijão B que foi injetado no início.
Portanto, se você deseja devolver um novo Beanb toda vez que ligar para o Beana's getBeanB (), uma solução opcional é deixar o Beana implementar a interface BeanFactoryAware, para que você possa acessar o contêiner e implementá -lo da seguinte maneira.
Primeiro configure XML:
<bean id = "author" scope = "prototype"/> <bean id = "book" p: name = "véu"> </shean>
O escopo do autor de Bean está definido como protótipo.
A aula do livro implementa a interface BeanFactoryWare:
A classe pública Livro implementa o BeanFactoryAware {...@Substituirpublic void setBeanFactory (BeanFactory BeanFactory) lança beansexception {this.Factory = beanFactory;} public Author GetProTyPeauthor () {Return (Author) fator.getBean ("autor"); }}Testes de unidade:
ApplicationContext context; @beforemethodpublic void setup () lança exceção {context = new ClassPathXMLApplicationContext ("beans5-5.xml");}@testpublic void test () {book book = (book) context.getBean ("book"); System.out.println (book.getauthor (). Hashcode ()); System.out.println (book.getauthor (). Hashcode ()); System.out.println (book.getProTyPeauthor (). Hashcode ()); System.out.println (book.getProTyPeauthor (). Hashcode ());Resultados do teste
A partir dos resultados, podemos ver que apenas as instâncias do autor obtidas do BeanFactory são diferentes.
Esta implementação vincula o aplicativo à estrutura da mola. Existe uma solução melhor? Sim, é o método de injeção.
1 método de injeção
Os contêineres de mola dependem das bibliotecas do CGLIB, para que o bytecode da classe possa ser operado dinamicamente durante o tempo de execução, como criar dinamicamente subclasses ou classes de implementação de feijões.
Interface do BookInterface:
Public Interface BookInterface {Author getAuthor ();}Configuração XML:
<!-injeção de método-> <bean id = "author" scope = "prototype" p: name = "maugham"/> <bean id = "book2"> <lookup-method name = "getAuthor" bean = "autor"/> </bean>
Testes de unidade:
BookInterface Book = (BookInterface) Context.getBean ("Book2"); Assert.asserTequals ("Maugham", book.getauthor (). GetName ()); assert.assertTrue (book.getauthor (). Hashcode ()!Por meio desse método de configuração, a implementação dinâmica pode ser fornecida para a interface, e os feijões retornados dessa maneira são todas as novas instâncias.
Portanto, se você deseja obter um protótipo de feijão em um feijão singleton, pode usar a pesquisa para implementar o método de injeção.
2 Método de substituição
Na primavera, você pode usar um método de um certo feijão para substituir outro método de um feijão.
Suponha que exista um método getName () no livro para obter o título:
/*** Título do livro*/Nome da String Private; public String getName () {Nome de retorno;}Agora criamos um novo feijão, que implementa a interface MethodReplacer para substituir o método getName () no livro:
public class Book4 implementa MethodReplacer {@Override Public Object Reimplement (Object Obj, método do método, objeto [] args) lança jogável {return "Alive"; }}Configuração:
<bean id = "book3" p: name = "Bright Thousand Suns"> <Substituído-method name = "getName" replacer = "book4"/> </bean> <bean id = "book4"/>
teste:
Livro do livro = (livro) context.getBean ("Book3"); Assertequals ("Living", book.getName ()); Resumir
O exposto acima é a implementação do método de injeção ou substituição na estrutura da mola introduzida pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a todos a tempo!