java معنى - ما الفرق بينComponent و @ Repository وService في الشروح في الربيع؟




كلمة بالعربي (21)

يوفر Spring أربعة أنواع مختلفة من التعليقات التوضيحية لمسح المكونات التلقائية ، وهي @Component و @Service و @Repository و @Controller . من الناحية الفنية ، لا يوجد فرق بينهما ، ولكن ينبغي استخدام كل التعليق التوضيحي لمسح المكونات التلقائية لغرض خاص وفي الطبقة المحددة.

@Component : إنه تعليق توضيحي أساسي لمكونات المكونات التلقائية ، يشير إلى أن فئة التعليقات المشروحة عبارة عن مكون فحص تلقائي.

@Controller : تشير فئة المشروح إلى أنها مكونات وحدة تحكم ، وتستخدم بشكل أساسي في طبقة العرض التقديمي.

@Service : يشير إلى أن الفئة المشروحة هي مكون خدمة في طبقة الأعمال.

@Repository : تحتاج إلى استخدام هذا التعليق التوضيحي في طبقة المثابرة ، وهذا يعمل بمثابة مستودع قاعدة البيانات.

يجب على المرء اختيار شكل أكثر تخصصًا من @Component أثناء إضافة تعليق إلى الفصل الدراسي حيث قد يتضمن هذا التعليق التوضيحي سلوكًا محددًا في المستقبل.

هل يمكن @Component التعليقات التوضيحية @Service و @Service @Repository و @Service بالتبادل في الربيع أم أنها توفر أي وظيفة معينة إلى جانب العمل كجهاز تدوين؟

وبعبارة أخرى ، إذا كان لدي فصل خدمة وقمت بتغيير التعليق التوضيحي من @Service إلى @Component ، فهل ستظل تتصرف بنفس الطريقة؟

أم أن التعليق التوضيحي يؤثر أيضًا على سلوك ووظائف الفصل؟


من الناحية الفنيةController ،Service ، @ Reepository كلها نفس. كل منهم يمتدComponents.

من كود مصدر الربيع:

يشير إلى أن فئة توضيحية هي "مكون". تعتبر هذه الفئات مرشحة للكشف التلقائي عند استخدام التهيئة المستندة إلى التعليقات التوضيحية ومسح Classpath.

يمكننا استخدامComponent مباشرة لكل حبوب ، ولكن من أجل فهم أفضل وإمكانية الصيانة للتطبيق الكبير ، فإننا نستخدمController ،Service ، @ Repository.

الغرض من كل شروح:

1)Controller -> الفصول المشروحة بهذا ، تهدف إلى تلقي طلب من جانب العميل. First request comes to the Dispatcher Servlet, from where it passes the request to the particular controller using value of @RequestMapping annotation.

2) @Service -> Classes annotated with this, are intended to manipulate data, that we receive from client or fetch from database. All the manipulation with data should be done in this layer.

3) @Repository -> Classes annotated with this, are intended to connect with database. It can also be considered as DAO(Data access Object) layer. This layer should be restricted to CRUD (create,retrieve,update,delete) operations only. If any manipulation is required, data should be send be send back to @Service layer.

If we interchange their place(use @Repository in place of @Controller), our application will work fine.

The main purpose of using three different @annotations is to provide better Modularity to the Enterprise application.


في تطبيق متعدد الأنظمة ، سيكون لدينا طبقات مختلفة مثل العرض التقديمي والخدمة والخدمة ووصول البيانات وما إلى ذلك. عندما يتم شرح الفصل الدراسي للكشف التلقائي عن طريق Spring ، فيجب عندئذٍ استخدام الصورة النمطية المعنية على النحو التالي.

  • @Component - عام ويمكن استخدامه عبر التطبيق.
  • @Service - دروس توضيحية على مستوى طبقة الخدمة.
  • @Controller - فئات توضيحية على مستوى طبقات العرض ، تستخدم بشكل أساسي في Spring MVC.
  • @Repository - فئات توضيحية في طبقة الثبات ، والتي ستعمل كمستودع قاعدة بيانات.

