বসন্ত @ অটোভায়ার্ড ব্যবহার


218

@ অটোয়ারওয়্যার ব্যবহারের পক্ষে কি কি মতামত আছে? হয়ে যাওয়া ক্লাসে রয়েছে?

কেবল পরিষ্কার করতেই, আমি এক্সএমএলে অটো-ওয়্যারিং নয়, @ অটোয়ার্ডেড টিকা সম্পর্কে বিশেষভাবে কথা বলছি ।

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


4
আমি এই বিষয়েও আগ্রহী - এক্সএমএলটির পরিবর্তে টীকাগুলির মাধ্যমে আপনার এমভিসি অ্যাপ্লিকেশনটি কনফিগার করা দেখে মনে হচ্ছে এটি "এই ইউআরএলে কোন শ্রেণীর ম্যাপযুক্ত?" "কে এটি পরিচালনা করছে?"। আমি একটি একক কনফিগারেশন উত্স পেতে চাই
ম্যাট বি

6
"@ অটোয়ারিং" শব্দটি এখানে বিভ্রান্ত বলে মনে হচ্ছে। আপনি যেমন এক্সএমএল কনফিগারেশনের সাথে অটোয়ারিংও করতে পারেন, মূল প্রশ্নটি "স্প্রিং টীকা ব্যবহারের পক্ষে এবং কৌশলগুলি" হিসাবে পুনরায় করা উচিত। প্রদত্ত উত্তরটি অটোয়ারিংয়ের দিকগুলিতে বেশি এবং টিকা ব্যবহারের দিকগুলিতে কম মনোনিবেশ করে।
নিম প্র্যাক্স

উত্তর:


253

দীর্ঘদিন ধরে আমি বিশ্বাস করেছিলাম যে আমরা যে সমস্ত এক্সএমএল ফাইল ব্যবহার করতাম তার মতো একটি "কেন্দ্রীভূত, ঘোষিত, কনফিগারেশন" থাকার একটি মূল্য রয়েছে। তখন আমি বুঝতে পেরেছিলাম যে ফাইলগুলির বেশিরভাগ স্টাফ কনফিগারেশন নয় - এটি কখনও কখনও বিকাশের পরে পরিবর্তিত হয়নি। তখন আমি বুঝতে পেরেছিলাম যে "কেন্দ্রীভূত" এর বেশিরভাগ ছোট সিস্টেমে মূল্য রয়েছে - কেবলমাত্র ছোট সিস্টেমে আপনি সামগ্রিকভাবে কোনও কনফিগারেশন ফাইল আঁকতে সক্ষম হবেন । এবং সামগ্রিকভাবে ওয়্যারিংগুলি বোঝার আসলে কী মূল্য হয়, যখন একই "ওয়্যারিংস" বেশিরভাগ কোডে নির্ভরতা দ্বারা নকল হয়? সুতরাং আমি কেবল একমাত্র জিনিসটি হ'ল মেটা ডেটা (টিকা), যা এখনও উদার-উদ্বেগজনক। এগুলি রানটাইমের সময় কখনও পরিবর্তন হয় না এবং সেগুলি কখনই হয় না "কনফিগারেশন" ডেটা যে কেউ ফ্লাইতে পরিবর্তিত হবে - তাই আমি মনে করি এটি কোডে রাখা ভাল।

আমি যতটা পারি পুরো অটো-ওয়্যারিং ব্যবহার করি। আমি এটা ভালোবাসি. বন্দুকের পয়েন্টে হুমকি না দেওয়া হলে আমি পুরানো ধাঁচের বসন্তে ফিরে যাব না। পুরোপুরি পছন্দ করার জন্য আমার কারণগুলি@Autowired সময়ের সাথে সাথে পরিবর্তিত হয়েছে।

এই মুহুর্তে আমি মনে করি স্বয়ংক্রিয়তা ব্যবহারের সর্বাধিক গুরুত্বপূর্ণ কারণ হ'ল আপনার সিস্টেমে ট্র্যাক রাখতে আরও কম বিমূর্ততা রয়েছে। "শিমের নাম" কার্যকরভাবে চলে গেছে। এটি সিমের নামটি কেবলমাত্র xML- এর কারণে বিদ্যমান। সুতরাং অ্যাবস্ট্রাক্ট ইন্ডায়ায়ারেশনের একটি সম্পূর্ণ স্তর (যেখানে আপনি শিমের নাম "ফু" শিম "বার" তে যুক্ত করবেন) চলে গেছে। এখন আমি সরাসরি আমার শিমের মধ্যে "ফু" ইন্টারফেসটি ওয়্যার করি এবং বাস্তবায়ন রান-টাইম প্রোফাইল দ্বারা নির্বাচিত হয়। এটি আমাকে প্রয়োগের ক্ষেত্রে কী কোডনির্ভরতা এবং বাস্তবায়নগুলি ট্রেস । আমি যখন আমার কোডটিতে একটি স্বায়িত নির্ভরতা দেখি তখন আমি কেবল আমার আইডিইতে "প্রয়োগের দিকে যেতে" কী টিপতে পারি এবং পরিচিত বাস্তবায়নের তালিকাতে আসে। বেশিরভাগ ক্ষেত্রে একটি মাত্র বাস্তবায়ন হয় এবং আমি সরাসরি ক্লাসে আছি। করতে পারা' প্রয়োগ করা হচ্ছে তা নিয়ে কাজ করার অনুমতি দেয় (আমি দাবি করি যে এক্সএমএল ওয়্যারিংয়ের সাথে বিপরীত সত্যের আরও কাছাকাছি - কীভাবে আপনার দৃষ্টিভঙ্গি বদলে যায় মজার!)

এখন আপনি বলতে পারেন যে এটি কেবল একটি খুব সাধারণ স্তর, তবে বিমূর্ততার প্রতিটি স্তর যা আমরা আমাদের সিস্টেমগুলিতে যুক্ত করি তাতে জটিলতা বাড়ে । আমি সত্যিই মনে করি না যে এক্সএমএল আমি যে কোনও সিস্টেমে কাজ করেছি তাতে কোনও আসল মান যুক্ত করেছে।

বেশিরভাগ সিস্টেমে আমি এর সাথে কাজ করেছি কেবলমাত্র উত্পাদন রানটাইম পরিবেশের একটি কনফিগারেশন রয়েছে। পরীক্ষার জন্য অন্যান্য কনফিগারেশন ইত্যাদিও থাকতে পারে।

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

আমরা আমাদের কনফিগারেশনে খুব কমই বাছাইপর্ব ব্যবহার করেছি এবং এই পরিস্থিতিগুলি সমাধান করার জন্য অন্যান্য উপায় খুঁজে পেয়েছি। এটি আমাদের একটি স্পষ্ট "অসুবিধা" যার মুখোমুখি: আমরা এটিকে অটোয়ারিংয়ের সাথে মসৃণ ইন্টারেক্ট করার জন্য কোড করার পদ্ধতিটি কিছুটা পরিবর্তন করেছি: গ্রাহক সংগ্রহস্থল আর জেনেরিক Repository<Customer>ইন্টারফেস প্রয়োগ করে না তবে আমরা একটি ইন্টারফেস তৈরি করিCustomerRepository যা প্রসারিত হয় Repository<Customer>। সাব-ক্লাসিংয়ের ক্ষেত্রে কখনও কখনও একটি কৌশল বা দুটিও থাকে। তবে এটি সাধারণত আমাদের আরও শক্তিশালী টাইপিংয়ের দিকে নির্দেশ করে, যা আমি পাই প্রায়শই একটি ভাল সমাধান।

তবে হ্যাঁ, আপনি ডিআই এর একটি নির্দিষ্ট স্টাইলে বেঁধে দিচ্ছেন যা বেশিরভাগ বসন্তে। আমরা এমনকি নির্ভরতার জন্য সর্বজনীন সেটটারগুলি আর করি না (সুতরাং আপনি তর্ক করতে পারেন যে আমরা এনক্যাপসুলেশন / তথ্য গোপনীয়করণ বিভাগে +1 করছি) আমাদের সিস্টেমে এখনও কিছু এক্সএমএল রয়েছে , তবে এক্সএমএলটি মূলত কেবলমাত্র ব্যতিক্রমগুলি ধারণ করে। সম্পূর্ণ অটোয়রিং xML এর সাথে দুর্দান্তভাবে সংহত করে।

আমাদের এখন প্রয়োজন কেবলমাত্র একটিটির জন্য @Component, @Autowiredএবং বাকিগুলি জেএসআর-তে অন্তর্ভুক্ত করা হবে ( জেএসআর-250 ) যেমন আমাদের বসন্তের সাথে জোটে না। অতীতে ঘটনাগুলি এভাবেই ঘটেছিল ( java.util.concurrentস্টাফগুলি মনে মনে স্প্রিংস), সুতরাং এটি আবার ঘটলে আমি পুরোপুরি অবাক হব না।


5
Javax.annotation / javax.inject বসন্ত দ্বারা সমর্থিত তাই আপনার বসন্তে কোড নির্ভরতা রাখবেন না।
মাইকেল উইলস

26

আমার জন্য স্প্রিং এবং অটো-ওয়্যারিং সম্পর্কে আমি যা পছন্দ করি / অপছন্দ করি তা এখানে।

পেশাদাররা:

  • অটো-ওয়্যারিং কদর্য XML কনফিগারেশন থেকে মুক্তি পেয়েছে rid
  • টীকাগুলি ব্যবহার করা অনেক সহজ যা আপনাকে সরাসরি ক্ষেত্র, সেটার পদ্ধতি বা কনস্ট্রাক্টর ব্যবহার করে ইনজেক্ট করতে দেয়। এছাড়াও আপনাকে আপনার ইনজেকশন করা মটরশুটিটি টিকিয়ে দিতে এবং 'যোগ্যতা' দেওয়ার অনুমতি দেয়।

কনস:

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

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

আমি মনে করি অটো-ওয়্যারিং হ'ল একটি অর্জিত স্বাদ, আপনি এটির অভ্যস্ত হয়ে গেলে আপনি বুঝতে পারবেন এক্সএমএল কনফিগারেশনের তুলনায় এটি কতটা শক্তিশালী, সহজ, এবং মাথা ব্যাথার চেয়ে কম কাজ করে।


3
XML কনফিগারেশন অনেক কম কদর্য পায় যদি আপনি বিনামূল্যে Springsource টুল সুইট, যা স্বয়ংক্রিয়ভাবে অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে ব্যবহার করেন, শিম সুত্রাবলী নকশা ইত্যাদি
শন প্যাট্রিক ফ্লয়েড

অটো-ওয়্যারিং অগোছালো হয়ে ওঠে এবং বসন্তের লাইব্রেরিতে নির্ভর করে আমি আপনার সাথে সম্পূর্ণ একমত! আমি কখনই এক্সএমএল কনফিগারেশন ব্যবহার করি নি এবং ভাবছি আমার সম্ভবত সেই পথে নামতে হবে?
জেমস 111

15

আমরা আমাদের বড় প্রকল্পে @ অটোয়ার থেকে এক্সএমএল কনফিগারেশনে ফিরে যাচ্ছি। সমস্যাটি খুব কম বুটস্ট্র্যাপের কর্মক্ষমতা। অটোয়রিং স্ক্যানার অনুসন্ধান ক্লাসপথ থেকে অটোওয়্যারিংয়ের সমস্ত ক্লাস লোড করে, সুতরাং, বসন্তের সূচনা করার সময় প্রচুর ক্লাস আগ্রহের সাথে লোড করা হয়।


1
আমি দেখতে পেয়েছি যে জাভাকনফিগ আংশিক প্রসঙ্গ শুরু করার জন্য আরও ভাল সমাধান হতে পারে, এটি একটি বড় জয় তবে আপনি কনট্রাক্টরগুলিতে @ অটোওয়ার্ড / @ ইনজেকশন ব্যবহার করে এগুলি বেশ সহজেই একত্রিত করতে পারেন (অন্য কথায়, কনস্ট্রাক্টর ইনজেকশনটিতে স্যুইচ করুন)।
krosenvold

6

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

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

এটি কাজ করা উচিত, তবে কোনও ভাল সমাধান নয় ইমো।


আমি এই সম্পর্কে একটি পৃথক থ্রেডে খোলা, এবং স্প্রিং সঙ্গে একটি সমাধান পাওয়া যাবে @Profilesএবং @Configuration: blog.springsource.org/2011/02/14/... আরও দেখুন অন্যান্য থ্রেড: stackoverflow.com/questions/13490393/...
BTakacs

4

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

ইনটেলিজ স্প্রিং টীকাগুলির জন্য ভাল (নিখুঁত নয়) সহায়তা সরবরাহ করে।


3

এই বিষয়ে আমার গ্রহণযোগ্যতা হল, এক্সএমএল কনফিগারেশন কোডের স্পষ্টতা হ্রাস করে, বিশেষত বৃহত সিস্টেমে।

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

আমি মাঝের মাটিতে লেগে থাকি যেখানে আমি আমার কনফিগারেশন ক্লাস (এস), (জাভা ভিত্তিক স্প্রিং কনফিগারেশন @ কনফিগারেশন ব্যবহার করে) ঘোষণা করি

