ফিল্ড ইনজেকশন আসলে কী এবং কীভাবে তা এড়ানো যায়?


130

আমি স্প্রিং এমভিসি এবং পোর্টলেট সম্পর্কে কিছু পোস্টে পড়েছি যে ক্ষেত্রের ইনজেকশন দেওয়ার প্রস্তাব দেওয়া হয় না। আমি এটি বুঝতে পারছি, ফিল্ড ইঞ্জেকশনটি যখন আপনি এর সাথে একটি বিনকে ইনজেক্ট করেন @Autowired:

@Component
public class MyComponent {
    @Autowired
    private Cart cart;
}

আমার গবেষণার সময় আমি কনস্ট্রাক্টর ইঞ্জেকশন সম্পর্কেও পড়েছিলাম :

@Component
public class MyComponent {
    private final Cart cart;

    @Autowired
    public MyComponent(Cart cart){
       this.cart = cart;
    }
}

এই উভয় প্রকারের ইনজেকশনের সুবিধা এবং অসুবিধাগুলি কী?


সম্পাদনা 1: যেহেতু এই প্রশ্নের সদৃশ হিসাবে চিহ্নিত করা হয় এই প্রশ্নের আমি এটা চেক করা। কারণ প্রশ্ন বা উত্তরগুলিতে কোনও কোডের উদাহরণ নেই, তবে আমি কোন ইনজেকশন ধরণের ব্যবহার করছি তা অনুমান করে যদি আমার অনুমান সঠিক হয় তবে তা আমার কাছে পরিষ্কার নয়।


3
ফিল্ড-ইনজেকশন যদি আপনি বর্ণনা হিসাবে খারাপ হয়, তবে বসন্ত কেন এটি অনুমতি দেয়? কোডটি আরও পঠনযোগ্য এবং কম শব্দভাণ্ডারে তৈরি করার ক্ষেত্রে ক্ষেত্রের ইনজেকশনের নিজস্ব সুবিধা রয়েছে। আপনি যদি আপনার কোডিংয়ে যথেষ্ট শৃঙ্খলাবদ্ধ হন তবে আপনি নিশ্চিত হতে পারেন যে আপনি ক্ষেত্রের ইনজেকশন ব্যবহার করলেও জিনিসগুলি ভাঙবে না।
ছাই

@ অ্যাশেস কারণ এটি তখন একটি ঝরঝরে বৈশিষ্ট্য ছিল এবং এর প্রভাবগুলি পুরোপুরি ভাবা হয়নি। একই কারণ Date(int,int,int)বিদ্যমান।
ক্রাইলিস-সতর্কতাবাদী-

উত্তর:


225

ইনজেকশন ধরণের

শিমের মধ্যে নির্ভরতা কীভাবে ইনজেকশন করা যায় তার জন্য তিনটি বিকল্প রয়েছে:

  1. একজন কনস্ট্রাক্টরের মাধ্যমে
  2. সেটার বা অন্যান্য পদ্ধতির মাধ্যমে
  3. প্রতিবিম্ব মাধ্যমে, সরাসরি ক্ষেত্রের মধ্যে

আপনি বিকল্পটি 3 ব্যবহার করছেন That আপনি যখন @Autowiredআপনার ক্ষেত্রের সরাসরি ব্যবহার করেন তখন এটি হ'ল ।


ইনজেকশন গাইডলাইন

একটি সাধারণ নির্দেশিকা যা স্প্রিংয়ের দ্বারা সুপারিশ করা হয় ( কনস্ট্রাক্টর-ভিত্তিক ডিআই বা সেটার ভিত্তিক ডিআই এর বিভাগগুলি দেখুন ):

  • বাধ্যতামূলক নির্ভরতাগুলির জন্য বা অপরিবর্তনীয়তার লক্ষ্যে, কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করুন
  • Orচ্ছিক বা পরিবর্তনযোগ্য নির্ভরতার জন্য, সেটার ইঞ্জেকশনটি ব্যবহার করুন
  • বেশিরভাগ ক্ষেত্রে ফিল্ড ইনজেকশন এড়িয়ে চলুন

ক্ষেত্রের ইনজেকশন ঘাটতি

