当类不是一个 Bean 时,如何在字段变量上使用 @Autowired?
当类不是一个 Bean 时,如何在字段变量上使用 @Autowired?
假设我有以下代码:
@Service public class MyService { public void sayHello() { System.out.println("Hello"); } } public class MyTestClass { @Autowired private MyService thisService; public void transferHello() { thisService.sayHello(); } } public class Application { public static void main(String[] args) { SpringApplication.run(PilContainerApplication.class, args); MyTestClass thisTest = new MyTestClass(); thisTest.transferHello(); } }
由于`MyTestClass`不像service或controller那样是一个bean,当我使用`MyTestClass thisTest = new MyTestClass();`时,`thisService`会具有空引用。
我想知道如何解决这个问题...我尝试使用`public static MyService thisService`,但它说不能在静态字段上使用`@Autowired`注解。
谢谢。
当一个类不是Spring的Bean时,想要在该类中使用@Autowired注解来注入另一个Bean的实例,可以使用SpringBeanAutowiringSupport来实现。
下面是一个示例代码:
public class A { @Autowired private B b; public A() { SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); } }
在上述代码中,类A不是一个Spring的Bean,但是我们想要通过@Autowired注解来注入类B的实例。为了实现这一点,我们在类A的构造函数中调用了SpringBeanAutowiringSupport的processInjectionBasedOnCurrentContext方法。这个方法会根据Spring的上下文来自动注入类A中的成员变量b。
通过使用SpringBeanAutowiringSupport,我们可以在非Spring Bean的类中使用@Autowired注解来注入其他Bean的实例。这样可以提高代码的灵活性和可维护性,使得我们可以更方便地使用依赖注入的特性。
如果你想在一个非Spring Bean的类中使用@Autowired注解来注入其他Bean的实例,可以尝试使用SpringBeanAutowiringSupport来实现这一功能。这样可以避免手动实例化Bean,并且减少了代码的冗余。同时,使用注解可以使得代码更加清晰可读,并且方便后续的维护和扩展。
总结起来,当一个类不是Spring的Bean,但是想要在该类中使用@Autowired注解来注入其他Bean的实例时,可以使用SpringBeanAutowiringSupport来实现。通过调用processInjectionBasedOnCurrentContext方法,可以自动注入被@Autowired注解标记的成员变量。这样可以提高代码的可维护性和灵活性,使得我们可以更方便地使用依赖注入的特性。
当一个类不能被更改以注释为Spring构造时,@Autowired
是一个很好的替代方法:
public class MyBeansConfiguration { public MyTestClass getMyTestClass(MyService myService) { return new MyTestClass(myService); } }
现在可以在应用程序类中进行注入:
public class PilContainerApplication { MyTestClass myTestClass; public void init(){ myTestClass.transferHello(); } public static void main(String[] args) { SpringApplication.run(PilContainerApplication.class, args); } }
请注意,bean是类的实例,并且被注入到依赖于它们的其他类的实例中。因此,在静态的main()
方法中无法访问被注入的bean。但是,在使用@Autowired
注释的实例方法中,当当前bean的依赖关系被注入时,可以访问它。
附注:类名必须以大写字母开头。我在提供的代码中已经这样做了。