من وثائق الربيع :

في Spring 2.0 والإصدارات الأحدث ، يكون التعليق @Repository عبارة عن علامة لأي فئة تحقق الدور أو الصورة النمطية (المعروفة أيضًا باسم Data Access Object أو DAO) لمستودع. من بين استخدامات هذه العلامة هي الترجمة الآلية للاستثناءات.

يقدم Spring 2.5 مزيدًا من التعليقات التوضيحية للصور النمطية: @Component و @Service و @Controller . @Component عبارة عن صورة نمطية عامة لأي مكون يتم إدارته من Spring. @Repository و @Service و @Controller هي تخصصات لـ @Component لحالات استخدام أكثر تحديدًا ، على سبيل المثال ، في طبقات الثبات والخدمة والتقديم ، على التوالي.

لذلك ، يمكنك وضع تعليقات توضيحية على فئات المكونات الخاصة بك مع @Component ، ولكن عن طريق إضافة تعليقات عليها باستخدام @Repository ، أو @Controller ، أو @Controller بدلاً من ذلك ، تكون الفصول الدراسية مناسبة بشكل صحيح للمعالجة باستخدام أدوات أو ربطها بجوانب. على سبيل المثال ، تجعل هذه التعليقات النمطية التوضيحية أهدافًا مثالية للنقاط.

وهكذا ، إذا كنت تختار بين استخدام @Component أو @Service لطبقة الخدمة الخاصة بك ، فمن الواضح أن خدمة @Service هي الخيار الأفضل. وبالمثل ، كما هو مذكور أعلاه ، فإن @Repository مدعوم بالفعل كعلامة للترجمة الاستثنائية التلقائية في طبقة @Repository .

| Annotation | Meaning                                             |
+------------+-----------------------------------------------------+
| @Component | generic stereotype for any Spring-managed component |
| @Repository| stereotype for persistence layer                    |
| @Service   | stereotype for service layer                        |
| @Controller| stereotype for presentation layer (spring-mvc)      |

@Component : you annotate a class @Component, it tells hibernate that it is a Bean.

@Repository : you annotate a class @Repository, it tells hibernate it is a DAO class and treat it as DAO class. Means it makes the unchecked exceptions (thrown from DAO methods) eligible for translation into Spring DataAccessException.

@Service : This tells hibernate it is a Service class where you will have @Transactional etc Service layer annotations so hibernate treats it as a Service component.

Plus @Service is advance of @Component. Assume the bean class name is CustomerService, since you did not choose XML bean configuration way so you annotated the bean with @Component to indicate it as a Bean. So while getting the bean object CustomerService cust = (CustomerService)context.getBean("customerService"); By default, Spring will lower case the first character of the component – from 'CustomerService' to 'customerService'. And you can retrieve this component with name 'customerService'. But if you use @Service annotation for the bean class you can provide a specific bean name by

@Service("AAA")
public class CustomerService{

and you can get the bean object by

CustomerService cust = (CustomerService)context.getBean("AAA");

1. الفرق الرئيسي بين هذه الصور النمطية هو أنها تستخدم لتصنيف مختلف.

2. في تطبيق متعدد المراحل ، سيكون لدينا طبقات مختلفة مثل العرض التقديمي ، والخدمة ، والأعمال ، والوصول إلى البيانات ، وما إلى ذلك. عندما يتم شرح الفصل الدراسي للكشف التلقائي عن طريق Spring ، عندئذ يجب أن نستخدم الصورة النمطية المعنية على النحو التالي.

