如何在非Spring的构造型类中使用@Autowired

时间:2019-03-16 10:31:11

标签: java spring spring-boot inversion-of-control

我想在此类中使用该存储库,但是当我放置类似@Component的构造型时,会从IDE中收到错误消息:

  

无法自动接线。找不到“身份验证”类型的Bean。

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {

    @Autowired
    private FlatRepository flatRepository;

    public CustomMethodSecurityExpressionRoot(Authentication authentication) {
        super(authentication);
     }
}

2 个答案:

答案 0 :(得分:2)

您不能在@AutowireSecurityExpressionRoot
但是,您可以手动提供该FlatRepository依赖项。

@Configuration类中配置安全性对象时,可以@Autowire进行所需的任何实例。

只需在CustomMethodSecurityExpressionRoot构造函数中为该新依赖项腾出空间

class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot 
                                         implements MethodSecurityExpressionOperations {
    private final FlatRepository flatRepository;

    CustomMethodSecurityExpressionRoot(
            final Authentication authentication,
            final FlatRepository flatRepository) {
        super(authentication);
        this.flatRepository = flatRepository;
    }

    ...
}

并在实例化点手动注入

final SecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication, flatRepository);

答案 1 :(得分:0)

要使用Bean的自动装配实例,您需要使用该实例的组件/服务也由Spring进行管理。因此,为了使用存储库,您需要对CustomMethodSecurityExpressionRoot类进行扩展。您可以使用@Component / @Service注释对类进行注释,然后通过组件扫描对其进行选择,或者使用Java或XML配置对bean进行配置。

如果“ Springify” CustomMethodSecurityExpressionRoot,那么您需要确保Authentication对象可以通过spring Application上下文获得。这就是为什么您收到无法找到身份验证的错误的原因。您还需要使用Java或XML创建一个Authentication类型的Bean。

请查看官方文档以了解如何定义spring bean:

cocoapi