Heim > Java > javaLernprogramm > Hauptteil

Einführung in die bedingte Beurteilung in Spring Boot (mit Code)

不言
Freigeben: 2019-04-11 13:14:08
nach vorne
3588 Leute haben es durchsucht

Der Inhalt dieses Artikels ist eine Einführung in die bedingte Beurteilung in Spring Boot (mit Code). Ich hoffe, er wird Ihnen als Referenz dienen.

Diese Bedingungen in Spring Boot

Spring Boot stellt uns eine Fülle von Bedingungen zur Verfügung, die es uns ermöglichen, ganz bequem Beans zum Container im Projekt hinzuzufügen. In diesem Artikel werden hauptsächlich die einzelnen Anmerkungen erläutert und ihre Verwendung mit Code veranschaulicht.

Alle ConditionalOnXXX-Anmerkungen können in einer Klasse oder Methode platziert werden. Wenn sich die Methode in einer Klasse befindet, wird bestimmt, ob alle @Bean-annotierten Methoden in der Klasse ausgeführt werden.

@Conditional

Die anderen bedingten Annotationen unten sind syntaktischer Zucker. Sie können ConditionalOnXXX mit der folgenden Methode anpassen.
Die bedingte Annotation ist wie folgt definiert und empfängt das Klassenarray, das die implementiert Bedingungsschnittstelle.

public @interface Conditional {
    Class extends Condition>[] value();
}
Nach dem Login kopieren
Nach dem Login kopieren

Die Bedingungsschnittstelle verfügt nur über eine Übereinstimmungsmethode, die das Ergebnis des Abgleichs zurückgibt.

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
Nach dem Login kopieren
Nach dem Login kopieren

Konfigurieren Sie die Bedingungen über das Betriebssystem, um Bean zu konfigurieren. Wenn Windows verwendet wird, wird das Person-Objekt von Bill instanziiert, und wenn Linux verwendet wird, wird das Person-Objekt von Linus instanziiert.

//LinuxCondition,为方便起见,去掉判断代码,直接返回true了
public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return true;
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
//WindowsCondition,为方便起见,去掉判断代码,直接返回false了
public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata metadata) {
        return false;
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private Integer age;
}
Nach dem Login kopieren
Nach dem Login kopieren
//配置类
@Configuration
public class BeanConfig {

    @Bean(name = "bill")
    @Conditional({WindowsCondition.class})
    public Person person1(){
        return new Person("Bill Gates",62);
    }

    @Bean("linus")
    @Conditional({LinuxCondition.class})
    public Person person2(){
        return new Person("Linus",48);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class AppTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);