  • @Component - عام ويمكن استخدامه عبر التطبيق.
  • @Service - دروس توضيحية على مستوى طبقة الخدمة.
  • @Controller - فئات توضيحية على مستوى طبقات العرض ، تستخدم بشكل أساسي في Spring MVC.
  • @Repository - فئات توضيحية في طبقة الثبات ، والتي ستعمل كمستودع قاعدة بيانات. إذا كانت من الناحية الفنية سوف تكون هي نفسها ، فلماذا نحتاج إلى استخدامها على مستوى طبقات مختلفة. لماذا لا تستخدم الشيء نفسه في جميع الطبقات. على سبيل المثال ، إذا استخدمناService في كل الطبقات ، فستتم إعادة إنشاء جميع الفاصوليا دون مشكلات. هناك اختلاف بسيط ، على سبيل المثال النظر فيRepository.

يبحث معالج postprocessor تلقائيًا عن جميع المترجمين الاستثناءين (تطبيقات واجهة PersistenceExceptionTranslator) وينصح بكل الفاصوليا المعلمة بتعليقRepository لكي يتمكن المترجمون المكتشفون من اعتراض الترجمة المناسبة وتطبيقها على استثناءات الإلقاء.

  1. على غرار ما سبق ، قد يختار الربيع في المستقبل إضافة قيمة لـ @Service و @Controller و @Repository استنادًا إلى اتفاقيات الطبقات الخاصة بهم. إلى ميزة الميزة الإضافية هذه ، من الأفضل احترام الاتفاقية واستخدامها بما يتماشى مع الطبقات.
  2. بخلاف ما سبق ، فيما يتعلق بالكشف التلقائي عن @Component ، فإن @Service التبعية لـ @Component ، @Service ، @Repository ، @Controller هي نفسها.
  3. وفقًا لوثائق Spring: إن التعليق التوضيحي لـ Repository عبارة عن علامة لأي فئة تحقق الدور أو الصورة النمطية لمستودع (يُعرف أيضًا باسم كائن الوصول إلى البيانات أو DAO ). من بين استخدامات هذه العلامة هي الترجمة التلقائية للاستثناءات كما هو موضح في القسم 20.2.2 ، "ترجمة الاستثناء". يوفر Spring مزيدًا من التعليقات التوضيحية للصور النمطية: Component وService و Controller . Component عبارة عن صورة نمطية عامة لأي مكون يتم إدارته من Spring . Repository وService وController هي pecializations منComponent لحالات استخدام أكثر تحديدًا ، على سبيل المثال ، في طبقات الثبات والخدمة والتقديم ، على التوالي. لذلك ، يمكنك وضع تعليقات توضيحية على فئات المكونات الخاصة بك معComponent ، ولكن عن طريق إضافة تعليقات عليها باستخدامRepository ، أوService ، أوController بدلاً من ذلك ، تكون الفصول الدراسية مناسبة بشكل صحيح للمعالجة باستخدام أدوات أو ربطها بجوانب. على سبيل المثال ، تجعل هذه التعليقات النمطية التوضيحية أهدافًا مثالية للنقاط. من الممكن أيضًا أنRepository وService وController قد يحملوا دلالات إضافية في الإصدارات المستقبلية من Spring Framework. وهكذا ، إذا كنت تختار بين استخدامComponent أوService لطبقة الخدمة الخاصة بك ، فمن الواضح أن خدمةService هي الخيار الأفضل. وبالمثل ، كما هو مذكور أعلاه ، فإنRepository مدعوم بالفعل كعلامة للترجمة الاستثنائية التلقائية في طبقة استمرارك.

Component يكافئ

<bean>

Service وController وRepository = {Component + بعض الوظائف الخاصة الأخرى}

وهذا يعني أن الخدمة والمراقب المالي والمستودع وظيفية نفس الشيء.

تُستخدم التعليقات الثلاثة لفصل "الطبقات" في تطبيقك ،

  • أجهزة التحكم تقوم فقط بأشياء مثل الإرسال ، إعادة التوجيه ، استدعاء أساليب الخدمة إلخ.
  • خدمة عقد منطق الأعمال ، الحسابات إلخ.
  • مستودع هي DAOs (كائنات الوصول إلى البيانات) ، فإنها الوصول إلى قاعدة البيانات مباشرة.

الآن قد تسأل لماذا فصلها: (أفترض أنك تعرف البرمجة الموجهة AOP-Aspect)

لنفترض أنك تريد مراقبة نشاط طبقة DAO فقط. سوف تكتب فئة Aspect (فئة) يقوم ببعض التسجيل قبل وبعد استدعاء كل أسلوب من DAO الخاص بك ، يمكنك القيام بذلك باستخدام AOP كما لديك ثلاث طبقات مميزة وهي غير مختلطة.

لذلك يمكنك القيام تسجيل من DAO "حول" أو "قبل" أو "بعد" أساليب DAO. يمكنك القيام بذلك لأن لديك DAO في المقام الأول. ما حققته للتو هو فصل المخاوف أو المهام.

تخيل لو لم يكن هناك سوى تعليق واحدController ، فسيكون لهذا المكون إرسال ، والمنطق العملي والوصول إلى قاعدة البيانات كل رمز مختلط ، لذلك القذر!

ما سبق ذكره هو أحد السيناريوهات الشائعة جدًا ، وهناك العديد من حالات الاستخدام الأكثر استخدامًا لسبب استخدام ثلاثة تعليقات توضيحية.


كل هذه التعليقات هي نوع من أنواع التعليقات التوضيحية ، والفرق بين هذه التعليقات الثلاثة

  • إذا أضفنا برنامجComponent ، فسيخبرنا أن دور الصف هو فئة مكون ، فهذا يعني أن هناك فئة تتكون من بعض المنطق ، ولكنها لا تعرف ما إذا كانت فئة تحتوي على منطق أعمال أو استمرارية أو وحدة تحكم بالتحديد حتى لا نستخدم مباشرة هذا التعليق التوضيحي علىcomponent
  • إذا أضفنا تعليقًا علىService ، فسيخبرنا أن دور الفئة يتكون من منطق الأعمال
  • إذا أضفنا إلىRepository أعلى الصف ، فإنه يشير إلى أن فئة تتكون من منطق الثبات
  • هنا ،Component عبارة عن تعليق توضيحي أساسي لـ @ Service و @ Repository و @ Controller

فمثلا

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • عندما @Service أو @Repositroy أو @Controller التوضيحي افتراضيًا ، @Component التعليق التوضيحي لـ @Component موجودًا في الجزء العلوي من الفصل

علق على المكونات الأخرى معComponent ، على سبيل المثال فئات REST Resource.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

Component عبارة عن صورة نمطية عامة لأي مكون يتم إدارته من Spring.

Controller وService وRepository هي تخصصات لـComponent لحالات استخدام محددة.

Component في الربيع


يقدم Spring 2.5 مزيدًا من التعليقات التوضيحية للصور النمطية:Component وService و @ Controller. Component بمثابة صورة نمطية عامة لأي مكون مدار الربيع. في حين ، تعملRepository وService وController كتخصصات منComponent لحالات استخدام أكثر تحديدًا (على سبيل المثال ، في طبقات الثبات والخدمة والتقديم ، على التوالي). ما يعنيه هذا هو أنه يمكنك وضع تعليقات توضيحية على فئات المكونات الخاصة بك معComponent ، ولكن عن طريق إضافة تعليقات عليها باستخدامRepository أوService أوController بدلاً من ذلك ، تكون الفصول الدراسية مناسبة بشكل أكثر ملاءمة للمعالجة باستخدام أدوات أو ربطها بجوانب. على سبيل المثال ، تجعل هذه التعليقات النمطية التوضيحية أهدافًا مثالية للنقاط. وبالطبع ، من الممكن أيضًا أن تحملRepository وService وController دلالات إضافية في الإصدارات المستقبلية من Spring Framework. وبالتالي ، إذا كنت تتخذ قرارًا بين استخدامComponent أوService لطبقة الخدمة الخاصة بك ، فمن الواضح أن خدمةService هي الخيار الأفضل. وبالمثل ، كما هو مذكور أعلاه ، فإنRepository مدعوم بالفعل كعلامة للترجمة الاستثنائية التلقائية في طبقة استمرارك.

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

المرجع: - وثائق الربيع - المسح Classpath والمكونات المدارة وتكوينات الكتابة باستخدام جافا


في @Component و @Service و @Controller و @Repository هي التعليقات التوضيحية النمطية التي تُستخدم في:

@Controller: حيث يتم تعيين طلبك من صفحة العرض التقديمي ، أي أن طبقة العرض التقديمي لن تذهب إلى أي ملف آخر تنتقل مباشرةً إلى فئة @Controller وعمليات التحقق من المسار المطلوب في التعليق التوضيحي @RequestMapping الذي تمت كتابته قبل استدعاء الأسلوب إذا لزم الأمر.

@Service : كل ​​منطق الأعمال هنا هو أي الحسابات المتعلقة بالبيانات وكل ذلك. هذا الشرط لطبقة الأعمال التي لا يسمي مستخدمنا طريقة استمرارها مباشرة لذلك سوف يطلق هذا الأسلوب باستخدام هذا التعليق التوضيحي. سوف يطلبRepository حسب طلب المستخدم

@Repository : هذه هي طبقة Persistence (طبقة الوصول إلى البيانات) للتطبيق والتي تستخدم للحصول على البيانات من قاعدة البيانات. أي يتم تنفيذ جميع عمليات قاعدة البيانات ذات الصلة من قبل المستودع.

@Component - علق المكونات الأخرى (على سبيل المثال فئات الموارد REST) ​​مع صورة نمطية مكون.

يشير إلى أن فئة توضيحية هي " component ". تعتبر هذه الفئات مرشحة للكشف التلقائي عند استخدام التهيئة المستندة إلى التعليقات التوضيحية ومسح Classpath.

يمكن اعتبار التعليقات التوضيحية الأخرى على مستوى الفصل بمثابة تحديد مكون أيضًا ، وهو عادةً نوع خاص من المكونات: على سبيل المثال التعليق التوضيحي لـRepository أو شرح AspectJ'sAspect.

component


يمكننا الإجابة على هذا وفقا لمعايير جافا

بالإشارة إلى JSR-330 ، المدعوم الآن من قبل الربيع ، يمكنك فقط استخدام @Named لتعريف bean (Some how @[email protected] ). لذا وفقًا لهذا المعيار ، يبدو أنه لا يوجد استخدام لتعريف أنواع الاستريو (مثل @Repository و @Service و @Controller ) إلى فئات الفاصوليا.

ولكن مستخدم الربيع هذه التعليقات التوضيحية المختلفة مختلفة عن الاستخدام المحدد ، على سبيل المثال:

