जवाबों:
संक्षेप में, नहीं। आप स्प्रिंग में स्थैतिक फ़ील्ड्स को स्वतः लोड या तार नहीं कर सकते हैं। ऐसा करने के लिए आपको अपना तर्क लिखना होगा।
@AutoWired
@Component("NewClass")
public class NewClass{
private static SomeThing someThing;
@Autowired
public void setSomeThing(SomeThing someThing){
NewClass.someThing = someThing;
}
}
someThing
अगर इसे वैधानिक रूप से एक्सेस किया गया है तो इसे इनिशियलाइज़ किया गया है: NewClass.staticMethodWhichUsesSomething();
यदि ऐप इनिशियलाइज़ेशन से पहले उपयोग किया जाता है तो एनपीई फेंक सकता है
Instance methods should not write to "static" fields (squid:S2696)
?
@Autowired
बसने के साथ इस्तेमाल किया जा सकता है ताकि आप एक स्थिर क्षेत्र को संशोधित करने वाला एक सेटर कर सकें।
बस एक अंतिम सुझाव ... नहीं
@Component public class SpringAppEnv{ public static Environment _env; @Autowired public void setEnv(Environment env) {_env = env;} }
@PostConstruct मेथड में अपने ऑटोवार्ड कंपोनेंट को इनिट करें
@Component
public class TestClass {
private static AutowiredTypeComponent component;
@Autowired
private AutowiredTypeComponent autowiredComponent;
@PostConstruct
private void init() {
component = this.autowiredComponent;
}
public static void testMethod() {
component.callTestMethod();
}
}
Instance methods should not write to "static" fields (squid:S2696)
?
आप XML संकेतन और का उपयोग कर इसे प्राप्त कर सकते हैं MethodInvokingFactoryBean
। एक उदाहरण के लिए यहां देखें ।
private static StaticBean staticBean;
public void setStaticBean(StaticBean staticBean) {
StaticBean.staticBean = staticBean;
}
आपको स्प्रिंग इंजेक्शन का उपयोग करने का लक्ष्य बनाना चाहिए जहां यह अनुशंसित दृष्टिकोण है लेकिन यह हमेशा संभव नहीं है क्योंकि मुझे यकीन है कि आप कल्पना कर सकते हैं कि सब कुछ वसंत कंटेनर से नहीं खींचा जा सकता है या आप शायद विरासत प्रणालियों से निपट सकते हैं।
इस दृष्टिकोण के साथ नोट परीक्षण भी अधिक कठिन हो सकता है।
आप ApplicationContextAware का उपयोग कर सकते हैं
@Component
public class AppContext implements ApplicationContextAware{
public static ApplicationContext applicationContext;
public AppBeans(){
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
फिर
static ABean bean = AppContext.applicationContext.getBean("aBean",ABean.class);
ऑटो वायरिंग स्टैटिक फ़ील्ड (या स्थिर) के उत्तरों को जोड़ना चाहते हैं, लेकिन इसे भी नज़रअंदाज़ नहीं किया जाएगा:
@Autowired
private static String staticField = "staticValue";
अस्वीकरण यह किसी भी तरह से मानक नहीं है और ऐसा करने का एक बेहतर वसंत तरीका हो सकता है। उपर्युक्त उत्तरों में से कोई भी सार्वजनिक स्थैतिक क्षेत्र वायरिंग के मुद्दों को संबोधित नहीं करता है।
मैं तीन चीजों को पूरा करना चाहता था।
मेरी वस्तु इस तरह दिखती है
private static String BRANCH = "testBranch";
@Value("${content.client.branch}")
public void finalSetBranch(String branch) {
BRANCH = branch;
}
public static String BRANCH() {
return BRANCH;
}
हमने 1 और 2 को पहले ही चेक कर लिया है कि हम सेटर को कॉल कैसे रोकते हैं, क्योंकि हम इसे छिपा नहीं सकते हैं।
@Component
@Aspect
public class FinalAutowiredHelper {
@Before("finalMethods()")
public void beforeFinal(JoinPoint joinPoint) {
throw new FinalAutowiredHelper().new ModifySudoFinalError("");
}
@Pointcut("execution(* com.free.content.client..*.finalSetBranch(..))")
public void finalMethods() {}
public class ModifySudoFinalError extends Error {
private String msg;
public ModifySudoFinalError(String msg) {
this.msg = msg;
}
@Override
public String getMessage() {
return "Attempted modification of a final property: " + msg;
}
}
यह पहलू अंतिम के साथ शुरुआत करने वाले सभी तरीकों को लपेट देगा और यदि उन्हें बुलाया जाता है तो एक त्रुटि को फेंक देगा।
मुझे नहीं लगता कि यह विशेष रूप से उपयोगी है, लेकिन अगर आप ओड हैं और आपको मटर और गाजर अलग रखना पसंद करते हैं तो यह सुरक्षित रूप से करने का एक तरीका है।
जब कोई फ़ंक्शन कॉल करता है तो महत्वपूर्ण स्प्रिंग आपके पहलुओं को कॉल नहीं करता है। इसे आसान बना दिया, बुरा करने के लिए मैंने तर्क दिया कि इससे पहले कि यह समझ में आए।
private static UserService userService = ApplicationContextHolder.getContext().getBean(UserService.class);