下面來介紹如何使用@Condition
- public class TestCondition implements Condition
- {
- /**
- * 只有返回true,才會啟用配置
- */
- public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
- {
- return true;
- }
- }
@Conditional(TestCondition.class)
這句代碼可以標注在類上面,表示該類下面的所有@Bean都會啟用配置,也可以標注在方法上面,只是對該方法啟用配置。
spring框架還提供了很多@Condition給我們用,當然總結用語哪種好理解,看給位讀者嘍
@ConditionalOnBean(僅僅在當前上下文中存在某個對象時,才會實例化一個Bean)
@ConditionalOnClass(某個class位於類路徑上,才會實例化一個Bean)
@ConditionalOnExpression(當表達式為true的時候,才會實例化一個Bean)
@ConditionalOnMissingBean(僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean)
@ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean)
@ConditionalOnNotWebApplication(不是web應用)
后續會繼續補充
另一種總結
@ConditionalOnClass:該注解的參數對應的類必須存在,否則不解析該注解修飾的配置類;
@ConditionalOnMissingBean:該注解表示,如果存在它修飾的類的bean,則不需要再創建這個bean;可以給該注解傳入參數例如@ConditionOnMissingBean(name = "example"),這個表示如果name為“example”的bean存在,這該注解修飾的代碼塊不執行。
@ConditionalOnMissingBean:該注解表示,如果存在它修飾的類的bean,則不需要再創建這個bean;可以給該注解傳入參數例如@ConditionOnMissingBean(name = "example"),這個表示如果name為“example”的bean存在,這該注解修飾的代碼塊不執行。
接上文
condition自定義聲明
public class InitConditional implements Condition{ @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { //判斷是否已經包含了amazonTest Bean Boolean bol = conditionContext.getBeanFactory().containsBean("amazonTest"); return bol; } }
使用自定義的Conditional
@Component @Conditional(InitConditional.class) public class AmazonTest { @Autowired private AmazonProperties amazonProperties; public void testGet(){ System.out.println(" testGet Associated"); System.out.println(amazonProperties.getAssociateId()); } }
WelcomeController 與 AmazonTest關聯,使用ConditionOnBean(如果條件的bean存在,當前的bean才會被聲明)
@Component @ConditionalOnBean(AmazonTest.class) public class WelcomeController { private static final Logger logger = LoggerFactory.getLogger(WelcomeController.class); private AppProperties app; private GlobalProperties global; @Autowired public void setApp(AppProperties app) { this.app = app; } @Autowired public void setGlobal(GlobalProperties global) { this.global = global; } public void testWelcome(){ String appProperties = app.toString(); String globalProperties = global.toString(); System.out.println(appProperties); System.out.println(globalProperties); } }
main測試文件入口
public static void main(String[] args) { ConfigurableApplicationContext configurableApplicationContext =SpringApplication.run(DemoApplication.class, args); //bean自動注冊,根據bean的名字獲取Bean AmazonProperties amazonProperties = (AmazonProperties) configurableApplicationContext.getBean("amazonProperties"); System.out.println(amazonProperties.getAssociateId()); Boolean aBooleanWelcomeController = configurableApplicationContext.containsBean("welcomeController"); if(!aBooleanWelcomeController){ System.out.println(" welcomeController init fail"); }else{ WelcomeController welcomeController = (WelcomeController) configurableApplicationContext.getBean("welcomeController"); System.out.println(" welcomeController init Success"); } Boolean aBooleanAmazonTest = configurableApplicationContext.containsBeanDefinition("amazonTest"); if(!aBooleanAmazonTest){ System.out.println(" amazonTest init fail"); }else{ AmazonTest amazonTest = (AmazonTest) configurableApplicationContext.getBean("amazonTest"); System.out.println(" amazonTest init Success"); } }