  1. يحدد مطورو المساعدة فئة أفضل للمختصين. قد يكون هذا التصنيف مفيدًا في بعض الحالات. (على سبيل المثال ، عندما تستخدم aspect oriented ، يمكن أن يكون ذلك مرشحًا جيدًا point cuts )
  2. @Repository التعليق التوضيحي لـ @Repository بعض الوظائف إلى الحبة (بعض ترجمة الاستثناء التلقائي إلى طبقة استمرارية الفول).
  3. إذا كنت تستخدم mvc spring ، فإن @RequestMapping يمكن @RequestMapping فقط إلى الفصول التي يتم وضع @Controller عليها بواسطة @Controller .

@Component – Indicates a auto scan component.  
@Repository – Indicates DAO component in the persistence layer.  
@Service – Indicates a Service component in the business layer.   
@Controller – Indicates a controller component in the presentation layer.  

@Repository أن جميع @Service أو @Controller أو @Controller باستخدام @Component . لذا ، هل يمكننا استخدام @Component فقط لجميع مكونات المسح التلقائي؟ نعم ، يمكنك ذلك ، وسيقوم Spring بإجراء مسح تلقائي لكل المكونات الخاصة بك باستخدامComponent المشروح.

إنها تعمل بشكل جيد ، ولكنها ليست ممارسة جيدة ، من أجل قابلية القراءة ، يجب عليك دائماً أن تعلن @Service أو @Controller أو @Controller عن طبقة محددة لجعل قراءة التعليمات البرمجية أسهل.


لا يوجد فرق بين @ Component و @ Service و @ Controller و @ Repository. Component هو التعليق العام لتمثيل مكون MVC الخاص بنا. ولكن سيكون هناك العديد من المكونات كجزء من تطبيق MVC مثل مكونات طبقة الخدمة ومكونات طبقة الثبات ومكونات طبقة العرض. لذا من أجل تمييزهم أعطى ربيع الناس التعليقات الثلاثة الأخرى أيضًا.

لتمثيل مكونات طبقة الثبات: @ Reepository

لتمثيل مكونات طبقة الخدمة:Service

لتمثيل مكونات طبقة العرض التقديمية:Controller

أو يمكنك استخدامComponent لجميعهم.


@Component is the top level generic annotation which makes the annotated bean to be scanned and available in the DI container

@Repository is specialized annotation and it brings the feature of converting all the unchecked exceptions from the DAO classes

@Service is specialized annotation. it do not bring any new feature as of now but it clarifies the intent of the bean

@Controller is specialized annotation which makes the bean MVC aware and allows the use of further annotation like @RequestMapping and all such

Here are more details


A @Service to quote spring documentation,

Indicates that an annotated class is a "Service", originally defined by Domain-Driven Design (Evans, 2003) as "an operation offered as an interface that stands alone in the model, with no encapsulated state." May also indicate that a class is a "Business Service Facade" (in the Core J2EE patterns sense), or something similar. This annotation is a general-purpose stereotype and individual teams may narrow their semantics and use as appropriate.

If you look at domain driven design by eric evans,

A SERVICE is an operation offered as an interface that stands alone in the model, without encapsulating state, as ENTITIES and VALUE OBJECTS do. SERVICES are a common pattern in technical frameworks, but they can also apply in the domain layer. The name service emphasizes the relationship with other objects. Unlike ENTITIES and VALUE OBJECTS, it is defined purely in terms of what it can do for a client. A SERVICE tends to be named for an activity, rather than an entity—a verb rather than a noun. A SERVICE can still have an abstract, intentional definition; it just has a different flavor than the definition of an object. A SERVICE should still have a defined responsibility, and that responsibility and the interface fulfilling it should be defined as part of the domain model. Operation names should come from the UBIQUITOUS LANGUAGE or be introduced into it. Parameters and results should be domain objects. SERVICES should be used judiciously and not allowed to strip the ENTITIES and VALUE OBJECTS of all their behavior. But when an operation is actually an important domain concept, a SERVICE forms a natural part of a MODEL-DRIVEN DESIGN. Declared in the model as a SERVICE, rather than as a phony object that doesn't actually represent anything, the standalone operation will not mislead anyone.

and a Repository as per Eric Evans,

A REPOSITORY represents all objects of a certain type as a conceptual set (usually emulated). It acts like a collection, except with more elaborate querying capability. Objects of the appropriate type are added and removed, and the machinery behind the REPOSITORY inserts them or deletes them from the database. This definition gathers a cohesive set of responsibilities for providing access to the roots of AGGREGATES from early life cycle through the end.


نظرًا لأن العديد من الإجابات ذكرت بالفعل ما تستخدم له هذه التعليقات ، سنركز هنا على بعض الاختلافات الطفيفة فيما بينها.

أولا التشابه

النقطة الأولى الجديرة بالتركيز مرة أخرى هي أنه فيما يتعلق بالكشف التلقائي عن الفحص والحقن التبعية لـ BeanDefinition فإن كل هذه التعليقات (viz.،Component،Service، @ Repository،Controller) هي نفسها. يمكننا استخدام واحد في مكان آخر ، ويمكن أن لا يزال في طريقنا.

الاختلافات بينComponent وRepository وController وService

@مكون

هذا هو تعليق على الصورة النمطية للأغراض العامة يشير إلى أن الفصل هو مكون الربيع.

ما هو خاص حولComponent
<context:component-scan> يمسح فقط @Component ولا يبحث عن @Controller و @Service و @Repository بصفة عامة. يتم مسحها ضوئيًا لأنهم هم أنفسهم @Component بـ @Component .

ما عليك سوى إلقاء نظرة على @Controller و @Service و @Repository التعليقات التوضيحية:

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

وبالتالي ، ليس من الخطأ القول أن @Controller و @Service و @Repository هي أنواع خاصة من التعليقات التوضيحية على @Component . <context:component-scan> يختارها ويسجل الفصول التالية كالفاصوليا ، تمامًا كما لو تم وضع @Component باستخدام @Component .

يتم مسحها ضوئيًا نظرًا لأن هذه التعليقات @Component باستخدام التعليق التوضيحي @Component . إذا حددنا التعليق التوضيحي المخصص الخاص بنا وقم @Component باستخدام @Component ، فسيتم أيضًا فحصه باستخدام <context:component-scan>

@مستودع

هذا للإشارة إلى أن الفئة يعرّف مخزن بيانات.

ما هو خاص حولRepository؟

بالإضافة إلى الإشارة إلى أن هذا هو التهيئة المستندة إلى التعليق ، @Repository مهمة @Repository هي التقاط الاستثناءات الخاصة @Repository معينة وإعادة @Repository كواحد من الاستثناءات الموحدة غير المحددة في Spring. ولهذا السبب ، يتم PersistenceExceptionTranslationPostProcessor بـ PersistenceExceptionTranslationPostProcessor ، حيث إننا مطالبون بإضافة سياق تطبيق Spring الخاص بنا على هذا النحو:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

يضيف معالج ما بعد @Repository هذا @Repository لأي حبة تم إضافة تعليقات عليها باستخدام @Repository حتى يتم @Repository أي استثناءات خاصة بالنظام الأساسي ثم يعاد تعيينها كأحد استثناءات الوصول إلى البيانات غير المحددة في Spring.

@مراقب

يشير التعليق التوضيحي @Controller إلى أن فئة معينة تخدم دور وحدة التحكم. يعمل التعليق التوضيحي @Controller كصورة نمطية للفئة المشروحة ، يشير إلى دورها.

ما هو خاص حول @ Controller؟

لا يمكننا تبديل هذا التعليق التوضيحي بأي @Service أخرى مثل @Service أو @Repository ، على الرغم من أنها تبدو متشابهة. يمسح المرسل الفصول المشروحة بـ @Controller ويكتشف @RequestMapping التعليقات التوضيحية داخلها. يمكننا فقط استخدام @RequestMapping على الفصول المشروحة @Controller .

@الخدمات

تحتفظ @Services بمنطق العمل وطريقة الاستدعاء في طبقة المستودع.

ما هو خاص بـService؟

بصرف النظر عن حقيقة أنها تستخدم للإشارة إلى أنها تحتفظ بمنطق العمل ، فليس هناك أي تمييز ملحوظ يوفره هذا التعليق ، ولكن من يدري ، قد يضيف الربيع بعض الإضافات الاستثنائية في المستقبل.

ماذا بعد؟

على غرار ما سبق ، قد يختار الربيع في المستقبل إضافة وظائف خاصة لـ @Service و @Controller و @Repository استنادًا إلى اتفاقيات الطبقات الخاصة بهم. ومن ثم ، فمن الجيد دائمًا احترام الاتفاقية واستخدامها بما يتماشى مع الطبقات.


Explanation of stereotypes :

