问题描述
我刚刚开始学习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")