<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