Spring,Java需要属性“ dataSource”

问题描述

我刚刚开始学习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类使用此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注入主类,我将不胜感激。

解决方法

我建议您使用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。

,

按如下所示编写ComponentScan属性,并确保 SpringJdbcConfig 类在com.foxminded.university *包下。

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