Ek açıklamalar kullanılarak yapılandırılmış bir Spring Bean'e bir özellik değerini nasıl enjekte edebilirim?
Ek açıklamalar aracılığıyla sınıf yolundan alınan bir grup Spring çekirdeğim var, örn.
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
Spring XML dosyasında, tanımlanmış bir PropertyPlaceholderConfigurer vardır:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
app.properites dosyasındaki özelliklerden birini yukarıda gösterilen bean'e enjekte etmek istiyorum. Basitçe şöyle bir şey yapamam
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Çünkü PersonDaoImpl Spring XML dosyasında yer almaz (sınıf yolundan ek açıklamalar aracılığıyla alınır). Aşağıdakilere kadar geldim:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Ancak ppc
den ilgilendiğim özelliğe nasıl erişeceğim açık değil mi?
283
3
Başka bir alternatif de aşağıda gösterilen appProperties fasulyesini eklemektir:
Bu fasulye alındığında, değeri
app.properties
dosyasından okunanresults.max
adlı bir özellik içeren birjava.util.Properties
dosyasına dönüştürülebilir. Yine, bu fasulye @Resource ek açıklaması aracılığıyla herhangi bir sınıfa bağımlılık enjekte edilebilir (java.util.Properties örneği olarak).Şahsen, appProperties tarafından tam olarak hangi özelliklerin gösterileceğini sınırlayabildiğiniz ve app.properties dosyasını iki kez okumanıza gerek kalmadığı için bu çözümü (önerdiğim diğerine) tercih ediyorum.
Biri üretim için ve diğeri geliştirme için (dağıtılmayacak) olmak üzere iki özellik dosyasına ihtiyacım var.
Hem otomatik olarak bağlanabilen bir Properties Bean'e hem de bir PropertyConfigurer'a sahip olmak için yazabilirsiniz:
ve PropertyConfigurer'da Properties Bean'e referans verin
Olası bir çözüm, aynı özellikler dosyasından okuyan ikinci bir fasulye bildirmektir:
appProperties' adlı bean java.util.Properties türündedir ve yukarıda gösterilen @Resource attruibute kullanılarak bağımlılık enjekte edilebilir.