@Autowired和静态方法

2022-08-31 08:43:16

我有必须在静态方法中使用的服务。我知道这是错误的,但我无法更改当前的设计,因为它需要大量的工作,所以我需要一些简单的技巧。我不能改变为非静态的,我需要使用这个自动连接的bean。任何线索如何做到这一点?@AutowiredrandomMethod()

@Service
public class Foo {
    public int doStuff() {
        return 1;
    }
}

public class Boo {
    @Autowired
    Foo foo;

    public static void randomMethod() {
         foo.doStuff();
    }
}

答案 1

您可以按照以下解决方案之一执行此操作:

使用构造函数@Autowired

这种方法将构造需要一些bean作为构造函数参数的bean。在构造函数代码中,使用 got 的值设置静态字段,作为构造函数执行的参数。样本:

@Component
public class Boo {

    private static Foo foo;

    @Autowired
    public Boo(Foo foo) {
        Boo.foo = foo;
    }

    public static void randomMethod() {
         foo.doStuff();
    }
}

使用@PostConstruct将值移交给静态字段

这里的想法是在弹簧配置豆子后将豆子交给静态场。

@Component
public class Boo {

    private static Foo foo;
    @Autowired
    private Foo tFoo;

    @PostConstruct
    public void init() {
        Boo.foo = tFoo;
    }

    public static void randomMethod() {
         foo.doStuff();
    }
}

答案 2

您必须通过静态应用程序上下文访问器方法解决此问题:

@Component
public class StaticContextAccessor {

    private static StaticContextAccessor instance;

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    public void registerInstance() {
        instance = this;
    }

    public static <T> T getBean(Class<T> clazz) {
        return instance.applicationContext.getBean(clazz);
    }

}

然后,您可以以静态方式访问 Bean 实例。

public class Boo {

    public static void randomMethod() {
         StaticContextAccessor.getBean(Foo.class).doStuff();
    }

}

推荐