[英]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;
}
您的代码应为:
@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无法确定实例变量的创建时间。
另外两件事:
@Bean
方法的名称设置了bean的名称,您是否真的想要一个名为setDataSource
的DataSource
bean? interface
或abstract class
而不是特定的类型,这是为了鼓励通过interface
自动装配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.