উত্তর:
সংক্ষেপে, না। আপনি বসন্তে স্থির ক্ষেত্রগুলিকে স্বয়ংক্রিয়ভাবে চালিত করতে বা ম্যানুয়ালি করতে পারবেন না। এটি করার জন্য আপনাকে নিজের যুক্তি লিখতে হবে।
@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;} }
@ পোস্টকন্সট্রাক্ট পদ্ধতিতে আপনার স্বতঃশক্তিযুক্ত উপাদানটি চালু করুন
@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)
?
আপনি এক্সএমএল স্বরলিপি এবং এটি ব্যবহার করে এটি অর্জন করতে পারেন MethodInvokingFactoryBean
। উদাহরণস্বরূপ এখানে দেখুন ।
private static StaticBean staticBean;
public void setStaticBean(StaticBean staticBean) {
StaticBean.staticBean = staticBean;
}
আপনার প্রস্তাব করা উচিত যেখানে স্প্রিং ইনজেকশন ব্যবহার করা সম্ভব সেখানে এটি প্রস্তাবিত পদ্ধতির কারণ এটি সর্বদা সম্ভব নয় কারণ আমি নিশ্চিত যে আপনি ধারণা করতে পারেন যে বসন্তের ধারক থেকে সমস্ত কিছুই টানা যায় না বা আপনি সম্ভবত উত্তরাধিকার ব্যবস্থা নিয়ে কাজ করছেন dealing
এই পদ্ধতির সাথে নোট পরীক্ষা করা আরও কঠিন হতে পারে।
আপনি অ্যাপ্লিকেশনসন্টেক্সটওয়্যারটি ব্যবহার করতে পারেন
@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);