繁体   English   中英

Bean创建的顺序WebMvcConfigurerAdapter Spring

[英]Order of Bean Creation WebMvcConfigurerAdapter Spring

我已经在Spring MVC中使用以下代码将xml转换为Java类。 谁能告诉我如何设置Bean创建顺序。 当我运行以下代码。 JDBCTemplate bean在DataSource Bean之前创建并给出异常,因为Datasource为null。

package com.outbottle.config;  

import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;  
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;  
import org.springframework.web.servlet.view.UrlBasedViewResolver;  
import org.apache.tomcat.jdbc.pool.DataSource;

@Configuration
@ComponentScan("com.outbottle")
@EnableWebMvc   
public class Config extends WebMvcConfigurerAdapter 
{  
    org.apache.tomcat.jdbc.pool.DataSource dataSource;
    JdbcTemplate jdbcTemplate;

    @Bean  
    public UrlBasedViewResolver setupViewResolver() {  
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();  
        resolver.setPrefix("/WEB-INF/jsp/");  
        resolver.setSuffix(".jsp");  
        resolver.setViewClass(JstlView.class);  
        return resolver;  
    } 

    @Bean  
    public org.apache.tomcat.jdbc.pool.DataSource setDataSource() 
    {  
        dataSource = new DataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUsername("muhiuddin");
        dataSource.setPassword("muhiuddin");
        dataSource.setUrl("jdbc:oracle:thin:@172.19.0.10:1521:db10g");
        dataSource.setMaxIdle(5);
        dataSource.setInitialSize(5);
        return dataSource;
    }

    @Bean  
    public JdbcTemplate setJdbcTemplate() 
    {  
        jdbcTemplate= new JdbcTemplate();
        // setDataSource(); // if I call this function then every thing is OK.
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }      

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) 
    {
        registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/*");
    }
} 

您可以使用@DependsOn注释来设置Bean创建的顺序

像这样:

@Bean
@DependsOn("setDataSource")  
public JdbcTemplate setJdbcTemplate() 
{  
    jdbcTemplate= new JdbcTemplate();
    // setDataSource(); // if I call this function then every thing is OK.
    jdbcTemplate.setDataSource(dataSource);
    return jdbcTemplate;
}      

但是您也可以调用方法本身:

@Bean  
public org.apache.tomcat.jdbc.pool.DataSource getDataSource() 
{  
    DataSource dataSource = new DataSource();
    dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
    dataSource.setUsername("muhiuddin");
    dataSource.setPassword("muhiuddin");
    dataSource.setUrl("jdbc:oracle:thin:@172.19.0.10:1521:db10g");
    dataSource.setMaxIdle(5);
    dataSource.setInitialSize(5);
    return dataSource;
}

@Bean  
public JdbcTemplate setJdbcTemplate() 
{  
    jdbcTemplate= new JdbcTemplate();
    // setDataSource(); // if I call this function then every thing is OK.
    jdbcTemplate.setDataSource(getDataSource());
    return jdbcTemplate;
}      

TL; DR:从不使用实例变量

您的代码应为:

@Bean  
public javax.sql.DataSource dataSource() 
{  
    final DataSource dataSource = new DataSource();
    dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
    dataSource.setUsername("muhiuddin");
    dataSource.setPassword("muhiuddin");
    dataSource.setUrl("jdbc:oracle:thin:@172.19.0.10:1521:db10g");
    dataSource.setMaxIdle(5);
    dataSource.setInitialSize(5);
    return dataSource;
}

@Bean  
public JdbcTemplate jdbcTemplate(final javax.sql.DataSource dataSource) 
{  
    final JdbcTemplate jdbcTemplate= new JdbcTemplate();
    // setDataSource(); // if I call this function then every thing is OK.
    jdbcTemplate.setDataSource(dataSource);
    return jdbcTemplate;
}      

通过这种方式,Spring 知道要创建JdbcTemplate bean,它需要一个DataSource bean。 因此它将正确决定订单。

您已经通过使用实例变量绕过了Spring,Spring无法确定实例变量的创建时间。


另外两件事:

  1. @Bean方法的名称设置了bean的名称,您是否真的想要一个名为setDataSourceDataSource bean?
  2. 您的bean应该返回interfaceabstract class而不是特定的类型,这是为了鼓励通过interface自动装配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM