<প্রসঙ্গ: টিকা-কনফিগারেশন> এবং <প্রসঙ্গ: উপাদান-স্ক্যান> এর মধ্যে পার্থক্য


691

আমি বসন্ত 3 শিখছি এবং আমি কার্যকারিতা পিছনে উপলব্ধি বলে মনে হচ্ছে না <context:annotation-config>এবং <context:component-scan>

আমি যা পড়েছি থেকে তারা বিভিন্ন হ্যান্ডেল বলে মনে হচ্ছে টীকা ( @Required, @Autowiredবনাম ইত্যাদি @Component, @Repository, @Service, কিন্তু থেকে আমি যা তারা একই রেজিস্টার করো পড়েছি ইত্যাদি) শিম পোস্ট প্রসেসর ক্লাস।

আমাকে আরও বিভ্রান্ত করার জন্য, সেখানে একটি annotation-config বৈশিষ্ট্য রয়েছে <context:component-scan>

কেউ কি এই ট্যাগগুলিতে কিছু আলোকপাত করতে পারে? কি অনুরূপ, ভিন্ন কি, একটি একে অপর দ্বারা চালিত হয়, তারা একে অপরকে সম্পূর্ণ, আমি তাদের উভয়ের একটি প্রয়োজন?


5
techidiocy.com/annotation-config-vs-component-scan-spring-core এখানে উজ্জ্বল ব্যাখ্যা রয়েছে
VdeX

সংক্ষেপে: component-scanযখনই সম্ভব ব্যবহার করুন ।
জেরি চিন

উত্তর:


1420

<context:annotation-config> অ্যাপ্লিকেশন প্রসঙ্গে ইতিমধ্যে নিবন্ধভুক্ত শিমগুলিতে টীকাগুলি সক্রিয় করতে ব্যবহৃত হয় (এটি এক্সএমএল বা প্যাকেজ স্ক্যানিং দ্বারা সংজ্ঞায়িত করা হয়েছে তা নির্বিশেষে)।

<context:component-scan>কি করতে <context:annotation-config>পারে কিন্তু করতে পারে<context:component-scan> অ্যাপ্লিকেশন প্রসঙ্গে শিমটি খুঁজে পেতে এবং নিবন্ধ করার জন্য প্যাকেজগুলি স্ক্যান করে।

পার্থক্য / মিলগুলি দেখানোর জন্য আমি কয়েকটি উদাহরণ ব্যবহার করব।

টাইপ তিন মটরশুটি একটি মৌলিক সেটআপ শুরু করি A, Bএবং Cসঙ্গে, Bএবং Cমধ্যে ইনজেকশনের হচ্ছে A

package com.xxx;
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc; 
  }
}

নিম্নলিখিত এক্সএমএল কনফিগারেশন সহ:

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A">
  <property name="bbb" ref="bBean" />
  <property name="ccc" ref="cBean" />
</bean>

প্রসঙ্গ লোড করা নিম্নলিখিত আউটপুট উত্পাদন করে:

creating bean B: com.xxx.B@c2ff5
creating bean C: com.xxx.C@1e8a1f6
creating bean A: com.yyy.A@1e152c5
setting A.bbb with com.xxx.B@c2ff5
setting A.ccc with com.xxx.C@1e8a1f6

ঠিক আছে, এটি প্রত্যাশিত আউটপুট। তবে এটি "পুরানো শৈলী" বসন্ত। এখন আমাদের টীকাগুলি রয়েছে সুতরাং সেগুলি এক্সএমএলকে সহজ করার জন্য ব্যবহার করতে দিন।

প্রথমে, শিমের মতো bbbএবং এর cccবৈশিষ্ট্যগুলিকে স্বতঃশক্ত করা যাক A:

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

এটি আমাকে এক্সএমএল থেকে নিম্নলিখিত সারিগুলি সরাতে দেয়:

<property name="bbb" ref="bBean" />
<property name="ccc" ref="cBean" />

আমার এক্সএমএল এখন এটি সরল করা হয়েছে:

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

আমি যখন প্রসঙ্গটি লোড করি আমি নিম্নলিখিত আউটপুটটি পাই:

creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf

ঠিক আছে, এটা ভুল! কি হলো? আমার সম্পত্তিগুলি কেন স্বতন্ত্রিত হয় না?

ঠিক আছে, টীকাগুলি একটি দুর্দান্ত বৈশিষ্ট্য তবে তারা নিজেরাই এগুলি কিছুই করে না। এগুলি কেবল স্টট টীকা দেয়। টীকাগুলি খুঁজে পেতে এবং সেগুলি দিয়ে কিছু করার জন্য আপনার একটি প্রক্রিয়াজাতকরণ সরঞ্জাম প্রয়োজন tool

<context:annotation-config>উদ্ধার করতে. এটি টীকাগুলির জন্য ক্রিয়াগুলি সক্রিয় করে যা এটি একই অ্যাপ্লিকেশন প্রসঙ্গে যেখানে নিজেই সংজ্ঞায়িত হয় সেগুলিতে নির্ধারিত শিমের সন্ধান করে finds

আমি যদি আমার এক্সএমএল এটিতে পরিবর্তন করি:

<context:annotation-config />
<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />

আমি যখন অ্যাপ্লিকেশন প্রসঙ্গটি লোড করি তখন আমি সঠিক ফল পাই:

creating bean B: com.xxx.B@15663a2
creating bean C: com.xxx.C@cd5f8b
creating bean A: com.yyy.A@157aa53
setting A.bbb with com.xxx.B@15663a2
setting A.ccc with com.xxx.C@cd5f8b

ঠিক আছে, এটি দুর্দান্ত, তবে আমি এক্সএমএল থেকে দুটি সারি সরিয়ে একটি যুক্ত করেছি। এটি খুব বড় পার্থক্য নয়। টীকাগুলি সহ ধারণাটি হ'ল এটি এক্সএমএল সরানোর কথা।

সুতরাং আসুন এক্সএমএল সংজ্ঞাগুলি সরান এবং এগুলি সমস্ত টীকা সহ প্রতিস্থাপন করুন:

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}

এক্সএমএলে থাকাকালীন আমরা কেবল এটি রাখি:

<context:annotation-config />

আমরা প্রসঙ্গটি লোড করি এবং ফলাফলটি ... কিছুই হয় না। কোনও মটরশুটি তৈরি করা হয় না, কোনও মটরশুটি স্বতঃশক্ত হয় না। কোনো কিছুই নেই!

কারণ, আমি প্রথম অনুচ্ছেদে যেমন বলেছি, <context:annotation-config />কেবলমাত্র আবেদন প্রসঙ্গে নিবন্ধিত শিমের উপর কাজ করে। যেহেতু আমি তিনটি শিমের জন্য এক্সএমএল কনফিগারেশন সরিয়েছি সেখানে কোনও শিম তৈরি <context:annotation-config />করা হয়নি এবং এতে কাজ করার কোনও "লক্ষ্য" নেই।

তবে এটি কোনও সমস্যা হবে না <context:component-scan>যার জন্য "টার্গেটগুলি" কাজ করার জন্য কোনও প্যাকেজ স্ক্যান করতে পারে। এক্সএমএল কনফিগারেশনের সামগ্রীটি নিম্নলিখিত এন্ট্রিটিতে পরিবর্তন করা যাক:

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

আমি যখন প্রসঙ্গটি লোড করি আমি নিম্নলিখিত আউটপুটটি পাই:

creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff

হুমমমম ... কিছু অনুপস্থিত। কেন?

আপনি যদি ক্লাসগুলিতে ঘনিষ্ঠভাবে তাকান তবে ক্লাসের Aপ্যাকেজ রয়েছে com.yyyতবে আমি <context:component-scan>প্যাকেজটি ব্যবহার করার জন্য নির্দিষ্ট করেছি com.xxxযাতে এটি আমার Aক্লাসটি পুরোপুরি মিস করেছে এবং কেবল বাছাই করেছে Bএবং Cযা রয়েছেcom.xxx প্যাকেজে থাকে।

এটি ঠিক করার জন্য, আমি এই অন্যান্য প্যাকেজটিও যুক্ত করছি:

<context:component-scan base-package="com.xxx,com.yyy" />

এবং এখন আমরা প্রত্যাশিত ফলাফল পেয়েছি:

creating bean B: com.xxx.B@cd5f8b
creating bean C: com.xxx.C@15ac3c9
creating bean A: com.yyy.A@ec4a87
setting A.bbb with com.xxx.B@cd5f8b
setting A.ccc with com.xxx.C@15ac3c9

এবং এটাই! এখন আপনার এক্সএমএল সংজ্ঞা নেই, আপনার টীকা রয়েছে।

চূড়ান্ত উদাহরণ হিসাবে, টীকাগত ক্লাসগুলি রেখে A, Bএবং Cএক্সএমএলে নিম্নলিখিতগুলি যুক্ত করা, প্রসঙ্গটি লোড করার পরে আমরা কী পাব?

<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

আমরা এখনও সঠিক ফলাফল পেয়েছি:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

এমনকি যদি ক্লাসের জন্য শিম Aস্ক্যান করে না পাওয়া যায়, তবে প্রসেসিং সরঞ্জামগুলি এখনও <context:component-scan>প্রয়োগের প্রসঙ্গে নিবন্ধিত সমস্ত মটরশুটি দ্বারা প্রয়োগ করা হয়, এমনকি এমনকিA যার এক্সএমএলটিতে ম্যানুয়ালি নিবন্ধিত ছিল।

কিন্তু কি যদি আমরা নিম্নলিখিত এক্সএমএল আছে, আমরা মটরশুটি সদৃশ হবে কারণ আমরা নির্দিষ্ট কিছু উভয় <context:annotation-config />এবং <context:component-scan>?

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />

না, কোনও সদৃশ নেই, আমরা আবার প্রত্যাশিত ফলাফল পেয়েছি:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

এটি কারণ উভয় ট্যাগ একই প্রক্রিয়াকরণ সরঞ্জামগুলি নিবন্ধভুক্ত করে ( নির্দিষ্ট <context:annotation-config />করা থাকলে বাদ দেওয়া যেতে পারে <context:component-scan>) তবে সেগুলি কেবল একবার চালানোর ক্ষেত্রে স্প্রিং যত্ন নেয়।

এমনকি যদি আপনি একাধিকবার প্রসেসিংয়ের সরঞ্জামগুলি নিবন্ধিত করেন তবে বসন্ত এখনও তা নিশ্চিত করবে যে তারা কেবল একবার তাদের যাদু করেছে; এই এক্সএমএল:

<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
<bean id="bla" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla1" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla2" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla3" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

এখনও নিম্নলিখিত ফলাফল উত্পন্ন করবে:

creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@25d2b2
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87

ঠিক আছে, এটি সম্পর্কে এটি আপ আপ।

আমি আশা করি @ টমাসজ নুরকিউইজ এবং @ সিয়ান প্যাট্রিক ফ্লয়েডের প্রতিক্রিয়া সহ এই তথ্যটি আপনার কীভাবে <context:annotation-config>এবং কীভাবে <context:component-scan>কাজ করা তা বোঝার দরকার are


8
উক্তি: "<প্রসঙ্গ: উপাদান-স্ক্যান> নির্দিষ্ট করা থাকলে" <প্রসঙ্গ: টিকা-কনফিগারেশন /> বাদ দেওয়া যেতে পারে "। কেন কখনও টীকা-কনফিগারেশন ব্যবহার করবেন? কেন এটি বিদ্যমান?
ক্লাইবার

2
দুর্দান্ত উত্তর! সংক্ষিপ্ত বিবরণ সহ একটি সংক্ষিপ্ত পরিষ্কার উদাহরণের মতো কিছুই নয়। পুরোটা এক পঠনে বুঝেছি।
জিগিশ

19
আমি আশা করি আপনি পুরো বসন্ত ম্যানুয়াল লিখেছেন! বিভ্রান্তিকর ফ্রেমওয়ার্ক সম্পর্কিত কোনও কিছুর বিষয়ে সেরা ব্যাখ্যা explanation ধন্যবাদ।
ইসকালের

7
তাই সহজ এবং অসামান্য ব্যাখ্যা। উত্তর পাওয়ার পাশাপাশি আমি জিনিসগুলি বলার ভাল
আমির আল

2
আপনার লেখার স্টাইলটি কোনও শিক্ষানবিশকে বুঝতে খুব সহজ। আমি আশা করি আপনি বেসিক বসন্ত সম্পর্কে একটি বই লিখতে পারেন। আমি এটি কিনতে প্রতিশ্রুতি।
এমেরালডিউ

167

কোন এনোটোটেশনগুলি কোন ঘোষণার দ্বারা বাছাই করা হয়েছে তার এই দুর্দান্ত সংক্ষিপ্তরটি আমি পেয়েছি । এটি অধ্যয়ন করে আপনি দেখতে পাবেন যে <context:component-scan/>টীকাগুলির একটি সুপারসেটকে স্বীকৃতি দেয় <context:annotation-config/>, যথা:

  • @Component, @Service, @Repository, @Controller,@Endpoint
  • @Configuration, @Bean , @Lazy, @Scope, @Order, @Primary, @Profile, @DependsOn, @Import,@ImportResource

যেমন আপনি দেখতে পারেন <context:component-scan/> CLASSPATH উপাদান স্ক্যানিং এবং জাভা @ কনফিগারেশন বৈশিষ্ট্যগুলির সাথে যৌক্তিকভাবে প্রসারিত <context:annotation-config/>


16
@ টমাসজ লিঙ্কটি ডাউন করুন :(
আনন্দ রকজ

95

বসন্ত আপনাকে দুটি জিনিস করতে দেয়:

  1. মটরশুটি অনুমোদিত
  2. মটরশুটি এর অটোডিস্কোভারি

1. অটোরিয়িং
সাধারণত অ্যাপ্লিকেশন কনটেক্সট.এক্সএমএলে আপনি মটরশুটি সংজ্ঞা দেন এবং অন্যান্য মটরশুটি কনস্ট্রাক্টর বা সেটার পদ্ধতি ব্যবহার করে তারযুক্ত হয়। আপনি এক্সএমএল বা টীকাগুলি ব্যবহার করে মটরশুটিগুলি ওয়্যার করতে পারেন। আপনি টীকা ব্যবহার ক্ষেত্রে, আপনি সক্রিয় টীকা করতে হবে এবং আপনি যোগ আছে <context:annotation-config />মধ্যে applicationContext.xml । এটি অ্যাপ্লিকেশনসন্টেক্সটেক্স.এমএমএল থেকে ট্যাগের কাঠামো সহজ করবে , কারণ আপনাকে ম্যানুয়ালি মটরশুটি বেঁধে দিতে হবে না (কনস্ট্রাক্টর বা সেটার)। আপনি @Autowireটীকাটি ব্যবহার করতে পারেন এবং মটরশুটি টাইপ করে তারযুক্ত হবে।

ম্যানুয়াল এক্সএমএল কনফিগারেশন থেকে রক্ষা পাওয়ার জন্য এক ধাপ এগিয়ে

2. Autodiscovery
Autodiscovery এক্সএমএল সরল হয় আরও এক ধাপ, এই অর্থে যে আপনি এমনকি যোগ খুব প্রয়োজন না <bean>ট্যাগে applicationContext.xml । আপনি কেবল নীচের একটি এনটোটেশন দিয়ে নির্দিষ্ট মটরশুটিটি চিহ্নিত করুন এবং স্প্রিংটি চিহ্নিত করা মটরশুটি এবং তাদের নির্ভরতাগুলি স্প্রিং পাত্রে স্বয়ংক্রিয়ভাবে তারের করে দেবে। টীকা হিসাবে অনুসরণ আছেন: @Controller , @Service , @Component , @Repository<context:component-scan>বেস প্যাকেজটি ব্যবহার করে এবং নির্দেশ করে, স্প্রিং স্প্রিং কনটেইনারগুলিতে উপাদানগুলি স্বয়ংক্রিয়ভাবে আবিষ্কার করবে এবং তারের করবে।


উপসংহার হিসেবে:

  • <context:annotation-config />@ অটোভায়ার্ড টীকাগুলি ব্যবহার করতে সক্ষম হতে ব্যবহৃত হয়
  • <context:component-scan /> নির্দিষ্ট মটরশুটি অনুসন্ধান এবং অটোয়ারিংয়ের প্রচেষ্টা নির্ধারণ করতে ব্যবহৃত হয়।

1
উপাদান-স্ক্যান ব্যবহার করা সম্ভব তবে কোনওভাবে টীকা-কনফিগার করা যায় না?
Koray Tugay

প্রসঙ্গে এনোটেশন-কনফিগারেশন = "মিথ্যা" ব্যবহার করুন: টিকা-কনফিগারেশন ট্যাগ।
সারা

38

<context:annotation-config> মটরশুটিতে বিভিন্ন বিভিন্ন টীকা সক্রিয় করে, সেগুলি এক্সএমএল বা উপাদান স্ক্যানের মাধ্যমে সংজ্ঞায়িত করা হয়।

<context:component-scan> এক্সএমএল ব্যবহার না করে শিমের সংজ্ঞা দেওয়ার জন্য

আরও তথ্যের জন্য, পড়ুন:


আপনি আরও ব্যাখ্যা করতে পারেন? আমি যদি ব্যবহার <context:component-scan>করি তবে আমি এক্সএমএল ব্যবহার করে শিমের সংজ্ঞা ওভাররাইড করতে সক্ষম হব না?
ব্যবহারকারী 938214097

@ ব্যবহারকারী 938214097 আপনি মটরশুটিগুলি এক্সএমএলে বা উপাদান স্ক্যানিং দ্বারা টীকাগুলির মাধ্যমে সংজ্ঞায়িত করতে পারেন
সান প্যাট্রিক ফ্লয়েড

এটি কি যথেষ্ট <context:component-scan>? আমি যদি কিছু না ব্যবহার করি তবে আমি কি কিছু আলগা করব <context:annotation-config>?
ব্যবহারকারী 938214097

@ টমাসজ এর উত্তর দিয়েছে বলে মনে হচ্ছে
সান প্যাট্রিক ফ্লয়েড

31

দুজনের মধ্যে পার্থক্য আসলেই সহজ!

<context:annotation-config /> 

আপনাকে কেবল মটরশুটি তৈরির বৈশিষ্ট্য এবং কনস্ট্রাক্টরগুলির ওয়্যারিং আপের মধ্যে সীমাবদ্ধ এমন টীকাগুলি ব্যবহার করতে সক্ষম করে !.

যেখানে হিসাবে

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

সবকিছু যে সক্ষম করে <context:annotation-config />ছকের যেমন ব্যবহারের যোগে, কি করতে পারেন .. @Component, @Service, @Repository। সুতরাং আপনি পুরো মটরশুটিগুলি কেবল তারে তৈরি করতে পারেন এবং কেবল নির্মাণকারী বা বৈশিষ্ট্যগুলিতে সীমাবদ্ধ নয়।


31

<context:annotation-config>: স্প্রিং কনফিগার এক্সএমএলে ইতিমধ্যে নিবন্ধীকৃত মটরশুটিগুলির জন্য স্ক্যান করা এবং টীকা সক্রিয়করণ।

<context:component-scan>: শিমের নিবন্ধকরণ +<context:annotation-config>


@Autowired এবং @Required হয় লক্ষ্যমাত্রা সম্পত্তি স্তর যাতে শিম ব্যবহারের পূর্বে এই টীকা বসন্ত আইওসি নিবন্ধন করা উচিত নয়। এই টীকাগুলি সক্ষম করতে হয় সম্পর্কিত শিম নিবন্ধন করতে হবে বা অন্তর্ভুক্ত করতে হবে <context:annotation-config />। অর্থাত্ <context:annotation-config />কেবল নিবন্ধিত শিমের সাথে কাজ করে।

@Required সম্ভব RequiredAnnotationBeanPostProcessor প্রক্রিয়াকরণের টুল
@Autowired সম্ভব AutowiredAnnotationBeanPostProcessorপ্রক্রিয়াকরণের টুল

দ্রষ্টব্য: টীকাটি নিজেই করার মতো কিছু নয়, আমাদের একটি প্রসেসিং সরঞ্জাম প্রয়োজন , যা মূল প্রক্রিয়াটির জন্য দায়বদ্ধ একটি বর্গ is


@ রিপোসিটরি, @ সার্ভিস এবং @ কন্ট্রোলার হ'ল @ কমপিউন্ট , এবং তারা ক্লাস স্তরকে লক্ষ্য করে

<context:component-scan>এটি প্যাকেজটি স্ক্যান করে এবং সিমগুলি সন্ধান এবং নিবন্ধভুক্ত করে এবং এতে করা কাজও অন্তর্ভুক্ত <context:annotation-config />

এক্সএমএল টিকাতে স্থানান্তরিত হচ্ছে


15

দ্য <context:annotation-config>ট্যাগ স্প্রিং বলে স্বয়ংক্রিয়ভাবে @Autowired টীকা ধারণকারী ক্লাস নির্ভরতা প্রয়োজনীয়তা নিরসনের জন্য কোডবেস স্ক্যান করতে বলুন।

স্প্রিং 2.5 জেএসআর -250 টীকা যেমন @ রিসোর্স, @ পোষ্টকনস্ট্রাক্ট, এবং @ প্রিডেস্ট্রয় এর জন্য সমর্থন যোগ করে these সর্বদা হিসাবে, এগুলি স্বতন্ত্র শিম সংজ্ঞা হিসাবে নিবন্ধীকৃত হতে পারে তবে এগুলি অন্তর্ভুক্ত করেও স্পষ্টভাবে নিবন্ধিত হতে পারে<context:annotation-config> স্প্রিং কনফিগারেশনে ট্যাগ ।

টিকা ভিত্তিক কনফিগারেশনের স্প্রিং ডকুমেন্টেশন থেকে নেওয়া


স্প্রিং স্বয়ংক্রিয়ভাবে 'স্টেরিওটাইপড' শ্রেণি সনাক্তকরণ এবং অ্যাপ্লিকেশন কনটেক্সট এর সাথে সম্পর্কিত বিয়ান ডেফিনিশনগুলি রেজিস্টার করার সক্ষমতা সরবরাহ করে।

Org.springframework.stereotype এর জাভাদোক অনুসারে :

স্টেরিওটাইপস হ'ল টীকাগুলি সামগ্রিক আর্কিটেকচারে প্রকার বা পদ্ধতির ভূমিকা বোঝায় (বাস্তবায়নের পরিবর্তে, ধারণার ভিত্তিতে) level উদাহরণ: @ কন্ট্রোলার @ সার্ভিস @ রিপোসিটোরি ইত্যাদি tools এটি সরঞ্জাম এবং দিকগুলি (পয়েন্টকাটগুলির জন্য একটি আদর্শ লক্ষ্য তৈরি করে) দ্বারা ব্যবহারের উদ্দেশ্যে।

এই জাতীয় 'স্টেরিওটাইপ' ক্লাস স্বয়ংক্রিয়ায়িত করতে, <context:component-scan>ট্যাগ প্রয়োজন।

<context:component-scan>ট্যাগ এছাড়াও স্প্রিং বলে নিদিষ্ট প্যাকেজের আওতায় ইঞ্জেকশনভিত্তিক মটরশুটি (এবং তার সব subpackages) কোড স্ক্যান করতে বলুন।


14
<context:annotation-config>

শুধুমাত্র নির্ভরতা ইঞ্জেকশন সম্পর্কে এটি কেবলমাত্র@Autowired এবং @Qualiferটীকাগুলি সমাধান করে , অন্যান্য টীকাগুলি একই কাজ করে বলে আমি মনে করি কীভাবে@Inject , কিন্তু টিকা রচনাগুলির মাধ্যমে সমাধানে দ্বি সম্পর্কে সব।

সচেতন থাকুন, আপনি <context:annotation-config>উপাদানটি ঘোষণার পরেও আপনাকে অবশ্যই আপনার শ্রেণিটি ঘোষণা করতে হবে কীভাবে কোনও বিন, কীভাবে আমাদের মনে রাখবেন আমাদের কাছে তিনটি উপলভ্য বিকল্প রয়েছে

  • এক্সএমএল: <bean>
  • @ টীকাগুলি: @ কম্পোনেন্ট, @ সার্ভিস, @ রিপোসিটোরি, @ কনট্রোলার
  • জাভা কনফিগ: @ কনফিগারেশন, @ বিয়ান

সাথে এখন

<context:component-scan>

এটি দুটি কাজ করে:

  • এটি @ কমপোনেন্ট, @ সার্ভিস, @ রিপোসিটোরি, @ কনট্রোলার এবং @ কনফিগারেশনের মাধ্যমে টীকাযুক্ত সমস্ত শ্রেণীর স্ক্যান করে এবং একটি বিন তৈরি করে
  • এটি একই কাজ করে কীভাবে <context:annotation-config>

সুতরাং আপনি যদি ঘোষণা করেন <context:component-scan>, তবে আর ঘোষণা করার দরকার নেই<context:annotation-config> খুব বেশি ।

এখানেই শেষ

একটি সাধারণ পরিস্থিতি উদাহরণস্বরূপ ছিল এক্সএমএল এর মাধ্যমে কেবল শিমের ঘোষণা এবং উদাহরণস্বরূপ এনোটোটেশনের মাধ্যমে ডিআই সমাধান করুন

<bean id="serviceBeanA" class="com.something.CarServiceImpl" />
<bean id="serviceBeanB" class="com.something.PersonServiceImpl" />
<bean id="repositoryBeanA" class="com.something.CarRepository" />
<bean id="repositoryBeanB" class="com.something.PersonRepository" />

আমরা কেবল মটরশুটিই ঘোষণা করেছি, এর সম্পর্কে কিছুই নেই <constructor-arg>এবং <property>, ডিআই তাদের নিজস্ব ক্লাসে @ অটোয়ার্ডের মাধ্যমে কনফিগার করা হয়েছে। এর অর্থ সার্ভিসগুলি তাদের সংগ্রহস্থল উপাদানগুলির জন্য @ অটোভায়ার্ড ব্যবহার করে এবং জেডিবিসিটিম্পলেট, ডেটাসোর্স ইত্যাদির জন্য সংস্থানসমূহ @ অটোওয়ার্ড ব্যবহার করে


1
চমত্কার ব্যাখ্যা ধন্যবাদ। @ ম্যানুয়েল জর্ডান
বালস

7
<context:component-scan /> implicitly enables <context:annotation-config/>

দিয়ে চেষ্টা <context:component-scan base-package="..." annotation-config="false"/>করুন, আপনার কনফিগারেশনে @Service, @Repository, @Component কাজ করে জরিমানা, কিন্তু @ Autowired, @ রিসোর্স এবং @Inject না হবে।

এর অর্থ অটোওয়্যারডঅনোটেশনবিয়ানপোস্টপ্রসেসর সক্ষম হবে না এবং স্প্রিং কন্টেইনার অটোয়রিং টীকাগুলিতে প্রক্রিয়া করবে না।


এইটি আমাকে বুঝতে সাহায্য করেছে যে <প্রসঙ্গ: উপাদান-স্ক্যান /> স্পষ্টভাবে <প্রসঙ্গ: টিকা-কনফিগারেশন /> সক্ষম করে; এটি হ'ল এটি শিমের সংজ্ঞা হিসাবে স্ক্যান করে সেইসাথে ইঞ্জেকশনও প্রয়োজন। আমি টীকাগুলি-কনফিগারেশন = "মিথ্যা" দিয়ে পরীক্ষা করেছি এবং আমি স্পষ্টভাবে <প্রসঙ্গ: টিকা-কনফিগারেশন /> ব্যবহার না করে ইনজেকশনটি কাজ করবে না। শেষ পর্যন্ত আমার বোঝাপড়া আগের চেয়ে ভাল!
কৌতূহলীমাণ্ড

5
<context:annotation-config/> <!-- is used to activate the annotation for beans -->
<context:component-scan base-package="x.y.MyClass" /> <!-- is for the Spring IOC container to look for the beans in the base package. -->

অন্য গুরুত্বপূর্ণ বিষয়টি context:component-scanলক্ষ্যণীয় তা হ'ল স্পষ্টভাবে মটরশুটিতে context:annotation-configটীকাগুলি সক্রিয় করার জন্য কল করে । আচ্ছা আপনি যদি নিজের context:component-scanজন্য টিকাটি সুস্পষ্টভাবে সক্রিয় করতে না চান তবে আপনি টীকাতে টীকা-কনফিগার উপাদান নির্ধারণ করতে context:component-scanপারেন false

সংক্ষেপ:

<context:annotation-config/> <!-- activates the annotations --> 
<context:component-scan base-package="x.y.MyClass" /> <!-- activates the annotations + register the beans by looking inside the base-package -->

1

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

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

@Component, @Service, @Repository,@Controller

<context:annotation-config />:

যদি আমরা এক্সএমএলে সুস্পষ্টভাবে বিনের লিখনটি লিখতে না চাই তবে বিনের মধ্যে একটি স্বয়ংক্রিয় ওয়্যারিং রয়েছে কিনা ধারকটি কীভাবে জানতে পারে। @Autowiredটিকা ব্যবহার করে এটি সম্ভব । আমাদের ধারককে জানাতে হবে যে আমার শিমের মধ্যে অটো ওয়্যারিং রয়েছে context:annotation-config


0

একটি <context:component-scan/>কাস্টম ট্যাগ জাভা প্যাকেজগুলি স্ক্যান করা এবং শ্রেণিপথ থেকে শিমের সংজ্ঞা নিবন্ধকরণের প্রাথমিক দায়িত্ব ছাড়াও শিম সংজ্ঞাগুলির একই সেটটি রেজিস্টার করে।

যদি কোনও কারণে ডিফল্ট শিম সংজ্ঞাগুলির এই নিবন্ধটি এড়ানো হয় তবে তা করার উপায়টি হল উপাদান-স্ক্যানের অতিরিক্ত "টিকা-কনফিগারেশন" বৈশিষ্ট্যটি নির্দিষ্ট করা:

<context:component-scan basePackages="" annotation-config="false"/>

তথ্যসূত্র: http://www.java-allandsundry.com/2012/12/contextcomp घटक-scan- contextannotation.html


0

<context:annotation-config>:

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

<context:component-scan base-package="com.test..."> :

এটি স্প্রিং কন্টেইনারকে বলে, যেখানে সেই টীকাযুক্ত মটরশুটিগুলি সন্ধান শুরু করা উচিত। এখানে বসন্ত বেস প্যাকেজের সমস্ত উপ প্যাকেজ অনুসন্ধান করবে।


0

আপনি বসন্তের প্রসঙ্গে স্কিমা ফাইলটিতে আরও তথ্য পেতে পারেন। নিম্নলিখিতটি বসন্ত-প্রসঙ্গে - 4.3.xsd হয়

<conxtext:annotation-config />
Activates various annotations to be detected in bean classes: Spring's @Required and
@Autowired, as well as JSR 250's @PostConstruct, @PreDestroy and @Resource (if available),
JAX-WS's @WebServiceRef (if available), EJB 3's @EJB (if available), and JPA's
@PersistenceContext and @PersistenceUnit (if available). Alternatively, you may
choose to activate the individual BeanPostProcessors for those annotations.

Note: This tag does not activate processing of Spring's @Transactional or EJB 3's
@TransactionAttribute annotation. Consider the use of the <tx:annotation-driven>
tag for that purpose.
<context:component-scan>
Scans the classpath for annotated components that will be auto-registered as
Spring beans. By default, the Spring-provided @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, and @Configuration stereotypes    will be detected.

Note: This tag implies the effects of the 'annotation-config' tag, activating @Required,
@Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext and @PersistenceUnit
annotations in the component classes, which is usually desired for autodetected components
(without external configuration). Turn off the 'annotation-config' attribute to deactivate
this default behavior, for example in order to use custom BeanPostProcessor definitions
for handling those annotations.

Note: You may use placeholders in package paths, but only resolved against system
properties (analogous to resource paths). A component scan results in new bean definitions
being registered; Spring's PropertySourcesPlaceholderConfigurer will apply to those bean
definitions just like to regular bean definitions, but it won't apply to the component
scan settings themselves.

0

পরিপূরক হিসাবে, আপনি ব্যবহার @ComponentScanকরতে পারেন<context:component-scan> টিকা উপায় ।

এটি বসন্ত.ওতে বর্ণিত

@ কনফিগারেশন ক্লাসের সাথে ব্যবহারের জন্য উপাদান স্ক্যানিং নির্দেশাবলী কনফিগার করে। স্প্রিং এক্সএমএলের উপাদানগুলির সাথে সমান্তরালভাবে সমর্থন সরবরাহ করে।

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

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