পূর্ববর্তী নিবন্ধে , আমি সংক্ষেপে ব্যাখ্যা করেছি যে বসন্ত কী এবং মটরশুটি এবং প্রসঙ্গ কী। এখন এটা চেষ্টা করার সময়. আমি IntelliJ IDEA এন্টারপ্রাইজ সংস্করণ ব্যবহার করে এটি করতে যাচ্ছি। কিন্তু আমার সমস্ত উদাহরণ বিনামূল্যে IntelliJ IDEA কমিউনিটি সংস্করণে কাজ করা উচিত। স্ক্রিনশটগুলিতে, আপনি যদি দেখেন যে আমার কাছে এমন কিছু উইন্ডো আছে যা আপনার কাছে নেই, চিন্তা করবেন না — এটি এই প্রকল্পের জন্য গুরুত্বপূর্ণ নয় :)
প্রথমে, একটি খালি Maven প্রকল্প তৈরি করুন। আমি এই লিঙ্কে নিবন্ধে এটি কীভাবে করতে হয় তা দেখিয়েছি । এই শব্দগুলি পর্যন্ত পড়ুন " আমাদের মাভেন প্রকল্পটিকে একটি ওয়েব প্রকল্পে রূপান্তর করার সময় এসেছে৷ " — এর পরে, নিবন্ধটি দেখায় কিভাবে একটি ওয়েব প্রকল্প তৈরি করা যায়, কিন্তু আমাদের এখনই এটির প্রয়োজন নেই৷ src/main/java- এফোল্ডার, একটি প্যাকেজ তৈরি করুন (আমার ক্ষেত্রে, আমি এটিকে " বলেছি
বাম দিকের উইন্ডোতে, আপনি প্যাকেজ এবং

en.codegym.info.fatfaggy.animals
। আপনি যা খুশি কল করতে পারেন। শুধু সঠিক জায়গায় আমার প্যাকেজের নামটি আপনার প্যাকেজের নামের সাথে প্রতিস্থাপন করতে ভুলবেন না। এখন ক্লাস তৈরি করুন Main
এবং একটি যোগ করুন। পদ্ধতি
public static void main(String[] args) {
...
}
এর পরে, pom.xml ফাইলটি খুলুন এবং dependencies
বিভাগটি যুক্ত করুন। এখন Maven সংগ্রহস্থলে যান এবং সর্বশেষ স্থিতিশীল সংস্করণের জন্য বসন্ত প্রসঙ্গটি খুঁজুন। আমরা বিভাগে যা খুঁজে পাই তা রাখুন dependencies
। আমি এই অন্যান্য কোডজিম নিবন্ধে এই প্রক্রিয়াটিকে আরও বিস্তারিতভাবে বর্ণনা করেছি (" মাভেনে নির্ভরতা সংযোগ করা " শিরোনামের বিভাগটি দেখুন )। তারপর মাভেন নিজেই প্রয়োজনীয় নির্ভরতা খুঁজে পাবে এবং ডাউনলোড করবে। শেষ পর্যন্ত, আপনার এরকম কিছু পাওয়া উচিত: 
Main
ক্লাস সহ প্রকল্পের কাঠামো দেখতে পারেন। মাঝের উইন্ডোটি দেখায় কিভাবে pom.xml আমার জন্য দেখায়। আমি একটি বৈশিষ্ট্য যোগ করেছিএটিতে বিভাগ। এই বিভাগটি ম্যাভেনকে বলে যে আমি আমার সোর্স ফাইলগুলিতে জাভার কোন সংস্করণ ব্যবহার করছি এবং কোন সংস্করণটি কম্পাইল করব। এটি শুধুমাত্র তাই যাতে IDEA আমাকে সতর্ক করে না যে আমি জাভার একটি পুরানো সংস্করণ ব্যবহার করছি। এটি ঐচ্ছিক :) ডান উইন্ডোটি স্পষ্ট করে দেয় যে যদিও আমরা শুধুমাত্র স্প্রিং-প্রসঙ্গ মডিউল সংযুক্ত করেছি, এটি স্বয়ংক্রিয়ভাবে স্প্রিং-কোর, স্প্রিং-বিন্স, স্প্রিং-এওপি এবং স্প্রিং-এক্সপ্রেশন মডিউলে টানছে। আমরা প্রতিটি মডিউলকে আলাদাভাবে সংযুক্ত করতে পারতাম, প্রতিটি মডিউলের জন্য pom.xml ফাইলে স্পষ্ট সংস্করণের সাথে একটি নির্ভরতা লিখতে পারতাম, কিন্তু আপাতত আমরা তাদের মতো জিনিস নিয়ে খুশি। এখন entities
প্যাকেজটি তৈরি করুন এবং এতে 3টি ক্লাস তৈরি করুন: Cat
, Dog
, Parrot
. আসুন প্রতিটি প্রাণীর একটি নাম দেওয়া যাক (private String name
— আপনি সেখানে কিছু মান হার্ডকোড করতে পারেন)। গেটার/সেটাররা সর্বজনীন। Main
এখন আমরা ক্লাস এবং পদ্ধতিতে এগিয়ে যাই main()
, এবং আমরা এরকম কিছু লিখি:
public static void main(String[] args) {
// Create an empty Spring context that will look for its own beans based on the annotations in the specified package
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.entities");
Cat cat = context.getBean(Cat.class);
Dog dog = (Dog) context.getBean("dog");
Parrot parrot = context.getBean("parrot-polly", Parrot.class);
System.out.println(cat.getName());
System.out.println(dog.getName());
System.out.println(parrot.getName());
}
প্রথমে, আমরা একটি কনটেক্সট অবজেক্ট তৈরি করি, যা কনস্ট্রাক্টরকে বলে যে মটরশুটি খুঁজতে কোন প্যাকেজটি দেখতে হবে। অন্য কথায়, স্প্রিং এই প্যাকেজের মধ্য দিয়ে যাবে এবং বিশেষ টীকা দিয়ে চিহ্নিত ক্লাসগুলি খুঁজে বের করার চেষ্টা করবে যা নির্দেশ করে যে তারা মটরশুটি। তারপরে এটি এই শ্রেণীর বস্তুগুলি তৈরি করে এবং সেগুলিকে প্রসঙ্গে রাখে। এর পরে, আমরা এই প্রসঙ্গে একটি বিড়াল পেতে. আমরা কনটেক্সট অবজেক্টকে আমাদেরকে একটি বিন (বস্তু) দেওয়ার জন্য আহ্বান করি, যে বস্তুর শ্রেণীটি আমরা চাই তা নির্দেশ করে (প্রসঙ্গক্রমে, আমরা কেবল ক্লাস নয়, ইন্টারফেসও নির্দিষ্ট করতে পারি)। এর পরে, স্প্রিং অনুরোধ করা ক্লাসের একটি অবজেক্ট প্রদান করে, যা আমরা একটি ভেরিয়েবলে সংরক্ষণ করি। এর পরে, আমরা বসন্তকে আমাদের "কুকুর" নামে একটি মটরশুটি পেতে বলি। যখন বসন্ত সৃষ্টি করে aDog
অবজেক্ট, এটি বস্তুটিকে একটি আদর্শ নাম দেয় (যদি না তৈরি করা বিনটিকে স্পষ্টভাবে একটি নাম বরাদ্দ করা হয়), যা ক্লাসের নাম কিন্তু একটি প্রাথমিক ছোট হাতের অক্ষর সহ। এই ক্ষেত্রে, আমাদের ক্লাস বলা হয় Dog
, তাই শিমের নাম "কুকুর"। যদি আমাদের BufferedReader
সেখানে একটি বস্তুর প্রয়োজন হয়, তাহলে স্প্রিং এটির নাম দেবে "বাফারডরিডার"। এবং যেহেতু জাভা 100% নিশ্চিত হতে পারে না যে আমরা কোন ক্লাস চাই, এটি একটি Object
অবজেক্ট রিটার্ন করে, যা আমরা ম্যানুয়ালি কাঙ্খিত প্রকারে কাস্ট করি, যেমনDog
. বিকল্প যেখানে ক্লাসটি স্পষ্টভাবে নির্দেশিত হয় তা আরও সুবিধাজনক। তৃতীয় বিকল্প হল ক্লাসের নাম এবং শিমের নাম অনুসারে একটি শিম পাওয়া। এটা সম্ভব যে প্রসঙ্গটিতে একটি একক শ্রেণীর একাধিক বিন থাকতে পারে। আমাদের প্রয়োজন নির্দিষ্ট বিন নির্দেশ করার জন্য, আমরা এর নাম নির্দেশ করি। কারণ আমরা এখানেও স্পষ্টভাবে ক্লাস নির্দেশ করি, আমাদের আর কাস্ট করতে হবে না। গুরুত্বপূর্ণ!যদি স্প্রিং আমাদের প্রয়োজনীয়তার সাথে মেলে এমন বেশ কয়েকটি মটরশুটি খুঁজে পায়, তাহলে এটি নির্ধারণ করতে পারে না যে কোন শিম আমাদের দিতে হবে, তাই এটি একটি ব্যতিক্রম নিক্ষেপ করবে। তদনুসারে, এই পরিস্থিতি এড়াতে, আপনার কোন শিমটি প্রয়োজন তা বসন্তকে বলার ক্ষেত্রে যতটা সম্ভব নির্দিষ্ট হওয়ার চেষ্টা করা উচিত। যদি স্প্রিং তার প্রসঙ্গ অনুসন্ধান করে এবং আমাদের প্রয়োজনীয়তার সাথে মেলে এমন একটি একক বিন খুঁজে পেতে ব্যর্থ হয়, তাহলে এটি একটি ব্যতিক্রমও ছুঁড়ে দেবে। অবশেষে, আমরা আমাদের প্রয়োজনীয় বস্তুগুলি সত্যিই পেয়েছি তা যাচাই করার জন্য আমরা কেবল আমাদের প্রাণীদের নাম প্রদর্শন করি। কিন্তু যদি আমরা এখন প্রোগ্রামটি চালাই, আমরা দেখতে পাব যে বসন্ত অসুখী - এটি তার প্রসঙ্গে আমাদের প্রয়োজনীয় প্রাণীগুলি খুঁজে পায় না। কারণ এটি এই মটরশুটি তৈরি করেনি। যেমনটি আমি আগে বলেছি, যখন স্প্রিং ক্লাস স্ক্যান করে, তখন এটি তার নিজস্ব স্প্রিং টীকাগুলি সন্ধান করে। এবং যদি বসন্ত এই টীকাগুলি খুঁজে না পায়, তাহলে এটি মনে হয় না যে এই শ্রেণীগুলি মটরশুটির সাথে মিলে যায় যা এটি তৈরি করতে হবে। এটি ঠিক করার জন্য কেবল যোগ করা প্রয়োজন@Component
আমাদের পশু শ্রেণীর প্রতিটি সামনে টীকা.
@Component
public class Cat {
private String name = "Oscar";
...
}
কিন্তু আরো আছে. যদি আমাদের স্প্রিংকে স্পষ্টভাবে বলতে হয় যে এই শ্রেণীর জন্য শিমের একটি নির্দিষ্ট নাম থাকা উচিত, আমরা টীকাটির পরে বন্ধনীতে নামটি নির্দেশ করি। উদাহরণ স্বরূপ, স্প্রিংকে বলতে বলতে parrot-polly
প্যারোট বিনকে " " নাম দিতে, যে নামটি আমরা এই তোতাকে পদ্ধতিতে পেতে ব্যবহার করব main
, আমাদের এইরকম কিছু করা উচিত:
@Component("parrot-polly")
public class Parrot {
private String name = "Polly";
...
}
এটি স্বয়ংক্রিয় কনফিগারেশনের পুরো পয়েন্ট । আপনি আপনার ক্লাস লিখুন, প্রয়োজনীয় টীকা দিয়ে চিহ্নিত করুন এবং আপনার ক্লাস আছে এমন প্যাকেজ স্প্রিংকে বলুন। এটি সেই প্যাকেজ যা ফ্রেমওয়ার্কের মাধ্যমে টীকা খুঁজে বের করতে এবং এই ক্লাসগুলির অবজেক্ট তৈরি করতে হবে। যাইহোক, স্প্রিং শুধুমাত্র @Component
টীকাগুলিই খোঁজে না, তবে অন্যান্য সমস্ত টীকা যা এটিকে উত্তরাধিকারী করে। উদাহরণস্বরূপ, @Controller
, @RestController
, @Service
, @Repository
, এবং আরও অনেক কিছু, যা আমরা ভবিষ্যতের নিবন্ধগুলিতে উপস্থাপন করব। এখন আমরা Java-ভিত্তিক কনফিগারেশন ব্যবহার করে একই জিনিস করার চেষ্টা করব । শুরু করতে, সরান@Component
আমাদের ক্লাস থেকে টীকা। জিনিসগুলিকে আরও চ্যালেঞ্জিং করতে, কল্পনা করুন যে আমরা এই ক্লাসগুলি লিখিনি, তাই আমরা সহজেই সেগুলি সংশোধন করতে পারি না, যার অর্থ আমরা টীকা যোগ করতে পারি না৷ এটা এই ধরনের ক্লাস কিছু লাইব্রেরিতে প্যাকেজ করা হয়. এই ক্ষেত্রে, আমাদের জন্য এই ক্লাসগুলি সম্পাদনা করার কোন উপায় নেই যাতে তারা স্প্রিং দ্বারা স্বীকৃত হয়। কিন্তু আমরা এই শ্রেণীর বস্তুর প্রয়োজন! এখানে আমাদের অবজেক্ট তৈরি করতে জাভা-ভিত্তিক কনফিগারেশন প্রয়োজন। শুরু করতে, একটি নাম দিয়ে একটি প্যাকেজ তৈরি করুন configs
। এই প্যাকেজে, একটি সাধারণ জাভা ক্লাস তৈরি করুন, এর মতো কিছু MyConfig
, এবং এটিকে @Configuration
টীকা দিয়ে চিহ্নিত করুন।
@Configuration
public class MyConfig {
}
এখন আমাদের পদ্ধতিটি পরিবর্তন করতে হবে main()
, আমরা কীভাবে প্রসঙ্গ তৈরি করি তা পরিবর্তন করে। আমরা হয় স্পষ্টভাবে নির্দেশ করতে পারি কোন ক্লাসে আমাদের কনফিগারেশন আছে:
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class);
যদি আমাদের অনেকগুলি আলাদা ক্লাস থাকে যা মটরশুটি তৈরি করে এবং আমরা সেগুলির কয়েকটিকে একসাথে সংযুক্ত করতে চাই, আমরা কেবল সেখানে সেগুলিকে কমা দ্বারা পৃথক করে নির্দেশ করি:
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfig.class, MyAnotherConfig.class);
এবং যদি আমাদের কাছে সেগুলির অনেকগুলি থাকে এবং আমরা সেগুলিকে একসাথে সংযুক্ত করতে চাই, তবে আমরা কেবল সেগুলির মধ্যে থাকা প্যাকেজের নামটি নির্দেশ করি:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.configs");
এই ক্ষেত্রে, স্প্রিং প্যাকেজের মধ্য দিয়ে যাবে এবং @Configuration
টীকা দিয়ে চিহ্নিত সমস্ত ক্লাস খুঁজে পাবে। ঠিক আছে, এবং যদি আমাদের কাছে সত্যিই একটি বড় প্রোগ্রাম থাকে যেখানে কনফিগারেশনগুলি বিভিন্ন প্যাকেজে বিভক্ত থাকে, তাহলে আমরা কেবল প্যাকেজগুলির নামগুলির একটি কমা-বিভাজিত তালিকা নির্দেশ করি যেখানে কনফিগারেশন রয়েছে:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals.database.configs",
"en.codegym.info.fatfaggy.animals.root.configs",
"en.codegym.info.fatfaggy.animals.web.configs");
অথবা একটি প্যাকেজের নাম যা তাদের সবার জন্য সাধারণ:
ApplicationContext context =
new AnnotationConfigApplicationContext("en.codegym.info.fatfaggy.animals");
আপনি যেভাবে চান তা করতে পারেন, তবে আমার কাছে মনে হচ্ছে প্রথম বিকল্পটি, যা কেবলমাত্র কনফিগারেশন সহ একটি ক্লাস নির্দেশ করে, আমাদের প্রোগ্রামের জন্য সবচেয়ে উপযুক্ত হবে। একটি প্রসঙ্গ তৈরি করার সময়, স্প্রিং টীকা দিয়ে চিহ্নিত ক্লাসগুলি সন্ধান করে @Configuration
এবং এই ক্লাসগুলির নিজস্ব বস্তু তৈরি করবে। এটি টীকা দিয়ে চিহ্নিত পদ্ধতিগুলিকে কল করার চেষ্টা করে @Bean
, যার মানে এই পদ্ধতিগুলি মটরশুটি (বস্তু) ফেরত দেয় যা স্প্রিং প্রসঙ্গে যোগ করবে। এবং এখন আমরা জাভা-ভিত্তিক কনফিগারেশনের সাথে আমাদের ক্লাসে একটি বিড়াল, কুকুর এবং তোতাপাখির জন্য মটরশুটি তৈরি করব। এটি করা বেশ সহজ:
@Bean
public Cat getCat() {
return new Cat();
}
এখানে আমরা ম্যানুয়ালি আমাদের বিড়াল তৈরি করি এবং এটিকে বসন্তের কাছে হস্তান্তর করি, যা তারপরে আমাদের বস্তুটিকে তার প্রসঙ্গে ধরে রাখে। যেহেতু আমরা সুস্পষ্টভাবে আমাদের শিমের একটি নাম দিইনি, তাই স্প্রিং এটিকে পদ্ধতির নামের মতোই নাম দেবে। আমাদের ক্ষেত্রে, বিড়াল বিনকে " getCat
" বলা হবে। কিন্তু যেহেতু আমরা ক্লাস ব্যবহার করি, নাম নয়, পদ্ধতিতে বিড়ালের বিন পেতে main
, শিমের নামটি আমাদের কাছে গুরুত্বপূর্ণ নয়। একইভাবে, একটি কুকুর শিম তৈরি করুন, মনে রাখবেন যে স্প্রিং শিমের পদ্ধতির নাম দেবে। সুস্পষ্টভাবে আমাদের প্যারট শিমের নাম দেওয়ার জন্য, আমরা টীকাটির পরে বন্ধনীতে এর নামটি নির্দেশ করি @Bean
:
@Bean("parrot-polly")
public Object weNeedMoreParrots() {
return new Parrot();
}
আপনি দেখতে পাচ্ছেন, এখানে আমি একটি Object
রিটার্ন টাইপ নির্দেশ করেছি এবং পদ্ধতিটিকে একটি নির্বিচারে নাম দিয়েছি। এটি শিমের নামকে প্রভাবিত করে না, কারণ আমরা এখানে নামটি স্পষ্টভাবে উল্লেখ করেছি। তারপরও, একটি কমবেশি অর্থপূর্ণ রিটার্ন মান এবং পদ্ধতির নাম নির্দেশ করা ভাল। আপনি এক বছরের মধ্যে প্রকল্পটি পুনরায় চালু করার সময় নিজেকে একটি অনুগ্রহ করা ছাড়া অন্য কোন কারণে এটি করুন। :) এখন পরিস্থিতি বিবেচনা করুন যেখানে আমাদের আরেকটি শিম তৈরি করতে একটি শিম প্রয়োজন । উদাহরণস্বরূপ, ধরুন আমরা বিড়ালের বিড়ালের নামটি তোতাপাখির নাম এবং স্ট্রিং "-কিলার" হতে চাই। সমস্যা নেই!
@Bean
public Cat getCat(Parrot parrot) {
Cat cat = new Cat();
cat.setName(parrot.getName() + "-killer");
return cat;
}
এখানে স্প্রিং দেখতে পাবে যে এই মটরশুটি তৈরি করার জন্য, ফ্রেমওয়ার্কটি আগে তৈরি করা প্যারট বিনে পাস করতে হবে। তদনুসারে, এটি পদ্ধতি কলের প্রয়োজনীয় চেইন ব্যবস্থা করবে: প্রথমে, তোতা তৈরির পদ্ধতি বলা হয় এবং তারপর কাঠামোটি নতুন তোতাকে বিড়াল তৈরির পদ্ধতিতে প্রেরণ করে। এখানে যেখানে নির্ভরতা ইনজেকশন কার্যকর হয়: বসন্ত নিজেই আমাদের পদ্ধতিতে প্রয়োজনীয় প্যারট বিন পাস করে। যদি IDEA ভেরিয়েবল নিয়ে বিরক্ত হয় parrot
, তাহলে তোতা তৈরির পদ্ধতির রিটার্ন টাইপ থেকে Object
তে পরিবর্তন করতে ভুলবেন না Parrot
। উপরন্তু, জাভা-ভিত্তিক কনফিগারেশন আপনাকে একেবারে যেকোনো জাভা কোড চালাতে দেয়আপনার শিম তৈরির পদ্ধতিতে। আপনি সত্যিই কিছু করতে পারেন: অন্যান্য সহায়ক বস্তু তৈরি করুন, অন্য যেকোন পদ্ধতিতে কল করুন, এমনকি যেগুলি স্প্রিং টীকা দিয়ে চিহ্নিত করা হয়নি, লুপ তৈরি করুন, বুলিয়ান শর্তাবলী — যা মনে আসে! এটি স্বয়ংক্রিয় কনফিগারেশনের সাথে সম্ভব নয়, এমনকি XML কনফিগারেশনের সাথেও কম। এখন আসুন একটি সমস্যা বিবেচনা করা যাক যা একটু বেশি মজাদার। পলিমরফিজম এবং ইন্টারফেস :) আমরা একটি WeekDay
ইন্টারফেস তৈরি করব এবং 7টি ক্লাস তৈরি করব যা এই ইন্টারফেসটি বাস্তবায়ন করবে: Monday
, Tuesday
, Wednesday
, Thursday
, Friday
, Saturday
, Sunday
. আমরা ইন্টারফেসটিকে একটি String getWeekDayName()
পদ্ধতি দেব, যা সংশ্লিষ্ট ক্লাসের জন্য সপ্তাহের দিনের নাম প্রদান করবে। অন্য কথায়, Monday
ক্লাস ফিরে আসবে "Monday
", ইত্যাদি। অ্যাপ্লিকেশন শুরু করার পরে, ধরুন আমাদের কাজ হল সপ্তাহের বর্তমান দিনের সাথে সামঞ্জস্যপূর্ণ একটি বীন প্রেক্ষাপটে রাখা। ইন্টারফেস বাস্তবায়নকারী সমস্ত ক্লাসের জন্য মটরশুটি নয় - শুধুমাত্র একটি বিন WeekDay
যা আমাদের প্রয়োজন। আপনি করতে পারেন এটি এই মত করুন:
@Bean
public WeekDay getDay() {
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case MONDAY: return new Monday();
case TUESDAY: return new Tuesday();
case WEDNESDAY: return new Wednesday();
case THURSDAY: return new Thursday();
case FRIDAY: return new Friday();
case SATURDAY: return new Saturday();
default: return new Sunday();
}
}
এখানে রিটার্ন টাইপ হল আমাদের ইন্টারফেস। এই পদ্ধতিটি সপ্তাহের বর্তমান দিনের উপর নির্ভর করে ইন্টারফেস বাস্তবায়নকারী ক্লাসগুলির একটির একটি প্রকৃত বস্তু প্রদান করে। এখন আমরা পদ্ধতিতে নিম্নলিখিতগুলি করতে পারি main()
:
WeekDay weekDay = context.getBean(WeekDay.class);
System.out.println("Today is " + weekDay.getWeekDayName() + "!");
আমার জন্য, প্রোগ্রামটি আমাকে বলে যে এটি রবিবার :) আমি আত্মবিশ্বাসী যে আমি যদি আগামীকাল প্রোগ্রামটি চালাই, তবে প্রসঙ্গটি সম্পূর্ণ ভিন্ন বস্তু ধারণ করবে। মনে রাখবেন যে আমরা কেবল ইন্টারফেস ব্যবহার করে বিন পাচ্ছি context.getBean(WeekDay.class)
: স্প্রিং ইন্টারফেস প্রয়োগকারী বিনের জন্য তার প্রসঙ্গ অনুসন্ধান করবে এবং এটি ফিরিয়ে দেবে। তারপর দেখা যাচ্ছে যে আমাদের WeekDay
ভেরিয়েবল একটি সানডে অবজেক্টের সাথে শেষ হয় এবং আমরা এই ভেরিয়েবলের সাথে কাজ করার সাথে সাথে পলিমরফিজমের পরিচিত ধারণাটি প্রযোজ্য হয়। :) এখন সম্মিলিত পদ্ধতি সম্পর্কে কয়েকটি শব্দ , যাতে কিছু মটরশুটি স্প্রিং দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়, কিছু টীকা সহ ক্লাসের জন্য প্যাকেজ স্ক্যান করে @Component
এবং অন্যগুলি জাভা-ভিত্তিক কনফিগারেশন দ্বারা। আমরা এটি বিবেচনা করার সাথে সাথে, আমরা মূল সংস্করণে ফিরে যাব, যেখানে Cat
, Dog
, এবং৷Parrot
ক্লাসগুলি টীকা দিয়ে চিহ্নিত করা হয়েছিল @Component
। ধরুন আমরা স্প্রিং স্বয়ংক্রিয়ভাবে প্যাকেজটি স্ক্যান করে আমাদের প্রাণীদের জন্য মটরশুটি তৈরি করতে চাই entities
, তবে আমরা সপ্তাহের দিনের সাথে একটি শিমও তৈরি করতে চাই, যেমনটি আমরা করেছি। আপনাকে যা করতে হবে তা হল @ComponentScan
ক্লাসের স্তরে টীকা যোগ করুন MyConfig
, যা আমরা প্রসঙ্গ তৈরি করার সময় নির্দেশ করি main()
এবং বন্ধনীতে নির্দেশ করি যে প্যাকেজটি স্ক্যান করা দরকার এবং স্বয়ংক্রিয়ভাবে প্রয়োজনীয় ক্লাসের বিন তৈরি করতে হবে:
@Configuration
@ComponentScan("en.codegym.info.fatfaggy.animals.entities")
public class MyConfig {
@Bean
public WeekDay getDay() {
DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
switch (dayOfWeek) {
case MONDAY: return new Monday();
case TUESDAY: return new Tuesday();
case WEDNESDAY: return new Wednesday();
case THURSDAY: return new Thursday();
case FRIDAY: return new Friday();
case SATURDAY: return new Saturday();
default: return new Sunday();
}
}
}
প্রসঙ্গ তৈরি করার সময়, স্প্রিং দেখে যে এটি MyConfig
ক্লাসটি প্রক্রিয়া করতে হবে। এটি ক্লাসে প্রবেশ করে এবং দেখে যে এটিকে " en.codegym.info.fatfaggy.animals.entities
" প্যাকেজ স্ক্যান করতে হবে এবং সেই ক্লাসগুলির বিন তৈরি করতে হবে, তারপরে এটি MyConfig
ক্লাসের getDay()
পদ্ধতিটি কার্যকর করে এবং WeekDay
প্রসঙ্গে একটি বিন যোগ করে। পদ্ধতিতে main()
, এখন আমাদের প্রয়োজনীয় সমস্ত মটরশুটি অ্যাক্সেস আছে: উভয় প্রাণীর বস্তু এবং সপ্তাহের দিন সহ একটি মটরশুটি। আপনার যদি কখনও স্প্রিং-এর কিছু এক্সএমএল কনফিগারেশন ফাইলও তোলার প্রয়োজন হয়, তাহলে ব্যাখ্যা খুঁজতে আপনি নিজের ওয়েব অনুসন্ধান করতে পারেন :) সারাংশ:
- স্বয়ংক্রিয় কনফিগারেশন ব্যবহার করার চেষ্টা করুন
- স্বয়ংক্রিয় কনফিগারেশনের সময়, প্যাকেজের নাম নির্দেশ করুন যাতে ক্লাসগুলি রয়েছে যার বিনগুলি তৈরি করা দরকার
- এই ক্লাসগুলি
@Component
টীকা দিয়ে চিহ্নিত করা হয়েছে - বসন্ত এই সমস্ত ক্লাসের মধ্য দিয়ে চলে, বস্তু তৈরি করে এবং সেগুলিকে প্রেক্ষাপটে রাখে;
- যদি কোনো কারণে স্বয়ংক্রিয় কনফিগারেশন আমাদের জন্য উপযুক্ত না হয়, আমরা জাভা-ভিত্তিক কনফিগারেশন ব্যবহার করি
- এই ক্ষেত্রে, আমরা একটি সাধারণ জাভা ক্লাস তৈরি করি যার পদ্ধতিগুলি আমাদের প্রয়োজনীয় বস্তুগুলিকে ফিরিয়ে দেয়।
@Configuration
প্রসঙ্গ তৈরি করার সময় কনফিগারেশন সহ একটি নির্দিষ্ট শ্রেণী নির্দেশ করার পরিবর্তে আমরা পুরো প্যাকেজটি স্ক্যান করতে গেলে আমরা এই ক্লাসটিকে টীকা দিয়ে চিহ্নিত করি - এই শ্রেণীর পদ্ধতিগুলি যা মটরশুটি ফেরত দেয় তা
@Bean
টীকা দিয়ে চিহ্নিত করা হয়
@ComponentScan
টীকা ব্যবহার করি।
GO TO FULL VERSION