Bean 在 applicationContext 但 @Autowired 注释不起作用

bean 数据源在我的 bean 工厂中,但是当我尝试访问数据源的方法时,我得到了 NPE。似乎@Autowired注释不起作用


@Configuration

@EnableTransactionManagement

public class DataSourceConfiguration {


    @Autowired

    private DataSource dataSource;


    public static void main(String[] args) throws SQLException {

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        showBeans(context);

        dataSourceDemo();

    }


    private static void showBeans(ApplicationContext context) {

        System.out.println(Arrays.toString(context.getBeanDefinitionNames()));

    }


    private static void dataSourceDemo() throws SQLException {

        DataSourceConfiguration demo = new DataSourceConfiguration();

        demo.showDataSource();

    }


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

//        return new DataSourceTransactionManager(dataSource);

    }


    public void showDataSource() throws SQLException {

        System.out.println("dataSource: " + dataSource.toString());

        Connection connection = dataSource.getConnection();

        System.out.println("connection: " + connection.toString());

        connection.close();

    }



}



哆啦的时光机
浏览 251回答 2
2回答

阿波罗的战车

你的问题出在这里:DataSourceConfiguration demo = new DataSourceConfiguration();您在不使用 spring 的 AOP 的情况下手动创建对象。这种方式DataSourceConfiguration不会被代理包裹,并且依赖管理失败。要解决这个问题,您将不得不@Autowire在静态上下文之外的其他地方进行处理。

天涯尽头无女友

为了放大,将您的程序驱动程序放在 @Configuration 类中并手动实例化该类似乎非常错误!您的配置类应该主要配置 bean,因此应该如下所示:@Configuration@EnableTransactionManagementpublic 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();    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java