当前位置: 首页 > 面试题库 >

@Autowired和静态方法

楮杰
2023-03-14
问题内容

我有@Autowired必须从静态方法中使用的服务。我知道这是错误的,但是我无法更改当前的设计,因为这需要大量的工作,因此我需要一些简单的技巧。我不能更改randomMethod()为非静态的,而需要使用此自动装配的bean。有什么线索怎么做?

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

public class Boo {
    @Autowired
    Foo foo;

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

问题答案:

您可以通过执行以下解决方案之一来做到这一点:

使用构造函数@Autowired

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

@Component
public class Boo {

    private static Foo foo;

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

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

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

这里的想法是在通过spring配置bean之后将bean移交给静态字段。

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


 类似资料:
  • 问题内容: 这是Hibernate的Spring MVC项目。我正在尝试制作一个Logger类,该类负责将日志输入数据库。其他类只是调用具有某些属性的适当方法,而该类应该发挥所有魔力。从本质上讲,它应该是带有静态方法的类,但是这会导致自动装配dao对象出现问题。 如何使它正确?我不应该使dao对象为空吗?我知道我可以将其作为方法参数传递,但这不是很好。我猜想自动装配不能在静态对象上使用,因为它们尚

  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其

  • 问题内容: 我在这里有关于此代码的问题 我知道多态性不适用于静态方法,仅适用于实例方法。而且,对于静态方法而言,覆盖无效。 因此,我认为该程序应打印出来:c,d 因为c调用了m1方法,但是它是静态的,所以它无法覆盖,并且在Mini类而不是Car中调用该方法。 这样对吗? 但是,我的教科书说答案应该是:a,d 是错字吗?因为我现在有点困惑。 请清除此,谢谢。 问题答案: 因为c调用了m1方法,但是它

  • PowerMockito.when(ConnectionFactory.getConn(“ABC”).getCurrentStatus()).thenReturn(ConnectionStatus.Connected); 对于上面的陈述,我得到了一个NPE。 我在junit测试类的开头已经有@PrepareForTest({fxallConnectionFactory.class,Connecti

  • 问题内容: 有什么方法可以使用静态字段。如果没有,还有其他方法可以做到这一点吗? 问题答案: 没有。你不能在Spring中自动连线或手动连线静态字段。为此,你必须编写自己的逻辑。

  • 在讲类方法和静态方法之前,先来看一个简单的例子: class A(object): def foo(self): print 'Hello ', self >>> a = A() >>> a.foo() Hello, <__main__.A object at 0x10c37a450> 在上面,我们定义了一个类 A,它有一个方法 foo,然后我们创建了一个对象 a,并调用