    @Test
    public void test(){
        String osName = applicationContext.getEnvironment().getProperty("os.name");
        System.out.println("当前系统为:" + osName);
        Map<string> map = applicationContext.getBeansOfType(Person.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

Das Ausgabeergebnis:

Das aktuelle System ist: Mac OS & @ConditionalOnMissingBean
Diese beiden Anmerkungen beurteilen das Bean-Objekt im Bean-Container. Das verwendete Beispiel ist während der Konfiguration. Wenn festgestellt wird, dass keine Computerinstanz vorhanden ist, wird ein Backup-Computer instanziiert.

@Data
@AllArgsConstructor
@ToString
public class Computer {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
public class BeanConfig {
    @Bean(name = "notebookPC")
    public Computer computer1(){
        return new Computer("笔记本电脑");
    }

    @ConditionalOnMissingBean(Computer.class)
    @Bean("reservePC")
    public Computer computer2(){
        return new Computer("备用电脑");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
    @Test
    public void test1(){
        Map<string> map = applicationContext.getBeansOfType(Computer.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

BeanConfig ändern, wenn Sie das erste @Bean auskommentieren, wird der Backup-Computer instanziiert, andernfalls wird der Backup-Computer nicht instanziiert

@ConditionalOnClass & @ConditionalOnMissingClass

Diese Anmerkung bestimmt, ob eine bestimmte Klasse im Klassenpfad vorhanden ist. Als ich sie zum ersten Mal sah, wurde die Kompilierung nicht erfolgreich durchgeführt. Dies wird hauptsächlich zur Integration verwendet Wenn eine Komponente von Drittanbietern verwendet wird, wird sie automatisch konfiguriert, solange sich eine Klasse der Komponente im Klassenpfad befindet. Wenn Spring Boot Web beispielsweise die Ansichtskomponente automatisch konfiguriert, verwendet es Velocity. Thymeleaf oder Freemaker Dies ist die verwendete Methode.

Das Beispiel sind zwei Rüstungssätze A (heller Anzug) und B (dunkler Anzug). Wenn A nicht vorhanden ist, konfigurieren Sie B.

public interface Fighter {
    void fight();
}
public class FighterA implements Fighter {
    @Override
    public void fight() {
        System.out.println("使用光明套装");
    }
}
public class FighterB implements Fighter {
    @Override
    public void fight() {
        System.out.println("使用暗黑套装");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Van ist ein Samurai und benutzt Anzüge, um zu kämpfen

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Van {
    private Fighter fighter;
    public void fight(){
        fighter.fight();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
VanConfigA/B instanziiert Samurai

@Configuration
@ConditionalOnClass({FighterA.class})
public class VanConfigA {
    @Primary
    @Bean
    public Van vanA(){
        return new Van(new FighterA());
    }
}
@Configuration
@ConditionalOnClass({FighterB.class})
public class VanConfigB {
    @Bean
    public Van vanB(){
        return new Van(new FighterB());
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Testklasse, standardmäßig, wenn Anzüge AB im Klassenpfad sind, Beide Sätze werden geladen und A wird auf PRIMARY gesetzt. Wenn FightA.class in der Zielklasse gelöscht wird, wird nur Satz B geladen.

@SpringBootApplication
public class TestApp implements CommandLineRunner {
    @Autowired
    private Van van;
    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        //do something
       van.fight();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Versuchen Sie außerdem, die beiden VanConfigA/B zusammenzuführen und die Annotation ConditionalOnClass in die Methode einzufügen. Wenn Sie ein Paket löschen, tritt ein Fehler auf.

@ConditionalOnExpress

Bedingte Beurteilung basierend auf Ausdrücken. Diese Funktion kann in den meisten Fällen mit @ConditionalOnProperty verwendet werden. Der Ausdruck ist flexibler, da SpEL verwendet werden kann. Im Beispiel wird der Wert von test.enabled in den Eigenschaften beurteilt. BeanConfig beurteilt drei Arten von Booleschen Werten: Zeichenfolgen und Zahlen. Ich habe viele andere Methoden ausprobiert, aber keine davon funktioniert, z. B. die direkte Verwendung von ==. Es scheint, dass die konfigurierten Attribute als Zeichenfolgen behandelt werden.

@Data
public class TestBean {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnExpression("#{${test.enabled:true} }")
//@ConditionalOnExpression("'zz'.equalsIgnoreCase('${test.name2}')")
//@ConditionalOnExpression("new Integer('${test.account}')==1")
public class BeanConfig {
    @Bean
    public TestBean testBean(){
        return new TestBean("我是美猴王");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@SpringBootApplication
public class TestAppCommand implements CommandLineRunner {
    @Autowired
    private TestBean testBean;

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

    @Override
    public void run(String... args) throws Exception {
        System.out.println(testBean.getName());
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnProperty

eignet sich für die bedingte Beurteilung einer einzelnen Eigenschaft, während das obige @ConditionalOnExpress für komplexere Situationen geeignet ist, wie zum Beispiel den Korrelationsvergleich mehrerer Eigenschaften. Dieses Beispiel gibt auch drei Grundtypen bedingter Urteile an, aber es scheint, dass sie alle als Zeichenfolgen behandelt werden können...

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestBean {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnProperty(prefix = "test", name="enabled", havingValue = "true",matchIfMissing = false)
//@ConditionalOnProperty(prefix = "test", name="account", havingValue = "1",matchIfMissing = false)
//@ConditionalOnProperty(prefix = "test", name="name1", havingValue = "zz",matchIfMissing = false)
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean("我是美猴王");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@SpringBootApplication
public class TestAppCommand implements CommandLineRunner {
    @Autowired
    private TestBean testBean;
    public static void main(String[] args) {
        SpringApplication.run(TestAppCommand.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        System.out.println(testBean.getName());

    }
}
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnJava

Kann anhand der Java-Version beurteilt werden.

@Data
public class TestBean {
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(TestBean.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnResource

Die bedingte Beurteilung erfolgt basierend darauf, ob die angegebene Ressourcendatei vorhanden ist, z. B. die Beurteilung von ehcache.properties, um zu bestimmen, ob die ehcache-Komponente automatisch assembliert werden soll.

@Data
public class TestBean {
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnResource(resources = "classpath:application.yml")
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(TestBean.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnSingleCandidate

Ich habe noch nicht an das Anwendungsszenario gedacht: 1. Es gibt nur einen entsprechenden Bohnenbehälter. 2. Es gibt mehrere entsprechende Bohnen , aber PRIMARY wurde formuliert . Im Beispiel müssen Sie beim Zusammenstellen von BeanB den Assembly-Status von BeanA überprüfen, sodass BeanBConfig nach BeanAConfig eingestuft werden sollte. Sie können BeanAConfig ändern und die @Primary-Annotation entfernen oder die drei @Bean-Annotationen entfernen, BeanB wird jedoch nicht angezeigt instanziiert.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BeanA {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
public class BeanAConfig {

    @Bean
    @Primary
    public BeanA bean1(){
        return new BeanA("bean1");
    }
    @Bean(autowireCandidate = false)
    public BeanA bean2(){
        return new BeanA("bean2");
    }
    //@Bean(autowireCandidate = false)
    public BeanA bean3(){
        return new BeanA("bean3");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@Data
public class BeanB {
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@AutoConfigureAfter(BeanAConfig.class)
@ConditionalOnSingleCandidate(BeanA.class)
public class BeanBConfig {

    @Bean
    public BeanB targetBean(){
        return new BeanB();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanAConfig.class, BeanBConfig.class);

    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(BeanA.class);
        System.out.println(map);
        Map<string> map2 = context.getBeansOfType(BeanB.class);
        System.out.println(map2);
    }
}</string></string>
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnNotWebApplication & @ConditionalOnWebApplication

Bestimmen Sie, ob die aktuelle Umgebung eine Webanwendung ist.

Spalte







Diese Bedingungen im Spring Boot-Urteil



                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

Diese Bedingungen in Spring BootSpring Boot stellt uns eine Fülle von Bedingungen zur Verfügung, sodass wir sie sehr bequem verwenden können Projekt Fügen Sie Bohnen zum Container hinzu. In diesem Artikel werden hauptsächlich die einzelnen Anmerkungen erläutert und ihre Verwendung mit Code veranschaulicht. Alle ConditionalOnXXX-Anmerkungen können in einer Klasse oder Methode platziert werden. Wenn sich die Methode in einer Klasse befindet, wird bestimmt, ob alle @Bean-annotierten Methoden in der Klasse ausgeführt werden. @ConditionalDie anderen bedingten Annotationen unten sind syntaktischer Zucker. Sie können ConditionalOnXXX mit der folgenden Methode anpassen.

public @interface Conditional {
    Class extends Condition>[] value();
}
Nach dem Login kopieren
Nach dem Login kopieren
Die Bedingungsschnittstelle verfügt nur über eine Übereinstimmungsmethode, die das Ergebnis des Abgleichs zurückgibt.

public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
Nach dem Login kopieren
Nach dem Login kopieren
Konfigurieren Sie die Bedingungen über das Betriebssystem, um Bean zu konfigurieren. Wenn Windows verwendet wird, wird das Person-Objekt von Bill instanziiert, und wenn Linux verwendet wird, wird das Person-Objekt von Linus instanziiert.

//LinuxCondition,为方便起见,去掉判断代码,直接返回true了
public class LinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return true;
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
//WindowsCondition,为方便起见,去掉判断代码,直接返回false了
public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata metadata) {
        return false;
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private String name;
    private Integer age;
}
Nach dem Login kopieren
Nach dem Login kopieren
//配置类
@Configuration
public class BeanConfig {

    @Bean(name = "bill")
    @Conditional({WindowsCondition.class})
    public Person person1(){
        return new Person("Bill Gates",62);
    }

    @Bean("linus")
    @Conditional({LinuxCondition.class})
    public Person person2(){
        return new Person("Linus",48);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class AppTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);

    @Test
    public void test(){
        String osName = applicationContext.getEnvironment().getProperty("os.name");
        System.out.println("当前系统为:" + osName);
        Map<string> map = applicationContext.getBeansOfType(Person.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

Das Ausgabeergebnis:

Das aktuelle System ist: Mac OS & @ConditionalOnMissingBean

Diese beiden Anmerkungen beurteilen das Bean-Objekt im Bean-Container. Das verwendete Beispiel ist während der Konfiguration. Wenn festgestellt wird, dass keine Computerinstanz vorhanden ist, wird ein Backup-Computer instanziiert.

@Data
@AllArgsConstructor
@ToString
public class Computer {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
public class BeanConfig {
    @Bean(name = "notebookPC")
    public Computer computer1(){
        return new Computer("笔记本电脑");
    }

    @ConditionalOnMissingBean(Computer.class)
    @Bean("reservePC")
    public Computer computer2(){
        return new Computer("备用电脑");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
    @Test
    public void test1(){
        Map<string> map = applicationContext.getBeansOfType(Computer.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren
BeanConfig ändern, wenn Sie das erste @Bean auskommentieren, wird der Backup-Computer instanziiert, andernfalls wird der Backup-Computer nicht instanziiert

@ConditionalOnClass & @ConditionalOnMissingClass


Diese Anmerkung bestimmt, ob eine bestimmte Klasse im Klassenpfad vorhanden ist. Als ich sie zum ersten Mal sah, wurde die Kompilierung nicht erfolgreich durchgeführt. Dies wird hauptsächlich zur Integration verwendet Wenn eine Komponente von Drittanbietern verwendet wird, wird sie automatisch konfiguriert, solange sich eine Klasse der Komponente im Klassenpfad befindet. Wenn Spring Boot Web beispielsweise die Ansichtskomponente automatisch konfiguriert, verwendet es Velocity. Thymeleaf oder Freemaker Dies ist die verwendete Methode.

Das Beispiel sind zwei Rüstungssätze A (heller Anzug) und B (dunkler Anzug). Wenn A nicht vorhanden ist, konfigurieren Sie B.

public interface Fighter {
    void fight();
}
public class FighterA implements Fighter {
    @Override
    public void fight() {
        System.out.println("使用光明套装");
    }
}
public class FighterB implements Fighter {
    @Override
    public void fight() {
        System.out.println("使用暗黑套装");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Van ist ein Samurai und benutzt Anzüge, um zu kämpfen

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Van {
    private Fighter fighter;
    public void fight(){
        fighter.fight();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
VanConfigA/B instanziiert Samurai

@Configuration
@ConditionalOnClass({FighterA.class})
public class VanConfigA {
    @Primary
    @Bean
    public Van vanA(){
        return new Van(new FighterA());
    }
}
@Configuration
@ConditionalOnClass({FighterB.class})
public class VanConfigB {
    @Bean
    public Van vanB(){
        return new Van(new FighterB());
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Testklasse, standardmäßig, wenn Anzüge AB im Klassenpfad sind, Beide Sätze werden geladen und A wird auf PRIMARY gesetzt. Wenn FightA.class in der Zielklasse gelöscht wird, wird nur Satz B geladen.
@SpringBootApplication
public class TestApp implements CommandLineRunner {
    @Autowired
    private Van van;
    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        //do something
       van.fight();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Versuchen Sie außerdem, die beiden VanConfigA/B zusammenzuführen und die Annotation ConditionalOnClass in die Methode einzufügen. Wenn Sie ein Paket löschen, tritt ein Fehler auf.

@ConditionalOnExpress

Bedingte Beurteilung basierend auf Ausdrücken. Diese Funktion kann in den meisten Fällen mit @ConditionalOnProperty verwendet werden. Der Ausdruck ist flexibler, da SpEL verwendet werden kann. Im Beispiel wird der Wert von test.enabled in den Eigenschaften beurteilt. BeanConfig beurteilt drei Arten von Booleschen Werten: Zeichenfolgen und Zahlen. Ich habe viele andere Methoden ausprobiert, aber keine davon funktioniert, z. B. die direkte Verwendung von ==. Es scheint, dass die konfigurierten Attribute als Zeichenfolgen behandelt werden.

@Data
public class TestBean {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnExpression("#{${test.enabled:true} }")
//@ConditionalOnExpression("'zz'.equalsIgnoreCase('${test.name2}')")
//@ConditionalOnExpression("new Integer('${test.account}')==1")
public class BeanConfig {
    @Bean
    public TestBean testBean(){
        return new TestBean("我是美猴王");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@SpringBootApplication
public class TestAppCommand implements CommandLineRunner {
    @Autowired
    private TestBean testBean;

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

    @Override
    public void run(String... args) throws Exception {
        System.out.println(testBean.getName());
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnProperty

eignet sich für die bedingte Beurteilung einer einzelnen Eigenschaft, während das obige @ConditionalOnExpress für komplexere Situationen geeignet ist, wie zum Beispiel den Korrelationsvergleich mehrerer Eigenschaften. Dieses Beispiel gibt auch drei Grundtypen bedingter Urteile an, aber es scheint, dass sie alle als Zeichenfolgen behandelt werden können...

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestBean {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnProperty(prefix = "test", name="enabled", havingValue = "true",matchIfMissing = false)
//@ConditionalOnProperty(prefix = "test", name="account", havingValue = "1",matchIfMissing = false)
//@ConditionalOnProperty(prefix = "test", name="name1", havingValue = "zz",matchIfMissing = false)
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean("我是美猴王");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@SpringBootApplication
public class TestAppCommand implements CommandLineRunner {
    @Autowired
    private TestBean testBean;
    public static void main(String[] args) {
        SpringApplication.run(TestAppCommand.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        System.out.println(testBean.getName());

    }
}
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnJava

Kann anhand der Java-Version beurteilt werden.

@Data
public class TestBean {
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(TestBean.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren
@ConditionalOnResource

Die bedingte Beurteilung erfolgt basierend darauf, ob die angegebene Ressourcendatei vorhanden ist, z. B. die Beurteilung von ehcache.properties, um zu bestimmen, ob die ehcache-Komponente automatisch assembliert werden soll.

@Data
public class TestBean {
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@ConditionalOnResource(resources = "classpath:application.yml")
public class BeanConfig {

    @Bean
    public TestBean testBean(){
        return new TestBean();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);

    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(TestBean.class);
        System.out.println(map);
    }
}</string>
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnSingleCandidate

这个还没有想到应用场景,条件通过的条件是:1 对应的bean容器中只有一个 2.对应的bean有多个,但是已经制定了PRIMARY。例子中,BeanB装配的时候需要看BeanA的装配情况,所以BeanBConfig要排在BeanAConfig之后.可以修改BeanAConfig,将@Primary注解去掉,或者把三个@Bean注解去掉,BeanB就不会实例化了。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BeanA {
    private String name;
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
public class BeanAConfig {

    @Bean
    @Primary
    public BeanA bean1(){
        return new BeanA("bean1");
    }
    @Bean(autowireCandidate = false)
    public BeanA bean2(){
        return new BeanA("bean2");
    }
    //@Bean(autowireCandidate = false)
    public BeanA bean3(){
        return new BeanA("bean3");
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
@Data
public class BeanB {
}
Nach dem Login kopieren
Nach dem Login kopieren
@Configuration
@AutoConfigureAfter(BeanAConfig.class)
@ConditionalOnSingleCandidate(BeanA.class)
public class BeanBConfig {

    @Bean
    public BeanB targetBean(){
        return new BeanB();
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
public class TestApp {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanAConfig.class, BeanBConfig.class);

    @Test
    public void test(){
        Map<string> map = context.getBeansOfType(BeanA.class);
        System.out.println(map);
        Map<string> map2 = context.getBeansOfType(BeanB.class);
        System.out.println(map2);
    }
}</string></string>
Nach dem Login kopieren
Nach dem Login kopieren

@ConditionalOnNotWebApplication & @ConditionalOnWebApplication

判断当前环境是否是Web应用。

  • Einführung in die bedingte Beurteilung in Spring Boot (mit Code)


你可能感兴趣的



评论                                                    



载入中...

显示更多评论


Das obige ist der detaillierte Inhalt vonEinführung in die bedingte Beurteilung in Spring Boot (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage