Luboš Račanský
9.2.2010

Spring: podmíněná konfigurace



Při vývoji aplikací ve Springu jste jistě narazili na problém nasazení do různých prostředí. Pravděpodobně jste to řešili vytvořením samostatných buildů. Ovšem ne vždy je to potřeba. Proč nenechat konfiguraci na adminovi? Existuje jednoduché a elegantní řešení jménem BeanReferenceFactoryBean

BeanReferenceFactoryBean využijete zejména, nastavujete-li specifická prostředí, jako je TaskExecutor pro Scheduling, transakční manažer, autentizaci atd. Představte si například situaci, kdy v properties vaší aplikace potřebujete nastavit, zda se Spring Security bude autentizovat vůči databázi nebo vůči LDAPu.

Jak na to?

Nejdříve nastavte v properties takovýto klíč: myApplication.authentication.provider=ldap Target beana libovolného jména definovaného v properties bude díky BeanReferenceFactoryBean dostupná vždy pod jediným a předem známým id.

<bean id="authenticationProvider" class="org.springframework.beans.factory.config.BeanReferenceFactoryBean">
  <property name="targetBeanName">
    <value>${myApplication.authentication.provider}AuthenticationProvider</value>
  </property>
</bean> 

Do authentication-manageru nainjektujeme beanu authenticationProvider, jejíž target beana je zvolena právě na základě konfigurace v properties.

<sec:authentication-manager>
  <sec:authentication-provider ref="authenticationProvider"/>
</sec:authentication-manager> 

Pro úplnost ještě uvádím nástin konfigurace Spring Security vůči databázi a LDAP.

<bean id="dbAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" lazy-init="true">
  <property name="userDetailsService" ref="userDetailsService" />
</bean>

Lazy-init je nastaveno na true, protože pokud si vyberete autentizaci vůči databázi, tak nebudete konfigurovat LDAP a naopak. S nevalidním nastavením by vám pak vůbec nenaběhl aplikační kontext.

<bean id="ldapAuthenticationProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider" lazy-init="true">
  <!-- configuration of LDAP -->
</bean>

Místo nového buildu teď stačí pro změnu konfigurace jen upravit nastavení v properties a restartovat aplikační server.

Vaše emailová adresa nebude zveřejněna

Komentáře

Děkujeme za váš komentář
Další
  • Jestě navíc jde udělat to, že property nebude povinná. Od Springu 3.0 mohou mít proměnné default hodnotu. Např. takto ${myApplication.authentication.provider:db}. Takže lze celý systém nastavit na výchozí hodnoty třeba vývojového prostředí a jenom na testu a v produkci některé věci nakonfigurovat.

  • Radomír Kadlec

    Proč je potřeba ten BeanReferenceFactoryBean, když mohu použít klíč přímo v referenci, např.: ref="${myApplication.authentication.provider}AuthenticationProvider" Výsledek i správa adminem jsou stejné, konfigurace Springu kratší a přehlednější. Ten BeanReferenceFactoryBean bych asi použil jedině tehdy, pokud bych chtěl tentýž variantně konfigurovaný bean použít v kontextu vícekrát, abych nemusel stále znovu opakovat ten ošklivý složený název.

  • Roman Z.

    Vdaka! Velmi mi to pomohlo. Asi pred mesiacom som hladal presne takuto moznost podmienenej konfiguracie v Springu, ale uberal som skor cestou TAGov (nieco ako ) a nie nejakej specialnej BeanReferenceFactoryBean. Parada!:)

  • Že proměnná bude nepovinná jde udělat i ve starších verzích Springu a to nastavením vlastnosti properties u PropertyPlaceHolderConfigureru. j2ee