In Spring, @Autowired annotation is typically used to inject dependencies into Spring-managed beans. However, it cannot be directly applied to static classes or static fields/methods, as Spring manages instances of beans, and static members are not bound to a specific instance.
If you have a static utility class or a static method that needs access to Spring-managed beans, you have a few options:
ApplicationContextAware:Implement the ApplicationContextAware interface to get access to the ApplicationContext, from which you can manually retrieve the beans:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class MyStaticClass implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { context = applicationContext; } public static MyBean getMyBean() { return context.getBean(MyBean.class); } } @PostConstruct:If your static class is not a Spring bean, you can use @PostConstruct on a static method to initialize it after Spring has fully initialized the application context:
import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyStaticClass { private static MyBean myBean; @Autowired private MyBean myBeanAutowired; @PostConstruct public void init() { myBean = myBeanAutowired; } public static MyBean getMyBean() { return myBean; } } Instead of having static methods that rely on static fields, consider refactoring your code to use dependency injection where possible. This way, you can make your classes more testable and easier to maintain.
Spring @Autowired in static class
Description: Example of using @Autowired in a static class in a Spring application.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyService { private static MyDependency myDependency; @Autowired public void setMyDependency(MyDependency myDependency) { MyService.myDependency = myDependency; } public static void doSomething() { myDependency.someMethod(); // Static method logic } } @Autowired is used on a setter method to inject a MyDependency bean into a static MyService class. The static method doSomething() demonstrates accessing the autowired dependency.Spring @Autowired in static initializer
Description: Inject dependencies using @Autowired in a static initializer block.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyService { private static MyDependency myDependency; static { // Static initializer block ApplicationContext context = ApplicationContextProvider.getApplicationContext(); myDependency = context.getBean(MyDependency.class); } public static void doSomething() { myDependency.someMethod(); // Static method logic } } MyDependency bean into a static MyService class using a static initializer block and ApplicationContext. It assumes the presence of ApplicationContextProvider to retrieve the application context.Spring @Autowired in utility class
Description: Using @Autowired in a utility class to inject dependencies.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyUtility { private static MyDependency myDependency; @Autowired public void setMyDependency(MyDependency myDependency) { MyUtility.myDependency = myDependency; } public static void doUtilityTask() { myDependency.someMethod(); // Utility method logic } } @Autowired is used on a setter method to inject a MyDependency bean into a static utility class MyUtility. The static method doUtilityTask() demonstrates using the autowired dependency.Spring @Autowired in static factory method
Description: Inject dependencies using @Autowired in a static factory method.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyFactory { private static MyDependency myDependency; @Autowired public MyFactory(MyDependency myDependency) { MyFactory.myDependency = myDependency; } public static MyService createService() { return new MyService(); } } @Autowired on a constructor to inject MyDependency into a static factory class MyFactory. The static method createService() demonstrates creating instances with the autowired dependency.Spring @Autowired in singleton static field
Description: Using @Autowired on a static field of a singleton class.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MySingleton { @Autowired private static MyDependency myDependency; public static void doSomething() { myDependency.someMethod(); // Static method logic } } @Autowired is used on a static field myDependency of a singleton class MySingleton. The static method doSomething() demonstrates using the autowired dependency.Spring @Autowired in static inner class
Description: Injecting dependencies using @Autowired in a static inner class.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class OuterClass { private static class InnerClass { @Autowired private static MyDependency myDependency; public static void innerMethod() { myDependency.someMethod(); // Static inner class method logic } } public static void outerMethod() { InnerClass.innerMethod(); // Outer class method logic } } @Autowired on a static field myDependency within a static inner class InnerClass. The static method innerMethod() in InnerClass accesses the autowired dependency.Spring @Autowired in static initializer with field injection
Description: Injecting dependencies using field injection and static initializer block.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyService { private static MyDependency myDependency; @Autowired private MyService(MyDependency myDependency) { MyService.myDependency = myDependency; } static { // Static initializer block // Optionally use ApplicationContext to get dependency } public static void doSomething() { myDependency.someMethod(); // Static method logic } } MyService and initializes the static myDependency field. The static initializer block can optionally use ApplicationContext to retrieve the dependency.Spring @Autowired in static class with lazy initialization
Description: Lazy initialization of @Autowired dependency in a static class.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @Component public class MyService { private static MyDependency myDependency; @Autowired @Lazy public void setMyDependency(MyDependency myDependency) { MyService.myDependency = myDependency; } public static void doSomething() { myDependency.someMethod(); // Static method logic } } @Lazy annotation on setMyDependency() method to lazily initialize myDependency in a static MyService class.Spring @Autowired in static class with ApplicationContext
Description: Using ApplicationContext to inject dependencies in a static class.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @Component public class MyService { private static ApplicationContext applicationContext; @Autowired public void setApplicationContext(ApplicationContext context) { applicationContext = context; } public static void doSomething() { MyDependency myDependency = applicationContext.getBean(MyDependency.class); myDependency.someMethod(); // Static method logic } } ApplicationContext to inject MyDependency into a static MyService class. The static method doSomething() retrieves the dependency from ApplicationContext and performs its logic.Spring @Autowired in static class with setter injection
Description: Using setter injection for @Autowired dependencies in a static class.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyService { private static MyDependency myDependency; @Autowired public void setMyDependency(MyDependency myDependency) { MyService.myDependency = myDependency; } public static void doSomething() { myDependency.someMethod(); // Static method logic } } setMyDependency()) to inject MyDependency into a static MyService class. The static method doSomething() accesses the autowired dependency.responsive genfromtxt maintainability git-diff flexible-array-member robolectric base-url onfling android-kenburnsview domain-driven-design