为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2022-06-30 11:23:33
bean 数据源在我的 bean 工厂中,但是当我尝试访问数据源的方法时,我得到了 NPE。似乎@Autowired注释不起作用@Configuration@EnableTransactionManagementpublic 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();    }}
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

你的问题出在这里:

DataSourceConfiguration demo = new DataSourceConfiguration();

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

要解决这个问题,您将不得不@Autowire在静态上下文之外的其他地方进行处理。


查看完整回答
反对 回复 2022-06-30
?
天涯尽头无女友

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

    }


}


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信