@ সার্ভিস টিকাটি কোথায় রাখা উচিত? ইন্টারফেস বা বাস্তবায়ন?


133

আমি স্প্রিং ব্যবহার করে একটি অ্যাপ্লিকেশন বিকাশ করছি। আমার কাছে @Serviceটিকাটি ব্যবহার করা দরকার । আমার আছে ServiceIএবং ServiceImplএমন ServiceImpl implements ServiceI। আমি এন্ডোটেশনটি কোথায় রাখব তা নিয়ে আমি এখানে বিভ্রান্ত @Service

আমার সাথে ইন্টারফেস বা বাস্তবায়নটি বর্জন করা উচিত @Service? এই দুটি পদ্ধতির মধ্যে পার্থক্য কী?


এটি একটি অনুরূপ পোস্টের আমার উত্তর: stackoverflow.com/questions/38618995/…
আগুস্তে সানচেজ

উত্তর:


140

আমি কোনও ইন্টারফেসে কখনও @Component(বা @Service, ...) রাখি না , কারণ এটি ইন্টারফেসটিকে অকেজো করে তোলে। কেন আমাকে ব্যাখ্যা করুন।

দাবি 1: আপনার যদি একটি ইন্টারফেস থাকে তবে আপনি ইঞ্জেকশন পয়েন্ট ধরণের জন্য সেই ইন্টারফেসটি ব্যবহার করতে চান।

দাবি 2: একটি ইন্টারফেসের উদ্দেশ্য হ'ল এটি এমন একটি চুক্তি সংজ্ঞায়িত করে যা বেশ কয়েকটি বাস্তবায়ন দ্বারা কার্যকর করা যেতে পারে। অন্যদিকে আপনার ইঞ্জেকশন পয়েন্ট রয়েছে ( @Autowired)। কেবলমাত্র একটি ইন্টারফেস এবং এটি প্রয়োগ করে এমন একটি শ্রেণি থাকা, (আইএমএইচও) অকেজো এবং YAGNI লঙ্ঘন করে ।

সত্য: আপনি যখন:

  • @Component(বা @Service, ...) একটি ইন্টারফেসে,
  • একাধিক ক্লাস রয়েছে যা এটি প্রয়োগ করে,
  • কমপক্ষে দুটি ক্লাস বসন্ত বিন হয়, এবং
  • একটি ইঞ্জেকশন পয়েন্ট রয়েছে যা টাইপ ভিত্তিক ইনজেকশনটির জন্য ইন্টারফেস ব্যবহার করে,

তারপরে আপনি পাবেন এবং NoUniqueBeanDefinitionException (বা আপনার একটি খুব বিশেষ কনফিগারেশন সেটআপ আছে, পরিবেশ, প্রোফাইল বা কোয়ালিফায়ার সহ ...)

উপসংহার: আপনি যদি কোনও ইন্টারফেসে @Component(বা @Service, ...) ব্যবহার করেন তবে আপনাকে অবশ্যই দুটি কলের মধ্যে কমপক্ষে একটি লঙ্ঘন করতে হবে। সুতরাং আমি মনে করি এটি @Componentইন্টারফেস স্তরে রাখা (কিছু বিরল পরিস্থিতি বাদে) দরকারী নয় ।


স্প্রিং-ডেটা-জেপিএ সংগ্রহস্থল ইন্টারফেসগুলি সম্পূর্ণ আলাদা কিছু


3
আপনি যা লিখছেন তা খুব আকর্ষণীয় ... তাই সঠিক পথটি কোনটি? এটি কি আদৌ ইন্টারফেসটি বেনিফিট করছে না এবং পরিষেবাগুলিকে বাস্তবায়নগুলিতে টীকা দিচ্ছে না? স্প্রিং কি এখনও ইন্টারফেস প্রকারটি ব্যবহার করে স্বায়ত্বশক্তিতে সক্ষম? কি> এই আপনার উত্তর হয় stackoverflow.com/questions/12899372/...
corlaez

