বসন্ত: আমরা কেন ইন্টারফেসটি স্বায়ত্তশাসিত করব এবং বাস্তবায়িত শ্রেণি নয়?


142

উদাহরণ

interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b") 
  IA worker;

  worker.someFunction();
}

কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে.

  • বসন্ত কীভাবে জানতে পারে যে কোন পলিমারফিক ব্যবহার করতে হবে।
  • আমার দরকার @Qualifierনাকি @Resource?
  • আমরা কেন ইন্টারফেসটির স্বায়ত্তশাসন করি এবং প্রয়োগকৃত শ্রেণিটি না?

10
আপনি ইন্টারফেসটি স্বতঃপরিবর্তন করেন যাতে আপনি একটি পৃথক বাস্তবায়নে ওয়্যার করতে পারেন - এটি ইন্টারফেসে কোডিংয়ের অন্যতম বিষয়, শ্রেণি নয়।
ডেভ নিউটন

আপনি একটি ভিন্ন প্রয়োগে তারে চাই; আমি প্রশ্নটি বুঝতে পারি না।
ডেভ নিউটন

যদি আমরা ইন্টারফেসে ওয়্যারিং করি তবে ইমপ্ল ক্লাসের মধ্যে যখন আমার অ্যাক্সেসের প্রয়োজন সেখানে কোনও ডিফল্ট দৃশ্যমানতা পদ্ধতি উপস্থিত থাকে তখন কী ঘটে? আমি ইন্টারফেসে এই পদ্ধতিটি স্টাবটি যুক্ত করতে পারি না কারণ পাবলিক ইন্টারফেসে ডিফল্ট সংশোধক থাকতে পারে না।
jlewkovich


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

উত্তর:


224

বসন্ত কীভাবে জানতে পারে যে কোন পলিমারফিক ব্যবহার করতে হবে।

যতক্ষণ না কেবল ইন্টারফেসের একক প্রয়োগ রয়েছে এবং সেই প্রয়োগটি @Componentস্প্রিংয়ের উপাদান স্ক্যান সক্ষম করে তা বর্ণিত হয় , স্প্রিং ফ্রেমওয়ার্কটি (ইন্টারফেস, বাস্তবায়ন) জোড়াটি খুঁজে পেতে পারে। যদি উপাদান স্ক্যান সক্ষম না করা থাকে, তবে আপনাকে আপনার অ্যাপ্লিকেশন-কনফিগারেশন.এক্সএমএল (বা সমতুল্য বসন্তের কনফিগারেশন ফাইল) এ শিমের স্পষ্টরূপে সংজ্ঞা দিতে হবে।

আমার কি কি কোয়ালিফায়ার বা @ রিসোর্স দরকার?

আপনার একবারে একাধিক বাস্তবায়ন হয়ে গেলে, তারপরে আপনার প্রত্যেককেই যোগ্যতা অর্জন করতে হবে এবং অটো-ওয়্যারিংয়ের সময়, আপনাকে @Qualifierটীকা সহ সঠিক প্রয়োগকরণ ইনজেক্ট করার জন্য টিকাটি ব্যবহার করতে হবে @Autowired। আপনি যদি @ রিসোর্স (J2EE শব্দার্থবিজ্ঞান) ব্যবহার করে থাকেন তবে আপনার এই টীকাটির nameবৈশিষ্ট্যটি ব্যবহার করে শিমের নামটি নির্দিষ্ট করা উচিত ।

আমরা কেন ইন্টারফেসটির স্বায়ত্তশাসন করি এবং প্রয়োগকৃত শ্রেণিটি না?

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

interface IA
{
  public void someFunction();
}


class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

আপনার শিমের কনফিগারেশনটি দেখতে এমন হওয়া উচিত:

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

বিকল্পভাবে, আপনি যদি প্যাকেজগুলির মধ্যে উপস্থিত উপাদানগুলি স্ক্যান সক্ষম করে থাকেন তবে আপনার @Componentনিম্নরূপ হিসাবে প্রতিটি শ্রেণীর যোগ্যতা অর্জন করা উচিত :

interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component    
class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

তারপর workerমধ্যে MyRunnerধরনের একটি দৃষ্টান্ত দিয়ে ইনজেকশনের হবে B


@ স্ট্যাকওভারফ্লো প্রশ্নটি সম্পাদনা করা কোনও অর্থবোধ করবে না, নতুন কোডটি উত্তরের অন্তর্ভুক্ত। অন্যথায় প্রশ্নটির কোনও মানে হয় না, কারণ এটি নিজেরাই উত্তর দিত।
ডেভ নিউটন

ভিকডোর - দয়া করে সম্পাদনা দেখুন। ক্লাসগুলি এবং ইনজেকশনের অবজেক্টটি বৌদ্ধিক করার কি এটি সঠিক উপায়?
স্ট্যাকওভারফ্লো

1
@ ভিক্টরডম্ব্রভস্কি @Autowired @Qualifier("a1") a;বৈধ?
ভাগ্যবান

1
@ লাকি আমি একটি ভুল করেছি আমার অর্থ@Autowired @Qualifier("a1") A a;
ভিক্টর ডম্ব্রভস্কি

1
এমনকি প্রোগ্রাম আর্গুমেন্ট বা অ্যাপ্লিকেশন বৈশিষ্ট্যগুলির মাধ্যমে সেই ইন্টারফেসের জন্য কোন প্রয়োগটি ইনজেকশন করা উচিত তা নিয়ন্ত্রণ করতে আপনি বাস্তবায়নে @ প্রোফাইল ব্যবহার করতে পারেন।
বি

1

এছাড়াও এটি কোনও Cglib2AopProxy প্রক্সি পদ্ধতিতে অক্ষম যেমন লগগুলিতে কিছু সতর্কতা সৃষ্টি করতে পারে । এবং এর অন্যান্য অনেকগুলি কারণ এখানে বর্ণিত হয়েছে কেন সর্বদা পরিষেবা এবং দাও স্তরগুলিতে একক বাস্তবায়ন ইন্টারফেস থাকে?

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