Πώς μπορώ να εισάγω μια τιμή ιδιότητας σε ένα Spring Bean το οποίο έχει ρυθμιστεί με τη χρήση σχολίων;

Έχω μια σειρά από φασόλια της Spring τα οποία λαμβάνονται από το classpath μέσω σχολίων, π.χ.

@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
    // Implementation omitted
}

Στο αρχείο XML της Spring, υπάρχει'ένα PropertyPlaceholderConfigurer ορισμένο:

<bean id="propertyConfigurer" 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/app.properties" />
</bean>   

Θέλω να εισάγω μία από τις ιδιότητες από το app.properites στο φασόλι που φαίνεται παραπάνω. Δεν μπορώ απλά να κάνω κάτι σαν

<bean class="com.example.PersonDaoImpl">
    <property name="maxResults" value="${results.max}"/>
</bean>

Επειδή το PersonDaoImpl δεν εμφανίζεται στο αρχείο XML της Spring (παραλαμβάνεται από το classpath μέσω annotations). Έχω φτάσει μέχρι τα εξής: "Η εφαρμογή του είναι μια από τις πιο σημαντικές λειτουργίες που πρέπει να γίνει...":

@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {

    @Resource(name = "propertyConfigurer")
    protected void setProperties(PropertyPlaceholderConfigurer ppc) {
    // Now how do I access results.max? 
    }
}

Αλλά δεν'μου είναι ξεκάθαρο πώς μπορώ να προσπελάσω την ιδιότητα που με ενδιαφέρει από το ppc?

Μια άλλη εναλλακτική λύση είναι να προσθέσετε το φασόλι appProperties που φαίνεται παρακάτω:










                        ${results.max}


Όταν ανακτηθεί, αυτό το bean μπορεί να μετατραπεί σε ένα java.util.Properties το οποίο θα περιέχει μια ιδιότητα με όνομα results.max της οποίας η τιμή διαβάζεται από το app.properties. Και πάλι, αυτό το φασόλι μπορεί να εγχυθεί ως εξάρτηση (ως μια περίπτωση του java.util.Properties) σε οποιαδήποτε κλάση μέσω του σχολιασμού @Resource.

Προσωπικά, προτιμώ αυτή τη λύση (από την άλλη που πρότεινα), καθώς μπορείτε να περιορίσετε ακριβώς ποιες ιδιότητες εκτίθενται από το appProperties και δεν χρειάζεται να διαβάζετε το app.properties δύο φορές.

Σχόλια (1)

Πρέπει να έχω δύο αρχεία ιδιοτήτων, ένα για την παραγωγή και ένα για την ανάπτυξη (το οποίο δεν θα αναπτυχθεί).

Για να έχετε και τα δύο, ένα Properties Bean που μπορεί να είναι autowired και ένα PropertyConfigurer, μπορείτε να γράψετε:







            classpath:live.properties
            classpath:development.properties


και να αναφέρετε το Properties Bean στο PropertyConfigurer



Σχόλια (0)

Μια πιθανή λύση είναι να δηλώσετε ένα δεύτερο φασόλι που διαβάζει από το ίδιο αρχείο ιδιοτήτων:





Το bean με το όνομα 'appProperties' είναι τύπου java.util.Properties και μπορεί να εγχυθεί ως εξάρτηση χρησιμοποιώντας την @Resource attruibute που φαίνεται παραπάνω.

Σχόλια (0)