Recuerda un extraño puntero nulo

Recibí una pregunta que decía que ocasionalmente habrá un puntero nulo después de que se inicie el servicio. De vez en cuando.

Antecedentes

El proyecto es un proyecto SpringBoot,

Según el error, la inyección del servicio es nula y, a continuación, el puntero es nulo durante la ejecución.

@Service("xxxService")
public class xxxService {

    @Autowired
    AService aService;


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

Representación del problema.

Ocasionalmente, los punteros nulos a veces son correctos y, a veces, punteros nulos después de que se inicia el servicio.

Solucionar problemas

Lo primero que viene a la mente es que el inicio es anormal. La inicialización de Spring Bean falló.

Inicie sesión en el servidor y compruebe el registro de inicio si el inicio es anormal. No hay excepción

Pero es obvio ver otro problema.

Cuando comienza el servicio. Spring Bean fue instanciado dos veces.

El problema fue inmediatamente evidente.

El problema

Visto el método principal.

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

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

Obviamente el programa se ha ejecutado dos veces. El frijol se instancia dos veces.

Entonces, ¿por qué Spring no crea una instancia del bean por segunda vez? ? ¿Es nulo el segundo bean instanciado?

Razón

Este es el proceso de inicialización de Spring.

Aquí hay dos ejecuciones, pero se ejecuta el mismo contenedor Spring y Bean se carga en el mismo contenedor Spring.

Pero juzgará si el Bean ha sido inicializado. Si se ha inicializado, no se inicializará.

Resolver

Eliminar una carrera ()

Resumen

Los novatos todavía tienen que entender más principios. Escribir código escribirá, pero los problemas de posicionamiento también son muy importantes,

Las dos instancias realizadas tan obviamente son invisibles. . .

Supongo que te gusta

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