ক্ষেত্রের ইনজেকশনটির কারণগুলি নীচে নিম্নরূপ:

  • কনস্ট্রাক্টর ইনজেকশন দিয়ে আপনি যেমন পরিবর্তনযোগ্য অবজেক্ট তৈরি করতে পারবেন না
  • আপনার ক্লাসগুলির আপনার ডিআই কনটেইনার সাথে সংযুক্ত সংযোগ রয়েছে এবং এর বাইরে ব্যবহার করা যাবে না
  • আপনার ক্লাসগুলি প্রতিবিম্ব ছাড়াই ইনস্ট্যান্ট করা যাবে না (উদাহরণস্বরূপ ইউনিটের পরীক্ষায়)। এগুলি ইনস্ট্যান্ট করার জন্য আপনার ডিআই কনটেইনার দরকার যা আপনার পরীক্ষাগুলি আরও ইন্টিগ্রেশন পরীক্ষার মতো করে
  • আপনার আসল নির্ভরতা বাইরে থেকে লুকানো এবং আপনার ইন্টারফেসে প্রতিফলিত হয় না (হয় নির্মাতা বা পদ্ধতি)
  • দশটি নির্ভরতা থাকা সত্যিই সহজ। আপনি যদি কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করছিলেন তবে আপনার কাছে দশটি যুক্তিযুক্ত একটি কনস্ট্রাক্টর থাকবেন, যা ইঙ্গিত দেয় যে কোনও কিছু মাছধরা। তবে আপনি অনির্দিষ্টকালের জন্য ফিল্ড ইনজেকশন ব্যবহার করে ইনজেকশনের ক্ষেত্রগুলি যুক্ত করতে পারেন। অনেক বেশি নির্ভরশীলতা থাকা একটি লাল পতাকা যা শ্রেণি সাধারণত একাধিক জিনিস করে এবং এটি একক দায়িত্বের নীতি লঙ্ঘন করতে পারে।

উপসংহার

আপনার প্রয়োজনের উপর নির্ভর করে আপনার প্রাথমিকভাবে কনস্ট্রাক্টর ইনজেকশন বা কনস্ট্রাক্টর এবং সেটার ইঞ্জেকশনটির কিছু মিশ্রণ ব্যবহার করা উচিত। ফিল্ড ইনজেকশনের অনেকগুলি ত্রুটি রয়েছে এবং এড়ানো উচিত। ক্ষেত্রের ইনজেকশনের একমাত্র সুবিধা হ'ল এটি লেখার পক্ষে আরও সুবিধাজনক, যা সমস্ত বিপর্যয়ের চেয়ে বেশি নয়।


আরও পড়া

ক্ষেত্রের ইনজেকশন কেন সাধারণত সুপারিশ করা হয় না সে সম্পর্কে আমি একটি ব্লগ নিবন্ধ লিখেছিলাম: ফিল্ড নির্ভরতা ইনজেকশনটি ক্ষতিকারক হিসাবে বিবেচিত


12
এটি সাধারণত ভাল ধারণা নয় এবং বিশ্বকে "ফিল্ড ইনজেকশন এড়ানো উচিত" বলা ভাল নয়। উপকারিতা এবং বিপরীতে দেখান এবং অন্যকে নিজের সিদ্ধান্ত নিতে দিন;) অনেকের কাছে জিনিসগুলির দেখার নিজস্ব অভিজ্ঞতা এবং নিজস্ব উপায় রয়েছে।
ডাইটার

6
এখানে এটি হতে পারে, তবে অন্যান্য ক্ষেত্রেও রয়েছে যেখানে কিছুটা নিরুৎসাহিত করার জন্য সম্প্রদায়টি সাধারণ sensকমত্যে এসেছে। উদাহরণস্বরূপ, হাঙ্গেরীয় নোটেশনটি ধরুন।
জান্নিক

আপনি পরীক্ষাযোগ্যতা এবং নির্ভরতার দৃশ্যমানতা হিসাবে কিছু ভাল পয়েন্ট দেন তবে আমি সবার সাথে একমত নই। কনস্ট্রাক্টর ইনজেকশনের কোনও ত্রুটি নেই? ক্লাসে ইনজেকশনের জন্য 5 বা 6 টি ক্ষেত্র থাকা যা কলটির আসল রচনাগুলি সম্পাদন করে তা কাম্য হতে পারে। অপরিবর্তনীয়তা নিয়েও আমি আপনার সাথে একমত নই। চূড়ান্ত ক্ষেত্র থাকা একটি শ্রেণি অপরিবর্তনীয় হওয়া বাধ্যতামূলক নয়। এটা ভাল। যা খুব আলাদা।
ডেভিডএক্সএক্সএক্সএক্স

আমি তোমাদের অভিপ্রেত মনে হয় "বাধ্যতামূলক নির্ভরতা জন্য অথবা যখন জন্য নিশানা অপরিবর্তনীয়তা "
অ্যালেক্স Terreaux

1
আমি উত্তরটির শুরুতে লিঙ্কটি উল্লেখ করছিলাম যা স্প্রিং ডক্সের সাথে লিঙ্ক করে
ভোজটেক রুজিকা

47

এটি সফ্টওয়্যার বিকাশে কখনও শেষ না হওয়া আলোচনার মধ্যে একটি, তবে শিল্পের বড় প্রভাবশালীরা বিষয়টি সম্পর্কে আরও মতামত পাচ্ছেন এবং আরও ভাল বিকল্প হিসাবে কনস্ট্রাক্টর ইঞ্জেকশন দেওয়ার পরামর্শ দিতে শুরু করেছেন।

কনস্ট্রাক্টর ইনজেকশন

পেশাদাররা:

  • আরও ভাল পরীক্ষাযোগ্যতা । ইউনিট পরীক্ষায় আপনার কোনও উপহাস লাইব্রেরি বা একটি বসন্ত প্রসঙ্গে দরকার নেই। আপনি নতুন কীওয়ার্ড দিয়ে পরীক্ষা করতে চান এমন একটি সামগ্রী আপনি তৈরি করতে পারেন । এ জাতীয় পরীক্ষা সর্বদা দ্রুত হয় কারণ তারা প্রতিবিম্ব ব্যবস্থার উপর নির্ভর করে না। ( এই প্রশ্নটি 30 মিনিট পরে জিজ্ঞাসা করা হয়েছিল the লেখক যদি কন্সট্রাক্টর ইনজেকশন ব্যবহার করেন তবে তা উপস্থিত না হত)।
  • অপরিচ্ছন্নতা । নির্ভরতা সেট হয়ে গেলে সেগুলি পরিবর্তন করা যায় না।
  • নিরাপদ কোড । কনস্ট্রাক্টর কার্যকর হওয়ার পরে আপনার অবজেক্টটি ব্যবহারের জন্য প্রস্তুত কারণ আপনি প্যারামিটার হিসাবে পাস হওয়া কোনও কিছুকে বৈধতা দিতে পারেন। অবজেক্টটি প্রস্তুত থাকতে পারে বা নাও হতে পারে, এর মধ্যে কোনও রাজ্য নেই। ক্ষেত্রের ইনজেকশন সহ যখন আপনি বস্তুটি ভঙ্গুর হবে তখন আপনি একটি মধ্যবর্তী পদক্ষেপ প্রবর্তন করুন।
  • বাধ্যতামূলক নির্ভরতাগুলির পরিষ্কার অভিব্যক্তি । ক্ষেত্রের ইনজেকশন এ ক্ষেত্রে অস্পষ্ট।
  • বিকাশকারীদের নকশা সম্পর্কে চিন্তাভাবনা করে । ডিআইটি 8 টি প্যারামিটার সহ একটি নির্মাণকারী সম্পর্কে লিখেছেন, যা আসলে একটি খারাপ ডিজাইনের লক্ষণ এবং Godশ্বর অ্যান্টি-প্যাটার্নকে আপত্তি করে । কোনও শ্রেণীর তার নির্মাতা বা ক্ষেত্রগুলিতে 8 নির্ভরতা রয়েছে তা বিবেচনা করে না, এটি সর্বদা ভুল। লোকেরা ক্ষেত্রগুলির মাধ্যমে কোনও কনস্ট্রাক্টরের বেশি নির্ভরতা যুক্ত করতে নারাজ। এটি আপনার মস্তিষ্কের সংকেত হিসাবে কাজ করে যে আপনার কিছুক্ষণের জন্য থেমে থাকা উচিত এবং আপনার কোড গঠন সম্পর্কে ভাবা উচিত।

কনস:

  • আরও কোড (তবে আধুনিক আইডিইগুলি ব্যথা উপশম করে)।

মূলত, ক্ষেত্রের ইনজেকশনটি এর বিপরীত।


1
পরীক্ষার যোগ্যতা, হ্যাঁ, ক্ষেত্রের ইনজেকশন করা মটরশুটিটি উপহাস করা আমার পক্ষে দুঃস্বপ্ন। একবার, আমি কনস্ট্রাক্টর ইঞ্জেকশনটি ব্যবহার করেছি, আমার কোনও অপ্রয়োজনীয় উপহাস করার দরকার নেই
কেনবিয়ান

25

আগ্রহের বস্তু. এটা তোমার সিদ্ধান্ত.

তবে আমি ব্যাখ্যা করতে পারি, কেন আমি কখনই কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করি না ।

  1. আমি আমার সব জন্য একটি কন্সট্রাকটর বাস্তবায়ন করতে না চান @Service, @Repositoryএবং @Controllerমটরশুটি। মানে, প্রায় 40-50 মটরশুটি রয়েছে। প্রতিবার আমি যদি নতুন ক্ষেত্র যুক্ত করি তবে আমাকে কনস্ট্রাক্টরটি প্রসারিত করতে হবে। না, আমি এটি চাই না এবং আমারও দরকার নেই।

  2. যদি আপনার শিম (পরিষেবা বা নিয়ন্ত্রণকারী) এর জন্য আরও অনেক সিম ইনজেকশনের প্রয়োজন হয়? 4+ পরামিতি সহ একটি নির্মাতা খুব কুরুচিপূর্ণ।

  3. আমি যদি সিডিআই ব্যবহার করি তবে কনস্ট্রাক্টর আমাকে চিন্তিত করবেন না।


সম্পাদনা # 1 : ভোজটেক রুজিকা বলেছেন:

শ্রেণীর অনেক বেশি নির্ভরশীলতা রয়েছে এবং সম্ভবত তারা একক দায়িত্বের নীতি লঙ্ঘন করছে এবং এটি পুনঃসংশ্লিষ্ট হওয়া উচিত

হ্যাঁ. তত্ত্ব এবং বাস্তবতা। এখানে উদাহরণস্বরূপ: DashboardControllerএকক পথে ম্যাপ করা হয়েছে *:8080/dashboard

আমার DashboardControllerঅন্যান্য পরিষেবাগুলি থেকে ড্যাশবোর্ড / সিস্টেম ওভারভিউ পৃষ্ঠায় প্রদর্শন করতে প্রচুর তথ্য সংগ্রহ করে। আমার এই একক নিয়ামক দরকার। সুতরাং আমি কেবলমাত্র এই একটি পাথ সুরক্ষিত করতে পারি (বেসিক লেখক বা ব্যবহারকারীর ভূমিকা ফিল্টার)।

সম্পাদনা # 2 : যেহেতু সবাই কনস্ট্রাক্টরের 8 টি পরামিতিগুলিতে ফোকাস করছে ... এটি একটি বাস্তব-বিশ্বের উদাহরণ ছিল - গ্রাহকের উত্তরাধিকারের কোড। আমি যে পরিবর্তন করেছি। একই যুক্তি 4+ পরামিতিগুলির জন্য আমার জন্য প্রযোজ্য।

এগুলি সব কোড ইনজেকশন সম্পর্কিত, উদাহরণস্বরূপ নির্মাণ নয়।


34
8 টি নির্ভরতা সহ খুব কুরুচিপূর্ণ নির্মাতা প্রকৃতপক্ষে দুর্দান্ত কারণ এটি একটি লাল পতাকা হিসাবে কিছু ভুল হয়েছে যে শ্রেণীর অনেকগুলি নির্ভরশীলতা রয়েছে এবং সম্ভবত এটি একক দায়িত্বের নীতি লঙ্ঘন করছে এবং এটি পুনঃসংশ্লিষ্ট হওয়া উচিত। এটি আসলে একটি ভাল জিনিস।
ভোজটেক রুজিকা

