您好,登錄后才能下訂單哦!
前言
最近在學習spring,抽空會將學習的知識總結下面,本文我們會接觸spring 4的新功能:@Conditional注解。在之前的spring版本中,你處理conditions只有以下兩個方法:
讓我們分別看看以上兩者,在來理解spring 4帶來的@Conditional注解。
Spring Expression Language(SPeL)
SPeL的三元標識符(IF-THEN-ELSE)可以在spring配置文件中用來表達條件語句。
<bean id="flag"> <constructor-arg value="#{systemProperties['system.propery.flag'] ?: false }" /> </bean> <bean id="bean"> <property name="property" value="#{ flag ? 'yes' : 'no' }"/> </bean>
這個bean的屬性依賴于flag的值,該值是使用外部屬性注入的,這樣bean就具有了動態的能力。
使用 Profiles
這是在spring 3.1引入的。像下面這樣使用。
<!-- default configuration - will be loaded if no profile is specified --> <!-- This will only work if it's put at the end of the configuration file --> <!-- so no bean definitions after that --> <beans profile="default"> <import resource="classpath:default.xml" /> </beans> <!-- some other profile --> <beans profile="otherProfile"> <import resource="classpath:other-profile.xml" /> </beans>
使用spring 4的@Conditional注解
現在介紹@Conditional注解。官方文檔的說明是“只有當所有指定的條件都滿足是,組件才可以注冊”。主要的用處是在創建bean時增加一系列限制條件。
Conditional接口的聲明如下:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE, ElementType.METHOD) public @interface Conditional{ Class <!--?extends Condition-->[] value(); }
所以@Conditional注解使用方法如下
如果一個@Configuration類使用了@Conditional,會影響所有@Bean方法和@Import關聯類
public interface Condition{ /** Determine if the condition matches. * @param context the condition context * @param metadata meta-data of the {@link AnnotationMetadata class} or * {@link Method method} being checked. * @return {@code true} if the condition matches and the component can be registered * or {@code false} to veto registration. */ boolean matches(ConditionContext context, AnnotatedTypeMedata metadata); }
下面是一個例子
public class SystemPropertyCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return (System.getProperty("flag") != null); } } class SystemPropertyAbsentCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return (System.getProperty("flag") == null); } }
這里我們有兩個類:SystemPropertyCondition和SystemPropertyAbsentCondtion. 這兩個類都實現了Condition接口.覆蓋的方法基于屬性flag返回一個布爾值。
現在我們定義兩個類,一個是positive條件,一個是negative條件:
@Bean @Conditional(SystemPropertyCondition.class) public SampleService service1() { return new SampleServiceImpl1(); } @Bean @Conditional(SystemPropertyAbsentCondition.class) public SampleService service2() { return new SampleServiceImpl2(); }
上面提到的profiles已經通過conditional原型注解進行了修改。
總結
本文介紹了spring 4的conditianal注解。注意condition注解是不會繼承的。如果一個父類使用了conditional注解,其子類是不會擁有conditions的。如果你動手嘗試以上的例子,會幫助你獲得更好的理解。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。