  • @Service - Annotate all your service classes with @Service. This layer knows the unit of work. All your business logic will be in Service classes. Generally methods of service layer are covered under transaction. You can make multiple DAO calls from service method, if one transaction fails all transactions should rollback.
  • @Repository - Annotate all your DAO classes with @Repository. All your database access logic should be in DAO classes.
  • @Component - Annotate your other components (for example REST resource classes) with component stereotype.
  • @Autowired - Let Spring auto-wire other beans into your classes using @Autowired annotation.

@Componentهي صورة نمطية عامة لأي مكون يتم إدارته من Spring. @Repositoryو @Service، @Controllerوهي اختصارات @Componentلحالات استخدام أكثر تحديدًا ، على سبيل المثال ، في طبقات الثبات والخدمة والتقديم ، على التوالي.

أجبت في الأصل here .


في الربيع 4 ، الإصدار الأحدث:

التعليق التوضيحي لـRepository عبارة عن علامة لأي فئة تحقق الدور أو الصورة النمطية لمستودع (يُعرف أيضًا باسم كائن الوصول إلى البيانات أو DAO). من بين استخدامات هذه العلامة هي الترجمة التلقائية للاستثناءات كما هو موضح في القسم 20.2.2 ، "ترجمة الاستثناء".

يوفر Spring مزيدًا من التعليقات التوضيحية للصور النمطية:Component وService وController. Component عبارة عن صورة نمطية عامة لأي مكون يتم إدارته من Spring. Repository وService وController هي تخصصات لـComponent لحالات استخدام أكثر تحديدًا ، على سبيل المثال ، في طبقات الثبات والخدمة والتقديم ، على التوالي. لذلك ، يمكنك وضع تعليقات توضيحية على فئات المكونات الخاصة بك معComponent ، ولكن عن طريق إضافة تعليقات عليها باستخدامRepository ، أوService ، أوController بدلاً من ذلك ، تكون الفصول الدراسية مناسبة بشكل أكثر ملاءمة للمعالجة باستخدام أدوات أو ربطها بجوانب. على سبيل المثال ، تجعل هذه التعليقات النمطية التوضيحية أهدافًا مثالية للنقاط. ومن الممكن أيضًا أنRepository وService وController قد يحملوا دلالات إضافية في الإصدارات المستقبلية من Spring Framework. وهكذا ، إذا كنت تختار بين استخدامComponent أوService لطبقة الخدمة الخاصة بك ، فمن الواضح أن خدمةService هي الخيار الأفضل. وبالمثل ، كما هو مذكور أعلاه ، فإنRepository مدعوم بالفعل كعلامة للترجمة الاستثنائية التلقائية في طبقة استمرارك.


إن استخدام @Service و التعليقات التوضيحية لـ @Repository مهمان من منظور اتصال قاعدة البيانات.

  1. استخدم @Service لجميع أنواع خدمات الويب الخاصة بك من اتصالات DB
  2. استخدم @Repository لكافة اتصالات DB المخزنة الخاصة بك

إذا لم تستخدم التعليقات التوضيحية الصحيحة ، فقد تواجه استثناءات الالتزام التي تم تجاوزها بواسطة معاملات التراجع. سترى استثناءات أثناء اختبار تحميل الضغط المتعلق باسترجاع معاملات JDBC.


الفرق بين الاثنين بسيط حقا!

<context:annotation-config /> 

يمكّنك من استخدام التعليقات التوضيحية المقيدة في توصيل الأسلاك للمؤسسات والمبتكرين فقط من الفاصوليا !.

بينما

<context:component-scan base-package="org.package"/> 

تمكن كل ما يمكن أن يفعله <context:annotation-config /> ، مع إضافة استخدام الصور النمطية على سبيل المثال @Component ، @Service ، @Repository . حتى تتمكن من سلك الفول بأكمله وليس فقط يقتصر على الصانعين أو الممتلكات!





java spring spring-mvc annotations