Eu tenho um monte de beans Spring que são retirados do caminho de classe por meio de anotações, por exemplo
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
No arquivo XML Spring, há um PropertyPlaceholderConfigurer definido:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Desejo injetar uma das propriedades de app.properites no bean mostrado acima. Não posso simplesmente fazer algo como
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Como PersonDaoImpl não aparece no arquivo XML Spring (ele é obtido no caminho de classe por meio de anotações). Eu tenho o seguinte:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Mas não está claro para mim como acesso o imóvel em que estou interessado ppc
?
java
spring
dependency-injection
Dónal
fonte
fonte
PropertyPlaceholderConfigurer
não é mais a classe recomendada. PrefiraPropertySourcesPlaceholderConfigurer
. Em qualquer caso, você pode usar a definição XML mais curta<context:property-placeholder />
.Respostas:
Você pode fazer isso no Spring 3 usando o suporte do EL. Exemplo:
systemProperties
é um objeto implícito estrategyBean
é um nome de feijão.Mais um exemplo, que funciona quando você deseja obter uma propriedade de um
Properties
objeto. Também mostra que você pode aplicar@Value
aos campos:Aqui está um post que escrevi sobre isso para um pouco mais de informação.
fonte
systemProperties
simplesmenteSystem.getProperties()
? Eu acho que se eu quero para injetar minhas próprias propriedades em um bean Spring eu preciso definir um<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
valor, em seguida, ler a partir de que em outro feijão usando algo parecido@Value("#{appProperties.databaseName}")
Pessoalmente, adoro essa nova maneira no Spring 3.0 a partir dos documentos :
Sem getters ou setters!
Com as propriedades sendo carregadas através da configuração:
Para aumentar ainda mais minha alegria, posso controlar o clique na expressão EL no IntelliJ e isso me leva à definição da propriedade!
Há também a versão totalmente não xml :
fonte
Há uma nova anotação
@Value
no Spring 3.0.0M3 .@Value
suporta não apenas#{...}
expressões, mas também${...}
espaços reservadosfonte
<context:property-placeholder ... />
é o XML equivalente ao PropertyPlaceholderConfigurer.Exemplo: applicationContext.xml
Classe de componente
fonte
<context:component-scan base-package="com.company.package" />
Para referência, estou usando a mola viaApplicationContext
, não em um contexto da web.Outra alternativa é adicionar o bean appProperties mostrado abaixo:
Quando recuperado, esse bean pode ser convertido para um
java.util.Properties
que conterá uma propriedade chamadaresults.max
cujo valor é lidoapp.properties
. Novamente, esse bean pode ser injetado por dependência (como uma instância de java.util.Properties) em qualquer classe por meio da anotação @Resource.Pessoalmente, prefiro essa solução (à outra que propus), pois você pode limitar exatamente quais propriedades são expostas pelo appProperties e não precisa ler o app.properties duas vezes.
fonte
Preciso ter dois arquivos de propriedades, um para produção e uma substituição para desenvolvimento (que não serão implantados).
Para ter os dois, um Bean de Propriedades que pode ser conectado automaticamente e um PropertyConfigurer, você pode escrever:
e faça referência ao Bean de Propriedades no PropertyConfigurer
fonte
Antes de chegarmos ao Spring 3 - que permite injetar constantes de propriedade diretamente nos seus beans usando anotações - escrevi uma subclasse do bean PropertyPlaceholderConfigurer que faz a mesma coisa. Portanto, você pode marcar seus configuradores de propriedades e o Spring transferirá suas propriedades automaticamente para seus beans da seguinte forma:
A anotação é a seguinte:
O PropertyAnnotationAndPlaceholderConfigurer é o seguinte:
Sinta-se livre para modificar a gosto
fonte
Você também pode anotar sua classe:
E tem uma variável como esta:
Agora você pode acessar todas as suas propriedades desta maneira:
fonte
Maneira da primavera:
private @Value("${propertyName}") String propertyField;
é uma nova maneira de injetar o valor usando a classe "PropertyPlaceholderConfigurer" do Spring. Outra maneira é ligar
Nota: Para @Value, você não pode usar o propertyField estático , ele deve ser apenas não estático; caso contrário, ele retornará nulo. Para corrigi-lo, é criado um setter não estático para o campo estático e @Value é aplicado acima desse setter.
fonte
Como mencionado
@Value
, o trabalho é bastante flexível, pois você pode ter um EL de mola.Aqui estão alguns exemplos que podem ser úteis:
Outro para obter um
set
de umlist
Você também pode definir valores para tipos primitivos.
Você pode chamar métodos estáticos:
Você pode ter lógica
fonte
Uma solução possível é declarar um segundo bean que lê do mesmo arquivo de propriedades:
O bean chamado 'appProperties' é do tipo java.util.Properties e pode ser injetado por dependência usando o atributo @Resource mostrado acima.
fonte
Se você estiver preso com o Spring 2.5, poderá definir um bean para cada uma de suas propriedades e injetá-los usando qualificadores. Como isso:
e
Não é super legível, mas faz o trabalho.
fonte
Valores da propriedade de fiação automática nos feijões da primavera:
A maioria das pessoas sabe que você pode usar o @Autowired para solicitar ao Spring que injete um objeto em outro quando ele carregar o contexto do aplicativo. Um nugget de informações menos conhecido é que você também pode usar a anotação @Value para injetar valores de um arquivo de propriedades nos atributos de um bean. veja este post para mais informações ...
novidades no Spring 3.0 || valores do bean de ligação automática || valores de propriedade de fiação automática na primavera
fonte
Para mim, foi a resposta da @ Lucky e, especificamente, a linha
a partir da página Capitão Debug
isso resolveu meu problema. Eu tenho um aplicativo baseado em ApplicationContext em execução na linha de comando e, a julgar por vários comentários sobre o SO, o Spring os liga de maneira diferente aos aplicativos baseados em MVC.
fonte
Eu acho que é a maneira mais conveniente de injetar propriedades no método setter do bean.
Exemplo:
Definição de xml do Bean:
Para cada nome
property
métodosetProperty(value)
será chamado.Dessa forma, é especialmente útil se você precisar de mais de um bean com base em uma implementação.
Por exemplo, se definirmos mais um bean em xml:
Então codifique assim:
Vai imprimir
Portanto, no seu caso, deve ficar assim:
fonte
Se você precisar de mais flexibilidade para as configurações, tente o Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
Em nossa aplicação, usamos:
A ordem padrão pela qual o valor-chave-Source é verificado primeiro está descrita em:
http://settings4j.sourceforge.net/currentrelease/configDefault.html
Ele pode ser personalizado com um settings4j.xml (preciso para log4j.xml) no seu caminho de classe.
Deixe-me saber sua opinião: [email protected]
Atenciosamente,
Harald
fonte
Use a classe "PropertyPlaceholderConfigurer" do Spring
Um exemplo simples mostrando o arquivo de propriedades lido dinamicamente como propriedade do bean
Arquivo de Propriedade
dev.app.jdbc.driver = com.mysql.jdbc.Driver
dev.app.jdbc.url = jdbc: mysql: // localhost: 3306 / addvertisement
dev.app.jdbc.username = root
dev.app.jdbc.password = root
fonte