繁体   English   中英

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

[英]Bean is in applicationContext but @Autowired annotation not working

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


}

我执行程序并获得如下输出:

Exception in thread "main" java.lang.NullPointerException
at com.pain.DataSourceConfiguration.showDataSource(DataSourceConfiguration.java:40)
at com.pain.DataSourceTest.dataSourceDemo(DataSourceTest.java:23)
at com.pain.DataSourceTest.main(DataSourceTest.java:14)

[数据源配置,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,org.springframework.context.event.internalEventListenerFactory,transaction.annotation.internalAutowiredAnnotationProcessor .ProxyTransactionManagementConfiguration,org.springframework.transaction.config.internalTransactionAdvisor,transactionAttributeSource,transactionInterceptor,org.springframework.transaction.config.internalTransactionalEventListenerFactory,dataSource,transactionManager,org.springframework.aop.config.internalAutoProxyCreator]

你的问题在这里:

DataSourceConfiguration demo = new DataSourceConfiguration();

您在不使用 spring 的 AOP 的情况下手动创建对象。 这样DataSourceConfiguration不会被包裹在代理中并且依赖项管理失败。

要解决这个问题,您必须在静态上下文之外的其他地方@Autowire它。

为了放大,将您的程序驱动程序放在@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();
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM