2 回答
TA贡献1862条经验 获得超6个赞
你的问题出在这里:
DataSourceConfiguration demo = new DataSourceConfiguration();
您在不使用 spring 的 AOP 的情况下手动创建对象。这种方式DataSourceConfiguration
不会被代理包裹,并且依赖管理失败。
要解决这个问题,您将不得不@Autowire
在静态上下文之外的其他地方进行处理。
TA贡献1831条经验 获得超9个赞
为了放大,将您的程序驱动程序放在 @Configuration 类中并手动实例化该类似乎非常错误!
您的配置类应该主要配置 bean,因此应该如下所示:
@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {
@Autowired
private DataSource dataSource;
@Bean(destroyMethod = "close")
public DataSource dataSource() throws Exception {
Properties properties = new Properties();
properties.setProperty("driverClassName", "com.mysql.jdbc.Driver");
properties.setProperty("url", "jdbc:mysql://127.0.0.1:3306/orange?characterEncoding=utf-8");
properties.setProperty("username", "mysql");
properties.setProperty("password", "123456");
return BasicDataSourceFactory.createDataSource(properties);
}
@Bean
public PlatformTransactionManager transactionManager() throws Exception {
return new DataSourceTransactionManager(dataSource());
}
}
如果您使用的是普通弹簧,那么您可以完成您想要的,显示有关您的数据源的信息,执行以下操作。以这种方式使用 spring 作为服务定位器是非常单一的,甚至可能是一种反模式):
public class MainCaller {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");
DataSource ds = (DataSource)applicationContext.getBean("DataSource");
showDataSource(ds);
}
public static void showDataSource(Datasource dataSource) throws SQLException {
System.out.println("dataSource: " + dataSource.toString());
Connection connection = dataSource.getConnection();
System.out.println("connection: " + connection.toString());
connection.close();
}
}
添加回答
举报