3
আমার একটি প্রশ্ন আছে, যখন কেবলমাত্র একটি শ্রেণি এটি প্রয়োগ করে তখন আমাদের কেন পরিষেবা স্তরটির জন্য একটি ইন্টারফেস তৈরি করতে হবে? আমি অনেক প্রকল্প দেখেছ তারা আছে নিয়ামক স্তর, ** সেবা স্তর ( servicInterface , serviceInterfaceImpl ), এবং সংগ্রহস্থল স্তর
যুবরাজ

4
@ যুবরাজ: সুস্পষ্ট বক্তব্য, তবে আপনার প্রশ্নটি অন্য একটি বিষয় সম্পর্কে (আমার উত্তরের জন্য আমি ধরে নিয়েছি: একটি ইন্টারফেস রয়েছে এবং প্রশ্নটি ইন্টারফেসটি নিয়ে নয় তবে টীকাগুলি কোথায় রাখবেন সে সম্পর্কে)। আপনার প্রশ্নের জন্য: একটি ব্যবসায়িক পরিষেবা শ্রেণীর জন্য একটি ইন্টারফেস থাকার প্রায় কোনও কারণ নেই যা কখনও কখনও দুটি বাস্তবায়ন করে না। (বিটিডাব্লু: যতক্ষণ না আপনি অন্য কারও জন্য এপিআই তৈরি করছেন না, আপনি সর্বদা আপনার কোডটি রিফ্যাক্টর করতে পারেন এবং আপনার প্রয়োজনের পরে ইন্টারফেসটি প্রবর্তন করতে পারেন)
রাল্ফ

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

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

32

মূলত মত অ্যানোটেশনগুলি @Service , @Repository , @Component , ইত্যাদি তারা সব একই উদ্দেশ্য পরিবেশন:

টিকা-ভিত্তিক কনফিগারেশন এবং ক্লাসপাথ স্ক্যানিং ব্যবহার করার সময় স্বতঃ-সনাক্তকরণ।

আমার অভিজ্ঞতা থেকে আমি সর্বদা @Serviceইন্টারফেসে বা বিমূর্ত ক্লাসে টীকা @Componentএবং @Repositoryতাদের প্রয়োগের জন্য টীকা ব্যবহার করি। @Componentটীকাগুলি আমি সেই ক্লাসগুলিতে ব্যবহার করছি যা মূল উদ্দেশ্যগুলি, সহজ স্প্রিংস মটরশুটি, আরও কিছু না। @Repositoryটীকাটি আমি DAOস্তরে ব্যবহার করছি , উদাহরণস্বরূপ যদি আমাকে ডাটাবেসে যোগাযোগ করতে হয়, কিছু লেনদেন করতে হবে ইত্যাদি

সুতরাং আমি @Serviceকার্যকারিতার উপর নির্ভর করে এবং অন্যান্য স্তরগুলির সাথে আপনার ইন্টারফেসটি টীকাতে পরামর্শ দেব ।


10
আপনি কি বলতে পারবেন ইন্টারফেসগুলি টিকিয়ে দেওয়ার এবং বাস্তবায়ন টীকা দেওয়ার মধ্যে পার্থক্যগুলি কী?
থোকোজুফেক্ট

27
থেকে বসন্ত ডক্স , "এই টীকা বাস্তবায়ন শ্রেণীর ক্লাসপাথ স্ক্যানিং মাধ্যমে autodetected করা হবে, যার ফলে @Component একটি বিশেষজ্ঞতা হিসেবে কাজ করে," বোঝা যায় যে এটা বাস্তবায়ন বর্গ ব্যবহৃত হতে পারে উদ্দীষ্ট এমন।
nbrooks

1
- @TheKojuEffect, এই পোস্টে বাস্তবায়নের বনাম টিকা ইন্টারফেসগুলি মধ্যে বিস্তারিত পার্থক্য ব্যাখ্যা stackoverflow.com/questions/3120143/...
মহেশ

@ ব্যবহারকারী3257644 কেবলমাত্র নোট করুন যে পোস্টটিতে উত্তরগুলি দিয়ে দেওয়া পরামর্শগুলি বিশেষত '@ ট্রানজেকশনাল' টীকা সম্পর্কিত, সমস্ত টীকা সাধারণভাবে নয়।
জোনাথন

3
অন্যান্য স্টেরিওটাইপ টীকাগুলির মতো, ইন্টারফেসগুলিতে @ পরিষেবা টীকাটির কোনও প্রভাব নেই। সমস্ত স্টেরিওটাইপ টীকাটি বিমূর্ত বা কংক্রিটের ক্লাসে লাগানো উচিত।
বিগফুট

13

আমি ব্যবহৃত @Component, @Service, @Controllerএবং @Repositoryশুধুমাত্র বাস্তবায়ন শ্রেণীর উপর এবং ইন্টারফেস না টীকা নেই। তবে @Autowiredইন্টারফেসের সাথে টিকা রচনা এখনও আমার পক্ষে কাজ করেছে।


7

@ সার্ভিসে টীকাগুলি লেখার প্রসেসগুলি হ'ল এটি ইঙ্গিত দেয় যে এটি একটি পরিষেবা। আমি জানি না যে কোনও বাস্তবায়নকারী শ্রেণি ডিফল্টরূপে এই বিরক্তির উত্তরাধিকারী হবে কিনা।

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


1
আমি মনে করি আমরা সকলেই একত্রে শক্তিশালী সংযোজন যুক্তি শুনেছি, তবে মনে রাখবেন যে জোট ছাড়া টীকাগুলি উপস্থিত থাকতে পারে, সুতরাং মূলত যতক্ষণ আপনার সংযোগগুলি টীকাতে থাকে ততক্ষণ এটি decoupled হতে পারে।
নীলস বেচ নিলসন

1

বসন্তের একটি সুবিধা হ'ল পরিষেবা (বা অন্যান্য) বাস্তবায়নে সহজেই স্যুইচ করা। এর জন্য, আপনাকে ইন্টারফেসে টিকা লিখতে হবে এবং ভেরিয়েবলকে এই জাতীয়ভাবে ঘোষণা করতে হবে:

@Autowired
private MyInterface myVariable;

এবং না :

@Autowired
private MyClassImplementationWhichImplementsMyInterface myVariable;

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


4
"MyClassImplementationWhichImplementsMyInterface" LOL
inafalco

কাজ করার জন্য প্রথম উদাহরণটির জন্য আপনাকে ইন্টারফেসে টিকা দেওয়ার দরকার নেই। আপনি @Serviceএকটি প্রয়োগের সাথে টীকায়িত করতে পারেন এবং ইন্টারফেসটি স্বতঃশক্ত করতে পারেন । স্প্রিং এই ইন্টারফেসটি প্রয়োগকারী কোনও বস্তুর জন্য পরীক্ষা করবে।
মার্কো

1

আমি @Serviceআপনার ক্লাসটি পরিয়ে রাখব তবে টীকা হিসাবে প্যারামিটার হিসাবে ইন্টারফেসের নাম রেখেছি

interface ServiceOne {}

@Service("ServiceOne")
class ServiceOneImpl implements ServiceOne{}

এটি করে আপনি সমস্ত সুবিধা পান এবং এখনও ইন্টারফেসটি ইনজেক্ট করতে পারেন তবে ক্লাস পান

@Autowired 
private ServiceOne serviceOne;

সুতরাং আপনার ইন্টারফেসটি বসন্তের কাঠামোর সাথে আবদ্ধ নয় এবং আপনি যে কোনও সময় ক্লাস পরিবর্তন করতে পারেন এবং আপনার সমস্ত ইনজেকশন পয়েন্ট আপডেট করতে হবে না।

