2011-09-24 19 views
26

me han siguiente declaración de frijol:primavera PropertyPlaceholderConfigurer y el contexto: la propiedad-marcador de posición

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>WEB-INF/classes/config/properties/database.properties</value> 
       <value>classpath:config/properties/database.properties</value> 
      </list> 
     </property> 
     <property name="ignoreResourceNotFound" value="true"/> 
    </bean> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

Ahora quiero hacer cambios en las PropertyPlaceholderConfigurer al siguiente formato:

<context:component-scan base-package="org.example.config"/> 
<util:properties id="jdbcProperties" 
      location="classpath:config/properties/database.properties"/> 
  1. ignoreResourceNotFound ignorará el mientras que la propiedad corriendo. por ejemplo: Al probar la aplicación WEB-INF/.. ruta ignorará (ya que maven archivo de proyecto y propiedad está bajo src/main/resources/...), mientras que iniciando aplicación web, otra propiedad ignorará ruta, necesito para implementarlo con el formato anterior.
  2. debería ser capaz de añadir archivo de propiedades múltiples como database.properties, etc. test.properties
  3. en la primavera 3, puedo utilizar en lugar de la anotación de estos archivos XML para DB carga, ¿cómo puedo hacerlo? ya que estoy usando solo un archivo xml (dado arriba) para cargar cosas db.

Estoy utilizando el marco de Spring 3.

Respuesta

42

<context:property-placeholder ... /> es el XML equivalente al PropertyPlaceholderConfigurer. Entonces, prefiero eso. El <util:properties/> simplemente crea una instancia de java.util.Properties que puede inyectar.

En la primavera de 3.1 (no 3.0 ...) se puede hacer algo como esto:

@Configuration 
@PropertySource("/foo/bar/services.properties") 
public class ServiceConfiguration { 

    @Autowired Environment environment; 

    @Bean public javax.sql.DataSource dataSource(){ 
     String user = this.environment.getProperty("ds.user"); 
     ... 
    } 
} 

En Spring 3.0, puede "acceso" propiedades definidas por el uso del mecanismo PropertyPlaceHolderConfigurer utilizando las anotaciones SPEL:

@Value("${ds.user}") private String user; 

Si desea quitar el XML todos juntos, sólo tiene que registrarse manualmente usando el PropertyPlaceholderConfigurer configuración de Java. Prefiero el enfoque 3.1. Pero, si usted está utilizando el enfoque de la primavera 3,0 (desde 3.1 del GA no todavía ...), ahora se puede definir el XML anterior así:

@Configuration 
public class MySpring3Configuration {  
     @Bean 
     public static PropertyPlaceholderConfigurer configurer() { 
      PropertyPlaceholderConfigurer ppc = ... 
      ppc.setLocations(...); 
      return ppc; 
     } 

     @Bean 
     public class DataSource dataSource(
       @Value("${ds.user}") String user, 
       @Value("${ds.pw}") String pw, 
       ...) { 
      DataSource ds = ... 
      ds.setUser(user); 
      ds.setPassword(pw);       
      ... 
      return ds; 
     } 
} 

Tenga en cuenta que el PPC se define utilizando una definición static frijol método.Esto es necesario para asegurarse de que el bean se registra temprano, porque el PPC es BeanFactoryPostProcessor - puede influir en el registro de los beans en el contexto, por lo que necesariamente debe registrarse antes que cualquier otra cosa.

+1

Pero de nuevo necesitará @Bean public static PropertySourcePlaceholderConfigurer pspc() en Spring 3.1 ejemplo –

+1

Esta es la mejor respuesta. Una nota rápida: si usa Spring> = 3.1, use PropertySourcesPlaceholderConfigurer en lugar del antiguo PropertyPlaceholderConfigurer. Es compatible con el medio ambiente y todo lo nuevo introducido en Spring 3.1 mejor. –

18

Primero, no necesita definir ambas ubicaciones. Solo use classpath:config/properties/database.properties. En WAR, WEB-INF/classes es una entrada classpath, por lo que funcionará perfectamente.

Después de eso, creo que lo que quieres decir es que quieres use Spring's schema-based configuration to create a configurer. Eso sería algo así:

<context:property-placeholder location="classpath:config/properties/database.properties"/> 

Tenga en cuenta que no es necesario "ignoreResourceNotFound" más. Si es necesario definir las propiedades por separado utilizando util:properties:

<context:property-placeholder properties-ref="jdbcProperties" ignore-resource-not-found="true"/> 

No hay ninguna razón por lo general para definir por separado, sin embargo.

+0

1) si defino TechFind

+1

'util: properties' solo crea un bean de tipo' java.util.Properties'. No hace reemplazo de marcador de posición. La forma más simple de hacer reemplazos es usar 'context: property-placeholder' en XML. Podrías crear y configurar tu propia instancia de PropertyPlaceholderConfigurer sin XML si quisieras, usando la configuración de Java, por ejemplo, pero no estoy seguro de que alguien considere un mejor enfoque. –

Cuestiones relacionadas