java - @Autowire 未正确注入(inject) Spring @Bean 配置

标签 java spring dependency-injection autowired

我在 spring-social 上练习,当我在 Eclipse 中执行“Run as Junit Test”时,似乎 userConnectionRepository 在以下代码中没有正确 Autowiring 。在创建新的 FacebookOffLine 时,我在 usersConnectionRepository 上得到一个空指针异常,尽管在 @Bean java 创建代码中放置的断点显示它们似乎已正确创建。提前致谢,

public class FacebookOffline {

    private Facebook fb;

    @Autowired
    private UsersConnectionRepository usersConnectionRepository;

    public FacebookOffline(User user) {
        super();

        ConnectionRepository cr = usersConnectionRepository.createConnectionRepository(user.getId());
        fb = cr.getPrimaryConnection(Facebook.class).getApi();
    }

}

这是测试代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        org.springframework.social.quickstart.config.MainConfig.class,
        org.springframework.social.quickstart.config.SocialConfig.class })
public class FacebookOfflineTest {

    @Test
    public void test1() {
        FacebookOffline essai = new FacebookOffline(new User("yves"));

以及改编自 Keith Donald Quick Start Sample 的 Spring 配置类:

@Configuration
@ComponentScan(basePackages = "org.springframework.social.quickstart", excludeFilters = { @Filter(Configuration.class) })
@PropertySource("classpath:org/springframework/social/quickstart/config/application.properties")
public class MainConfig {

    @Bean
    public DataSource datasource() {
        DriverManagerDataSource toReturn = new DriverManagerDataSource("jdbc:mysql://localhost:3306/spring_social");
        toReturn.setDriverClassName("com.mysql.jdbc.Driver");
        toReturn.setUsername("spring");
        toReturn.setPassword("spring");
        return toReturn;

    }
}

@Configuration
public class SocialConfig {

    @Inject
    private Environment environment;

    @Inject
    private DataSource dataSource;

    @Bean
    public ConnectionFactoryLocator connectionFactoryLocator() {
        ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
        registry.addConnectionFactory(new FacebookConnectionFactory(environment
                .getProperty("facebook.clientId"), environment
                .getProperty("facebook.clientSecret")));
        return registry;
    }

@Bean
    public UsersConnectionRepository usersConnectionRepository() {
        JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(
                dataSource, connectionFactoryLocator(), Encryptors.noOpText());
        return repository;
    }

}

最佳答案

其实这里有2个问题。

  1. Spring 无法 Autowiring 不受其控制的 bean(即使用 new 创建)
  2. 构造函数中没有依赖关系(在注入(inject)之前需要一个对象实例)

第一个问题可以通过让 spring 管理一个 FacebookOffline 实例来缓解(或者如果您需要多个实例,则使 bean 请求或 session 范围)。

第二个有点难,但可以通过使用带有 @PostConstruct 注释的方法(或通过从 spring 实现 InitializingBean)来解决。

关于java - @Autowire 未正确注入(inject) Spring @Bean 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18865037/

相关文章:

java - SwingX 自动完成装饰器 : no suitable methode found for decorate

c# - 窗口依赖注入(inject)

java - 当可以导入 java 类时为什么要使用依赖注入(inject)?

c++ - 如何将shared_ptr<void>转换为另一种类型?

java - 无法让 itext 矩形与注释一起正常工作

java - 使用 JDBC 更新数据库中的记录以等于用户输入?

java - 所需变量找到值java?

java - Spring集成中使用Hibernate触发事件

java - @Repository 注解的真正目的

java - 如何使用 Eclipse 在本地服务器上从 GitHub 运行 Web 应用程序?