সুতরাং যদি আমি বাস্তবায়ন ক্লাসটি পরিবর্তন করতে চেয়েছিলাম তবে আমি কেবল নতুন ক্লাসটি বর্ননা করতে পারি এবং প্রথম থেকে সরিয়ে ফেলতে পারি তবে কেবল এটি পরিবর্তন করার প্রয়োজন। আপনি যদি ক্লাসটি ইনজেক্ট করেন আপনি যখন প্রেরণ শ্রেণিটি পরিবর্তন করতে চান তখন আপনার প্রচুর কাজ হতে পারে।


-1

এটি সহজভাবে বলতে:

@ পরিষেবা সার্ভিস স্তরটির জন্য একটি স্টেরিওটাইপ টিকা ।

@Repository জন্য একটি বাঁধাধরা টীকা হয় অধ্যবসায় স্তর।

@ কম্পোমেন্টটি একটি জেনেরিক স্টেরিওটাইপ টীকা যা অ্যাপ্লিকেশন কনটেক্সটে অবজেক্টের একটি উদাহরণ তৈরি করতে স্প্রিংকে বলতে ব্যবহৃত হয়। উদাহরণস্বরূপ কোনও নাম সংজ্ঞায়িত করা সম্ভব, ডিফল্টটি উটের ক্ষেত্রে শ্রেণীর নাম।


3
এই টীকাগুলির অর্থ সন্ধান করা হচ্ছে না তবে এগুলি ইন্টারফেস বা এর বাস্তবায়নে রাখার জন্য কোথায়।
ন্যানোসফট

-3

এখানে 5 টি টীকা রয়েছে যা বসন্তের মটরশুটি তৈরির জন্য ব্যবহৃত হতে পারে। উত্তরের নীচে তালিকাবদ্ধ করুন।

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

@ রিপোসিটোরি - আপনার দাও স্তর ক্লাস ইনজেকশনের জন্য ব্যবহার করুন।

@ পরিষেবা - আপনার পরিষেবা স্তর ক্লাস ইনজেকশনের জন্য ব্যবহার করুন। সার্ভিস লেয়ারে আপনাকে ডিবি লেনদেন পরিচালনার জন্য @ ট্রান্সজেকশনাল টিকা ব্যবহার করতে হবে।

@ কনট্রোলার - আপনার ফ্রন্টএন্ড লেয়ার কন্ট্রোলারের জন্য ব্যবহার করুন, যেমন জেএসএফ পরিচালিত মটরশুটি বসন্ত শিম হিসাবে ইনজেকশন দেয়।

@ রিস্টকন্ট্রোলার - বসন্ত বিশ্রাম নিয়ন্ত্রণকারীদের জন্য ব্যবহার, এটি আপনাকে আপনার বিশ্রামের পদ্ধতিগুলিতে @ রেসপন্সবডি এবং @ রেইকোস্টবডি টীকাগুলি প্রতিবার এড়াতে সহায়তা করবে।

@ কম্পোনেন্ট - আপনার যখন বসন্ত শিম ইনজেক্ট করতে হবে যা নিয়ামক, পরিষেবা বা দাও ক্লাস নয়, অন্য কোনও ক্ষেত্রে এটি ব্যবহার করুন


হ্যাঁ, আপনার স্তরগুলির সীমানায় আপনার একটি ইন্টারফেস দরকার (যেমন ডেটা অ্যাক্সেস স্তর এবং পরিষেবা স্তর)। তারা সেই স্তরগুলির প্রয়োগগুলি ধারণ করে এমন মডিউলগুলির আলগা সংযোগ সক্ষম করে। এগুলি ব্যতীত, উল্লিখিত স্তরগুলির ক্লায়েন্টদের কংক্রিটের প্রকারগুলি জানতে হবে এবং যখন আপনি বলবেন, আপনার বেসিকডাও ক্যাচিংডাও দিয়ে সজ্জিত করতে চান তখন আপনি তাদের পরিবর্তন করতে হবে ...
আইগান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.