财产';数据源';在Java的Spring中是必需的

财产';数据源';在Java的Spring中是必需的,java,spring,jdbc,dependency-injection,inversion-of-control,Java,Spring,Jdbc,Dependency Injection,Inversion Of Control,我刚开始学习Spring,现在我尝试编写基于Spring JDBC的DAO应用程序。 我用这种方式创建了config类 @Configuration @ComponentScan("com.foxminded.university") public class SpringJdbcConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource

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

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

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);
    }
}
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());
    }
}
我怎么能修好它?正如我所看到的,我使用@Autowired的方式不正确,因为当我使用它时,一切都正常

    private DataSource dataSource = new SpringJdbcConfig().dataSource();
但就国际奥委会而言,这是额外的联系和错误

顺便说一句,我也必须这样使用它

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

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

在此之后,您可以将@Autowire用于您配置的所有spring托管bean。

按如下方式编写ComponentScan属性,并确保SpringJdbcConfig类位于com.foxmind.university包下*

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

是的,但一开始我想了解在没有Spring引导的情况下如何使用它,然后我建议您阅读这里的Spring文档。如果可能的话,从spring的基础知识开始,比如IoC、依赖注入。这将有助于理解自动布线。