6
@ ভোজটেক রুজিকা এটি নিশ্চিতভাবে ভাল না তবে কখনও কখনও আপনি এড়াতে পারবেন না।
ডাইটার

4
আমি 3 এর থাম্বের একটি নিয়ম বলব, 40-50 একা ছেড়ে দেওয়া যাক, যে কোনও শ্রেণীর জন্য নির্ভরতা এমন একটি চিহ্ন হতে হবে যা আপনাকে রিফ্যাক্টর করার দরকার। 40 নির্ভরতা সহ কোনও শ্রেণি একক দায়িত্বের অধ্যক্ষ বা উন্মুক্ত / নিকটতম অধ্যক্ষের সাথে লেগে থাকার কোনও উপায় নেই।
আমিন জে

4
@ আমিনজে বিধিটি দুর্দান্ত তবে বাস্তবতা ভিন্ন। আমি যে সংস্থাটিতে কাজ করছি তার বয়স 20 বছরেরও বেশি এবং আমাদের প্রচুর লিগ্যাসি কোড রয়েছে। রিফ্যাক্টরিং একটি ভাল ধারণা, তবে এটির জন্য অর্থ ব্যয় হয়। এছাড়াও আমি জানি না কেন এটি বলছে তবে আমি 40-50 নির্ভরতা বোঝাতে চাইনি, আমার অর্থ 40-50 মটরশুটি, উপাদানগুলি, মডিউলগুলি ...
ডাইটার

7
@ ডিড, আপনার পরিস্থিতি স্পষ্টভাবে একটি যার মধ্যে প্রযুক্তিগত debtণ আপনাকে উপ-অনুকূল পছন্দগুলি তৈরি করতে বাধ্য করছে। আপনার নিজের কথায়, আপনি এমন পরিস্থিতিতে আছেন যেখানে আপনার সিদ্ধান্ত গ্রহণটি বিশ বছরেরও বেশি পুরানো লিগ্যাসি কোড দ্বারা উল্লেখযোগ্যভাবে প্রভাবিত হয়। কোনও নতুন প্রকল্প শুরু করার সময়, আপনি কি এখনও ফিল্ড ইনজেকশন, ওভার কনস্ট্রাক্টর ইনজেকশন দেওয়ার পরামর্শ দিবেন? কোন ক্ষেত্রে আপনি ক্ষেত্রের ইনজেকশনটি বেছে নেবেন তা নির্দেশ করার জন্য আপনার উত্তরটিতে একটি সতর্কতা অবলম্বন করা উচিত।
উমর ফারুক খাজা

0

আরও একটি মন্তব্য - ভোজটেক রুজিকা জানিয়েছেন যে স্প্রিং শিমকে এ জাতীয় তিনটি উপায়ে সংক্রামিত করে (সর্বাধিক সংখ্যক পয়েন্টের উত্তর):

  1. একজন কনস্ট্রাক্টরের মাধ্যমে
  2. সেটার বা অন্যান্য পদ্ধতির মাধ্যমে
  3. প্রতিবিম্ব মাধ্যমে, সরাসরি ক্ষেত্রের মধ্যে

এই উত্তরটি ভুল - কারণ প্রতিটি ধরণের ইনজেকশন স্প্রিংয়ের ব্যবহার প্রতিবিম্বিত হয়! আইডিই ব্যবহার করুন, সেটার / কনস্ট্রাক্টরের উপর ব্রেক ব্রেকপয়েন্ট সেট করুন এবং চেক করুন।

এটি স্বাদের বিষয় হতে পারে তবে এটি কোনও সিএসইর বিষয়ও হতে পারে। ফিল্ড ইনজেকশন আরও ভাল হলে @ ডিটার একটি দুর্দান্ত কেস সরবরাহ করেছিলেন। যদি আপনি বসন্তের প্রসঙ্গ স্থাপন করে যা ইন্টিগ্রেশন টেস্টগুলিতে ফিল্ড ইনজেকশন ব্যবহার করেন - শ্রেণীর পরীক্ষার সাথে যুক্তিটিও অবৈধ - যদি না আপনি আপনার ইন্টিগ্রেশন পরীক্ষায় পরীক্ষাগুলিতে পরে লিখতে চান;)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.