বর্ণিত ক্ষেত্রটি @Autowired
হ'ল null
কারণ স্প্রিং MileageFeeCalculator
আপনার দ্বারা তৈরি করা অনুলিপি সম্পর্কে new
জানেন না এবং এটি স্বায়ত্তশাসিত করতে জানেন না।
স্প্রিং ইনভার্সন অফ কন্ট্রোল (আইওসি) ধারকটির তিনটি প্রধান যৌক্তিক উপাদান রয়েছে: ApplicationContext
অ্যাপ্লিকেশন ব্যবহার করার জন্য উপলব্ধ উপাদানগুলির (রেস) নামে একটি রেজিস্ট্রি , একটি কনফিগার সিস্টেম যা মিলিয়ে তাদের মধ্যে বস্তুর নির্ভরতা ইনজেক্ট করে the প্রসঙ্গে শিমের সাথে নির্ভরতা এবং একটি নির্ভরতা সমাধানকারী যা বিভিন্ন বিভিন্ন মটরশুটির একটি কনফিগারেশন দেখে এবং কীভাবে তাদের প্রয়োজনীয় ক্রমে ইনস্ট্যান্টিয়েট এবং কনফিগার করতে হয় তা নির্ধারণ করতে পারে।
আইওসি পাত্রে যাদু নয় এবং জাভা অবজেক্টগুলি সম্পর্কে জানার কোনও উপায় নেই আপনি যদি কোনওভাবে সেগুলি অবহিত না করেন। আপনি যখন কল করবেন new
, জেভিএম নতুন বস্তুর একটি অনুলিপি ইনস্ট্যান্ট করে সরাসরি আপনার হাতে দেয় - এটি কখনই কনফিগারেশন প্রক্রিয়াটির মধ্য দিয়ে যায় না। তিনটি উপায় রয়েছে যে আপনি আপনার মটরশুটি কনফিগার করতে পারেন।
আমি এই গিটহাব প্রকল্পে স্প্রিং বুট ব্যবহার করে এই কোডের সমস্ত পোস্ট করেছি ; আপনার এটিকে কার্যকর করার জন্য প্রয়োজনীয় সমস্ত কিছু দেখতে প্রতিটি পদ্ধতির জন্য আপনি একটি সম্পূর্ণ চলমান প্রকল্পটি দেখতে পারেন। এর সাথে ট্যাগ করুন NullPointerException
:nonworking
আপনার মটরশুটি ইনজেকশন
সর্বাধিক পছন্দনীয় বিকল্পটি হ'ল স্প্রিংকে আপনার সমস্ত মটরশুটিই স্বাবলম্বন করতে দিন; এর জন্য কোডের ন্যূনতম পরিমাণ প্রয়োজন এবং এটি সবচেয়ে রক্ষণাবেক্ষণযোগ্য। অটোওয়াইরিংয়ের কাজটি আপনার পছন্দ মতো করে তুলতে, এই জাতীয়টিরও স্বায়ত্তশাসন করুন MileageFeeCalculator
:
@Controller
public class MileageFeeController {
@Autowired
private MileageFeeCalculator calc;
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
return calc.mileageCharge(miles);
}
}
আপনার যদি বিভিন্ন অনুরোধের জন্য আপনার পরিষেবা অবজেক্টের একটি নতুন উদাহরণ তৈরি করতে হয় তবে আপনি স্প্রিং শিমের স্কোপগুলি ব্যবহার করে ইঞ্জেকশনটি ব্যবহার করতে পারেন ।
ট্যাগ যা @MileageFeeCalculator
পরিষেবা অবজেক্ট ইনজেকশন দ্বারা কাজ করে :working-inject-bean
@ কনফিগারযোগ্য ব্যবহার করুন
আপনার যদি সত্যই new
অটোওয়ার্ড হওয়ার সাথে সাথে তৈরি জিনিসগুলির প্রয়োজন হয় তবে আপনি আপনার অবজেক্টগুলি ইনজেক্ট করার জন্য এস্পেক্টজে সংকলন-সময় বুননের পাশাপাশি স্প্রিং @Configurable
টীকাটি ব্যবহার করতে পারেন । এই পদ্ধতিটি আপনার অবজেক্টের কনস্ট্রাক্টরে কোড প্রবেশ করায় যা স্প্রিংকে তৈরি করে যা সতর্ক করে দেয় যাতে স্প্রিং নতুন উদাহরণটি কনফিগার করতে পারে। এটির জন্য আপনার বিল্ডে কিছুটা কনফিগারেশন প্রয়োজন (যেমন সংকলন করা ajc
) এবং স্প্রিংয়ের রানটাইম কনফিগারেশন হ্যান্ডলারগুলি চালু করা ( @EnableSpringConfigured
জাভা কনফিগ সিনট্যাক্স সহ)। এই সক্রিয়করণটি রু অ্যাক্টিভ রেকর্ড সিস্টেম দ্বারা new
আপনার সত্তাগুলির দৃষ্টান্তগুলি প্রয়োজনীয় জেদী তথ্য ইনজেকশনের অনুমতি দেয় is
@Service
@Configurable
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService;
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile());
}
}
ট্যাগ যা @Configurable
পরিষেবা অবজেক্টে ব্যবহার করে কাজ করে :working-configurable
ম্যানুয়াল বিন সন্ধান: প্রস্তাবিত নয়
এই পদ্ধতির বিশেষ পরিস্থিতিতে লেগ্যাসি কোডের সাথে ইন্টারফেস করার জন্য উপযুক্ত। একটি সিঙ্গলটন অ্যাডাপ্টার শ্রেণি তৈরি করা প্রায় সবসময়ই ভাল Spring
এটি করার জন্য, আপনার একটি শ্রেণীর প্রয়োজন যেখানে স্প্রিং ApplicationContext
অবজেক্টটির জন্য একটি রেফারেন্স দিতে পারে :
@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext() {
return context;
}
}
তারপরে আপনার লিগ্যাসি কোডটি getContext()
প্রয়োজনীয় মটরশুটিটি কল করতে এবং পুনরুদ্ধার করতে পারে:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = ApplicationContextHolder.getContext().getBean(MileageFeeCalculator.class);
return calc.mileageCharge(miles);
}
}
বসন্ত প্রসঙ্গে ম্যানুয়ালি পরিষেবা অবজেক্টটি সন্ধান করে এমন ট্যাগ করুন: working-manual-lookup
F
অন্য শিমের কনস্ট্রাক্টরের ভিতরে ডাকা হয়S
। এক্ষেত্রে প্রয়োজনীয় শিমটিF
অন্য মটরশুটিS
কনস্ট্রাক্টরের কাছে প্যারামিটার হিসাবে পাস করুন এবং এরS
সাথে কনস্ট্রাক্টরকে বেনিফিট করুন@Autowire
। প্রথম শিমেরF
সাথে ক্লাসটি বেনিফিট করতে মনে রাখবেন@Component
।