Lembre-se de um ponteiro nulo estranho

Recebi uma pergunta dizendo que ocasionalmente haverá um ponteiro nulo após o início do serviço. Ocasional.

Antecedentes

O projeto é um projeto SpringBoot,

De acordo com o erro, a injeção de serviço é nula e o ponteiro é nulo durante a execução.

@Service("xxxService")
public class xxxService {

    @Autowired
    AService aService;


    public void exec(){
        aService.run();//这里抛了空指针
    }
}

Representação do problema

Às vezes, os ponteiros nulos às vezes são aceitáveis ​​e, às vezes, nulos após o início do serviço.

Solucionar problemas

A primeira coisa que vem à mente é que a inicialização é anormal. Falha na inicialização do Spring Bean.

Faça logon no servidor e verifique o log de inicialização se a inicialização estiver anormal. Não há exceção.

Mas é óbvio ver outro problema.

Quando o serviço é iniciado. O Spring Bean foi instanciado duas vezes.

O problema foi imediatamente aparente.

O problema

Visualizou o método principal.

public class SpringMain{
    public static void main(String[] args){
        //.....略过中间逻辑

        application.run();
        //......略过中间逻辑
        application.run();
    }
}

Obviamente, o programa foi executado duas vezes. O feijão é instanciado duas vezes.

Então, por que o Spring não instancia o bean pela segunda vez? ? O segundo bean instanciado é nulo?

Razão

Este é o processo de inicialização do Spring.

Existem duas execuções aqui, mas o mesmo contêiner Spring é executado e o Bean é carregado no mesmo contêiner Spring.

Mas ele julgará se o Bean foi inicializado. Se foi inicializado, não será inicializado.

Resolver

Remover uma corrida ()

Sumário

Os iniciantes ainda precisam entender mais princípios. Escrever código escreverá, mas problemas de posicionamento também são muito importantes,

As duas instanciações executadas tão obviamente são invisíveis. . .

Acho que você gosta

Origin www.cnblogs.com/ElEGenT/p/12708742.html
Recomendado
Clasificación