আমি আমার সমস্ত মটরশুটিটি কনফিগারেশন ক্লাসে স্পষ্টভাবে ঘোষণা করি (এস)। আমি কেবল কনফিগারেশন ক্লাসে (অ্যাসোসিয়েটেড) স্বতঃ @ ব্যবহার করি, উদ্দেশ্যটি হ'ল বসন্তের উপর নির্ভরশীলতাটি কনফিগারেশন ক্লাসের মধ্যে সীমাবদ্ধ করা (এস)

@ কনফিগারেশনটি নির্দিষ্ট প্যাকেজে থাকে, কেবলমাত্র একমাত্র জায়গা যেখানে বসন্তের স্ক্যান চালিত হয়। (এটি বড় প্রকল্পগুলিতে প্রারম্ভিক সময়ের গতি বাড়িয়ে দেয়)

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

বস্তুগুলি তৈরির পরে পরিবর্তনের সম্ভাবনাগুলি হ্রাস করা, বৃহত সিস্টেমে ত্রুটিগুলি যথেষ্ট পরিমাণে হ্রাস করার পাশাপাশি কোনও উপস্থিত থাকার সময় কোনও বাগ খুঁজে পাওয়ার সময়কে হ্রাস করে।

এটিও মনে হয় যে এটি বিকাশকারীকে সিস্টেমের বিভিন্ন অংশের মধ্যে মিথস্ক্রিয়াটি আরও ভালভাবে ডিজাইন করতে বাধ্য করে। সমস্যা এবং বাগগুলি আরও বেশি সংকলনের ত্রুটি হয়ে ওঠে, যা নষ্ট সময় হ্রাস করে এবং উত্পাদনশীলতা উন্নত করে।


1

এখানে কিছু অভিজ্ঞ
পেশাদার রয়েছে

  • কনফিগার করা সহজ করে তোলে কারণ আমরা কেবলমাত্র @ অটোয়ার টীকা ব্যবহার করতে পারি
  • সেটার পদ্ধতি ব্যবহার করতে চাই না, সুতরাং ক্লাস আরও পরিষ্কার হবে

কনস

  • আমরা ডিআইআই ব্যবহার করা সত্ত্বেও XML ফাইল থেকে শক্তভাবে দম্পতি
  • বাস্তবায়ন খুঁজে পাওয়া শক্ত (তবে আপনি যদি ইন্টেলিজের মতো ভাল উপায়ে ব্যবহার করেন তবে নিশ্চিত হন যে আপনি এ থেকে মুক্তি পেতে পারেন)

আমার ব্যক্তিগত অভিজ্ঞতা হিসাবে আমি @ অটোওয়্যার টীকাটি এতটা ব্যবহার করি নি তবে পরীক্ষার ক্ষেত্রে।


1

আমি এক্সএমএল পরিবর্তে টীকা সহ লিখতে পছন্দ করি। স্প্রিং ম্যানুয়াল এবং শেষ সংস্করণ অনুসারে, এক্সএমএল এবং টীকাগুলি একই ফলাফল অর্জন করেছে।

এটি আমার তালিকা

প্রো:

  • এক্সএমএল থেকে অকেজো লাইন সরান
  • ডিবাগিং কোডটি সরল করুন: আপনি কোনও ক্লাস খুললে ক্লাসে যা আছে তা আপনি পড়তে পারেন
  • আরও দ্রুত বিকাশ, এক্সএমএলের 400 বা ততোধিক লাইনের একটি প্রকল্প পাঠযোগ্য?

কনস:

  • মানক জাভা বাস্তবায়ন নয়, তবে আপনি @ ইনজেক্টটি ব্যবহার করতে পারেন, এটি একটি জাভা স্ট্যান্ডার্ড এপি, সুতরাং শিমটি পজো হিসাবে থাকবে
  • আপনি কেবল যেকোন জায়গায় ডিবি সংযোগ ই ব্যবহার করতে পারবেন না তবে এটি কেবল একটি মতামত, আমি এমন একটি জায়গা পছন্দ করি যেখানে সমস্ত কনফিগারেশন পড়ে read

0

আমার বোঝার জন্য @ অ্যাটুওয়ার্ডটি ইন্টারফেসের রেফারেন্সটি উল্লেখ করার সময় ব্যবহার করা সবচেয়ে ভাল এবং এর ওভাররাইড ফান্টগুলি ব্যবহার করে তবে আমি কেবল এটির সাথেই সমস্যাটি খুঁজে পাই যে এটি কখনও কখনও রানটাইমের সময় নালাকে দেওয়া হয়।

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