Ausführliche Interpretation der Verwendung der Annotation @value durch Springboot zum Einfügen statischer Variablen

Hintergrund

Eine der bequemeren Funktionen bei der Verwendung von Springboot ist die Variableninjektion. Mithilfe der @value-Annotation können Sie einfach Variablen aus der Konfigurationsdatei in den Code einfügen.

Während des Verwendungsprozesses wurde jedoch ein Problem entdeckt. @value unterstützt statische Variablen nicht sehr gut, daher wurde in diesem Artikel untersucht, wie statische Variablen eingefügt werden.

Beginnen Sie mit der Lösung von Problemen

1. Einfaches Beispiel für die Injektion einer statischen Variablen @value

(1) Klasse A (statische Variablen definieren, um Attributwerte einzufügen)

In dieser Klasse fügen wir den Wert der Eigenschaft „jdbc.url“ in die statische Variable „url“ ein, die in der MyComponent-Klasse definiert ist. Das geht ganz einfach

Beachten Sie, dass die setUrl-Methode nicht statisch sein kann

@Component
public class MyComponent {
    public static String url;

    @Value("${jdbc.url}")
    private void setUrl(String url) {
        MyComponent.url = url;
    }
}

2. Was passiert, wenn die Variable von anderen Klassen im statischen Codeblock referenziert werden muss?

(2) Klasse B (verweisen Sie auf den Codeblock der Klasse A über einen statischen Block)

In dieser Klasse verwenden wir einen statischen Block, um auf die statische Variable „URL“ der Klasse A zu verweisen.

@Component
public class AnotherComponent {
    static {
        // 静态块内访问A类的静态变量
        System.out.println(MyComponent.url);
    }
}

(3) Stellen Sie die Reihenfolge der Instanziierung der Klassen A und B sicher

SpringBoot-Startklasse (fügen Sie eine Instanz von Klasse A ein und stellen Sie sicher, dass Klasse A vor Klasse B initialisiert wird):

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private MyComponent myComponent;

    @Autowired
    private AnotherComponent anotherComponent;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // 这里可以访问MyComponent的实例和AnotherComponent的静态代码块
    }
}

Guess you like

Origin blog.csdn.net/Mint6/article/details/130309979