Printemps 3.1 Java Configuration - @Autocâblés, @Configuration, et @Profil défi

Je suis en train de jouer autour avec le Printemps 3.1 et Servlet 3.0, et a été vraiment intrigué par le nouveau Java option de configuration ainsi que d'utiliser le Printemps des profils et suis en cours d'exécution dans un défi. Même si tous les exemples que j'ai vu en ligne, la faire ressembler à une classe annotée avec @Configuration peuvent avoir d'autres objets @Autocâblés en eux de ce que je vois, c'est que l'permettra à l'autowiring n'arrive pas jusqu'à après quelques de la les haricots dans de l' @classe de Configuration ont été générés.

Voici mon initialiseur:

public class SpringMvcInitializer implements WebApplicationInitializer {

private static org.apache.log4j.Logger log= Logger.getLogger(SpringMvcInitializer.class);

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    //Create the 'root' Spring application context
    AnnotationConfigWebApplicationContext rootContext  = new AnnotationConfigWebApplicationContext();
    rootContext.scan("org.jc.config");
    servletContext.addListener(new ContextLoaderListener(rootContext));

    //Secures the application
    servletContext.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
        .addMappingForUrlPatterns(null, false, "/*");       

    ServletRegistration.Dynamic appServlet =
            servletContext.addServlet("appServlet", new DispatcherServlet(new GenericWebApplicationContext()));
    appServlet.setLoadOnStartup(1); 

    appServlet.addMapping("/");

    log.info("Mvc Initializer starting");
}

Ma Configuration Web De

@Configuration
@EnableWebMvc
@ComponentScan(basePackages="org.jc" )
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public InternalResourceViewResolver configureInternalResourceViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/");
    resolver.setSuffix(".jsp");
    return resolver;
}

@Override
public void configureResourceHandling(ResourceConfigurer configurer) {
    configurer.addPathMapping("/resources/**");
    configurer.addResourceLocation("/resources/");
}

Ma Classe de Configuration de JPA

@Configuration
public class JpaConfig {
private static Logger logger = Logger.getLogger(JpaConfig.class);
private AppEnvironmentI appEnvironment;
@Autowired
public void setAppEnvironment(AppEnvironmentI appEnvironment) {
this.appEnvironment = appEnvironment;
checkAppEnv("setAppEnvironment");
}
@Bean
public AppUser globalUser(){
checkAppEnv("globalUser entry");
AppUser appUser = new AppUser();
checkAppEnv("globalUser exit");
return appUser;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
checkAppEnv("entityManagerFactory entry");
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean ();
emf.setDataSource(dataSource());
emf.setJpaVendorAdapter(this.jpaAdapter());
emf.setPersistenceUnitName("JcEntities2");
checkAppEnv("entityManagerFactory exit");
return emf;
}
@Bean
public DataSource dataSource(){
checkAppEnv("dataSource entry");
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
ds.setUrl("jdbc:derby://localhost:1527/JcTestDb");
ds.setUsername("jc");
ds.setPassword("pwd");
checkAppEnv("dataSource exit");
return ds;
}
@Bean
public JpaVendorAdapter jpaAdapter() {
checkAppEnv("jpaAdapter entry");
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setShowSql(true);
hibernateJpaVendorAdapter.setDatabase(Database.DERBY);
checkAppEnv("jpaAdapter exit");
return hibernateJpaVendorAdapter;
}
@Bean
public PlatformTransactionManager transactionManager() {
checkAppEnv("transactionManager entry and exit");
return new JpaTransactionManager( entityManagerFactory().getObject() );
}
private void checkAppEnv(String _method){
if(this.appEnvironment == null){
logger.info(_method + " - App Environment is null!!!!");
}else{
logger.info(_method + " - App Environment JpaConfig = " + appEnvironment.externalPropertiesFile().getPropertyValue("environment"));
}
}

Mon Profil De Classe

@Configuration
@Profile("local")
public class AppEnvironmentLocal implements AppEnvironmentI{
private static Logger logger = Logger.getLogger(AppEnvironmentLocal.class);
@Bean
public AppEnvironment externalPropertiesFile(){
logger.info("Fetching properties file for LOCAL environment");
Properties props = FileUtilsJc.getPropertiesFromFlatFile("C:\\AppConf\\JcConf\\JcConfLocal.properties");
AppEnvironment exf = new AppEnvironment(props);
return exf;
}
}

Enregistreur de sortie: On dirait que le Printemps 3.1 est d'abord d'essayer de créer l'Entité Gestionnaire de l'Usine de haricots avant de les AppEnvironment est injecté dans la classe. De sorte qu'il crée tous les haricots à l'exception de la Mondial de l'Utilisateur (un mannequin de haricot que j'ai mis dans pour les tests) et le Gestionnaire des Transactions, injecte le AppEnvironment, puis crée le mondial de l'utilisateur et le gestionnaire de transactions de haricots.

Des idées très apprécié!

01-Sep-2011 10:20:55  INFO Mvc Initializer starting
01-Sep-2011 10:20:55  INFO entityManagerFactory entry - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO dataSource entry - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO dataSource exit - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO jpaAdapter entry - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO jpaAdapter exit - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO entityManagerFactory exit - App Environment is null!!!!
01-Sep-2011 10:20:55  INFO Fetching properties file for LOCAL environment
01-Sep-2011 10:20:55  INFO setAppEnvironment - App Environment JpaConfig = LOCAL

Voici l'URL de l'exemple de code que j'ai utilisé pour relier:

http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

J'ai trouvé des documents établissant qu'avant le Printemps 3.1 il a été nécessaire d'ajouter de l' @AnnotationDrivenConfig annotation à votre injectable classe pour @Autocâblés de travail, mais cela a été déprécié au Printemps 3.1 j'ai trouvé un tas de messages à la recherche de cette annotation, mais rien qui abordées lors de la Configuration de l'objet sera injectée!

OriginalL'auteur jcurtin | 2011-09-01