Este artigo estuda principalmente o conteúdo relevante da ordem de execução de carregamento do feijão da primavera, como segue.
Fonte do problema:
Há um feijão que é um e um feijão que é B. Quando a é instanciado, você deseja atribuir um nome de propriedade a um método divertido ao valor de retorno de B.
Se for apenas escrito em A:
private B b;
private String name = b.funb();
Um erro será relatado e o NullPointException é porque B não foi definido no momento, por isso é nulo.
A solução é a seguinte código e, ao mesmo tempo, aprenda a ordem de execução de inicializar obean, método de construção de objetos e método init na primavera.
Public Classe A implementa InicializandoBean {private B B; Nome da String Private; // = B.Funb (); public void setB (b b) {System.out.println ("A.Setb Initialized"); this.b = b;} public a () {System.out.println ("A Initialed");} public void init () {System.out.println ("init"); this.name = b.funb ();}@substituir public string tostring () {return super.toString () + this.name;} public void depoispropertiesset () lança exceção {// de fato, também é possível colocá -lo aqui // this.name = b.funb (); System.out.println ("AfterPropertiesset");}} public class B {public String FUNB () {System.out.println ("Funb"); retornar "B.Funb";} public b () {System.out.println ("B Inicialed");}}}Arquivo de configuração da primavera
<Beans default-autowire = "byname"> <bean id = "a" init-method = "init"> </shean> <bean id = "b"> </shean> </ Beans>
Código de teste:
public static void main (string [] args) {ApplicationContext context = new FileSystemXMLApplicationContext ("src/testspring/bean.xml"); a a = (a) context.getbean ("a"); system.out.println (a);}A saída do programa é:
Um início
B Iniciado
A.Setb Iniciado
Afterpropertiesset
init
FUNB
[email protected]
A partir daqui, podemos ver que o atributo de nome de A está definido com sucesso para o valor de retorno do método Funb de B quando o feijão é carregado. O ponto principal é usar o init-method para implementá-lo.
A ordem de carregamento também pode ser vista como:
Primeiro construtor -> então B Defina o método injeção -> Inicializando o Método AfterPropertiEsset -> Método Init -Method
O conteúdo a seguir é extraído do livro, mas achei que, mesmo que o tire uma vez, meu entendimento de seu conteúdo será mais aprofundado!
1. O processo do feijão de montagem da mola
1. Instanciação;
2. Defina o valor do atributo;
3. Se a interface do BeannameAware for implementada, ligue para o SetBeanName para definir o ID ou nome do feijão;
4. Se você implementar a interface BeanFactoryAware, ligue para o SetBeanFactory para definir o BeanFactory;
5. Se o ApplicationContextAwe for implementado, ligue
6. Chame o método de pré-inicialização do BEANPOSTPROCESSOR;
7. Ligue para o método AfterPropertiEsset () de InicializandoBean;
8. Chame o método de init-method personalizado;
9. Chame o método de pós-inicialização do beanPostProcessor;
Processo de desligamento de contêineres de primavera
1. Chamada DisposableBean Destroy ();
2. Chame o método de destruição-method personalizado;
1. Feijão único
carregar
1. Instanciação;
2. Defina o valor do atributo;
3. Se a interface do BeannameAware for implementada, ligue para o SetBeanName para definir o ID ou nome do feijão;
4. Se você implementar a interface BeanFactoryAware, ligue para o SetBeanFactory para definir o BeanFactory;
5. Se o ApplicationContextAwe for implementado, ligue
6. Chame o método de pré-inicialização do BEANPOSTPROCESSOR;
7. Ligue para o método AfterPropertiEsset () de InicializandoBean;
8. Chame o método de init-method personalizado;
9. Chame o método de pós-inicialização do beanPostProcessor;
Recipiente de primavera Close
1. Chamada DisposableBean Destroy ();
2. Chame o método de destruição-method personalizado;
2. A ordem de vários feijões
Priorizar o carregamento do feijão de implementação do BEANPOSTPROCESSOR
Em ordem de definição de feijão, a ordem de carregamento de feijão (mesmo que haja substituição de ID ao carregar vários arquivos de mola)
Quando "Definir valor do atributo" (Etapa 2), ao encontrar REF, o feijão correspondente ao ID do REF é carregado primeiro após "instanciação" (etapa 1).
A subclasse do AbstractFactoryBean chamará o método CreateInstance após a etapa 6 e, em seguida, o método GetObjectType será chamado.
A classe BeanFactoryutils também alterará a ordem de carregamento dos grãos.
O exposto acima é todo o conteúdo deste artigo sobre a ordem de implementação do carregamento do feijão da primavera, e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!