【问题标题】:Spring 3.1 Java Configuration - @Autowired, @Configuration, and @Profile challengeSpring 3.1 Java 配置 - @Autowired、@Configuration 和 @Profile 挑战
【发布时间】:2023-03-02 23:10:02
【问题描述】:

我正在使用 Spring 3.1 和 Servlet 3.0,并且对新的 Java 配置选项以及使用 Spring 配置文件非常感兴趣,并且遇到了挑战。尽管我在网上看到的所有示例都使它看起来像一个用 @Configuration 注释的类,但可以将其他对象 @Autowired 放入其中,但我看到的是,直到在其中的一些 bean 之后才会发生自动装配@Configuration 类已经生成。

这是我的初始化程序:

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");
}

我的网络配置

@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/");
}

我的 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"));
    }
}

我的个人资料课程

@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;
}
}

Logger 输出:看起来 Spring 3.1 在将 AppEnvironment 注入类之前首先尝试创建 Entity Manager Factory bean。因此,它会创建除全局用户(我放入用于测试的虚拟 bean)和事务管理器之外的所有 bean,注入 AppEnvironment,然后创建全局用户和事务管理器 bean。

任何想法都非常感谢!

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

这是我用来连接它的示例代码的 URL:

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

我发现文档指出,在 Spring 3.1 之前,必须将 @AnnotationDrivenConfig 注释添加到您的可注入类中才能使 @Autowired 工作,但这在 Spring 3.1 中已被弃用我发现一堆帖子正在寻找这个注释但是注入配置对象时没有解决任何问题!

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    据我了解,@Configuration bean 是在非配置 bean 之前构建的,而带有 @Bean 标记的方法在它们返回时会生成 尚未 bean 的对象;构造 bean 的顺序是未定义的(除了一些特殊的 bean 类型;标准属性文件加载器很早就被调用,以便它们发现的值可用于设置 @Configuration bean)。不赞成直接调用 bean 方法;在@Bean 方法返回之后连接属性,让 Spring 为你做这件事。

    【讨论】:

    • 谢谢多纳尔!我编辑了帖子以包含指向 Springsource 博客的链接,在该博客中我找到了将配置类注入另一个配置类的示例代码。看起来它“应该”起作用!
    猜你喜欢
    • 2021-07-02
    • 2012-11-16
    • 2020-05-06
    • 1970-01-01
    • 2015-04-27
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多