【问题标题】:Property 'dataSource' is required in Spring, JavaSpring,Java 中需要属性“dataSource”
【发布时间】:2020-09-21 16:39:22
【问题描述】:

我刚开始学习 Spring,现在我尝试创建基于 Spring JDBC 的 DAO 应用程序。 我以这种方式创建了配置类

@Configuration
@ComponentScan("com.foxminded.university")
public class SpringJdbcConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUrl("jdbc:postgresql://127.0.0.1:5432/university");
        dataSource.setUsername("maintainer");
        dataSource.setPassword("12345678");
        return dataSource;
    }
 }

而 dao-class 使用这个 bean

@Component
public class BuildingDao implements Dao<Building> {
    
    @Autowired
    private DataSource dataSource;
    private final JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    
    private static final String SAVE_BUILDING = "Insert into buildings (name, floors) values (?,?)";

    @Override
    public void save(Building building) {
        jdbcTemplate.update(SAVE_BUILDING, building.getName(), building.getFloors());
    }
}

但是当我尝试运行这个查询时,我得到了

Exception in thread "main" java.lang.IllegalArgumentException: Property 'dataSource' is required

我该如何解决?如我所见,我错误地使用了@Autowired,因为我使用时一切正常

    private DataSource dataSource = new SpringJdbcConfig().dataSource();

但就 IoC 而言,这是额外的关系和错误。

顺便说一句,我也必须以这种方式使用它

public class Main {
    public static void main(String[] args) {
        Building building = new SpringJdbcConfig().building();
        building.setName("hghgf");
        building.setFloors(2);
        BuildingDao buildingDao = new SpringJdbcConfig().buildingDao();
        buildingDao.save(building);
    }
}

如果您能解释如何正确使用 @autowired 并将 bean 注入主类,我将不胜感激。

【问题讨论】:

    标签: java spring jdbc dependency-injection inversion-of-control


    【解决方案1】:

    我建议您使用 spring boot 来配置您的应用程序,如下所示。这将初始化并自动配置您的大部分需求。

    @SpringBootApplication
    @EnableAutoConfiguration
    @ComponentScan("com.foxminded.university")
    public class SpringBootWebApp {
      public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringBootWebApp.class, args);
        context.registerShutdownHook();
      }
    }
    

    在此之后,您可以对您配置的所有 Spring 托管 bean 使用 @Autowire。

    【讨论】:

    【解决方案2】:

    如下编写ComponentScan属性并确保SpringJdbcConfig类在com.fox mind.university*包下

    @ComponentScan(basePackages = "com.foxminded.university")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2017-01-11
      • 2014-04-30
      • 1970-01-01
      • 2020-12-24
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多