@ কম্পোনেন্টস্ক্যান টিকাটি ব্যবহার করে কীভাবে একাধিক পাথ স্ক্যান করবেন?


90

আমি স্প্রিং ৩.১ ব্যবহার করছি @Configurationএবং @ComponentScanবৈশিষ্ট্য এবং বৈশিষ্ট্য ব্যবহার করে একটি অ্যাপ্লিকেশন বুটস্ট্র্যাপিং করছি ।

আসল শুরুটি দিয়েই হয়

new AnnotationConfigApplicationContext(MyRootConfigurationClass.class);

এই কনফিগারেশন ক্লাসটি দিয়ে টিকা দেওয়া আছে

@Configuration
@ComponentScan("com.my.package")
public class MyRootConfigurationClass

এবং এই সূক্ষ্ম কাজ করে। তবে আমি যে প্যাকেজগুলি স্ক্যান করেছি সে সম্পর্কে আমি আরও সুনির্দিষ্ট হতে চাই তাই আমি চেষ্টা করেছি।

@Configuration
@ComponentScan("com.my.package.first,com.my.package.second")
public class MyRootConfigurationClass

তবে এটি আমাকে ত্রুটি বলে ব্যর্থ হয়েছে এটি @Componentটীকাটি ব্যবহার করে নির্দিষ্ট উপাদানগুলি খুঁজে পাবে না ।

আমি যা করছি তার সঠিক উপায় কী?

ধন্যবাদ


আমি যতদূর বলতে পারি ঠিক একই সময়ে দেওয়া দুটি সঠিক উত্তর। আমি হেজকে গ্রহণ করব কেবলমাত্র তার পয়েন্ট কম থাকায়, তবে উভয়কে ধন্যবাদ জানাই।
প্রোগ্রামিং গাই

আপনার জন্য একই জিনিস হতাশ হয় kotlin সংস্করণ এই এক পরীক্ষা stackoverflow.com/a/62818187/7747942
Sylhare

উত্তর:


161

@ কম্পোনেন্টসস্ক্যান স্ট্রিং অ্যারে ব্যবহার করে:

@ComponentScan({"com.my.package.first","com.my.package.second"})

আপনি যখন কেবল একটি স্ট্রিংয়ে একাধিক প্যাকেজের নাম সরবরাহ করেন, স্প্রিং এটিকে একটি প্যাকেজের নাম হিসাবে ব্যাখ্যা করে এবং এটি এটি খুঁজে পেতে পারে না।


48

স্ট্রিং হিসাবে বেস-প্যাকেজ অবস্থান নির্দিষ্ট করার জন্য অন্য ধরণের নিরাপদ বিকল্প রয়েছেএখানে এপিআই দেখুন , তবে আমি নীচে চিত্রিতও করেছি:

@ComponentScan(basePackageClasses = {ExampleController.class, ExampleModel.class, ExmapleView.class})

আপনার ক্লাসের রেফারেন্স সহ বেসপ্যাকেজ ক্লাস স্পেসিফায়ার ব্যবহার স্প্রিংকে সেই প্যাকেজগুলি স্ক্যান করতে বলবে (ঠিক উল্লিখিত বিকল্পগুলির মতো ) তবে এই পদ্ধতিটি উভয় প্রকারের নিরাপদ এবং ভবিষ্যতের রিফ্যাক্টরিংয়ের জন্য আইডিই সমর্থন যুক্ত করে - আমার বইয়ের একটি বিশাল প্লাস।

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

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


কেউ কি ব্যাখ্যা করতে পারে যে @ কমপোজেন্টসস্ক্যান ({"com.app", "com.controllers"}) আমার পক্ষে কাজ করে না তবে @Comp घटकScan (বেসপ্যাকেজক্লাস = {"com.controllers" work) কী কাজ করে? আমি প্রতিটি ক্লাসের নাম লেখার জন্য বিরক্তিকর বলে মনে করি
xaverras

4
আপনি যে প্যাকেজটি স্ক্যান করতে চান তা আপনাকে প্যাকেজে কেবল একটি শ্রেণি নির্দিষ্ট করতে হবে। এটি একটি চিহ্নিতকারী শ্রেণি হিসাবে পরিচিত। আপনার যদি শ্রেণিবদ্ধ নয় এমন হায়ারার্কিতে উচ্চতর প্যাকেজ স্ক্যান করতে হয় তবে স্প্রিং কেবলমাত্র প্যাকেজ স্ক্যানিংয়ের উদ্দেশ্যে সেই প্যাকেজে সংজ্ঞায়িত "স্প্রিং মার্কার" ইন্টারফেস বা চূড়ান্ত শ্রেণি ব্যবহার করে একটি কৌশল প্রস্তাব করে।
প্রেনার

17

আপনার প্যাকেজের নাম আলাদাভাবে সরবরাহ করুন, এটির String[]জন্য প্যাকেজ নামের প্রয়োজন।

এর পরিবর্তে:

@ComponentScan("com.my.package.first,com.my.package.second")

এটা ব্যবহার কর:

@ComponentScan({"com.my.package.first","com.my.package.second"})

10

এটি করার আর একটি উপায় হল basePackagesক্ষেত্রটি ব্যবহার করা ; যা কম্পোনেন্টস্ক্যান টীকাটির ভিতরে একটি ক্ষেত্র।

@ComponentScan(basePackages={"com.firstpackage","com.secondpackage"})

আপনি যদি জার ফাইলটি থেকে কম্পোনেন্টস্ক্যান টীকা। ক্লাসটি দেখেন তবে আপনি একটি বেসপ্যাকেজ ক্ষেত্র দেখতে পাবেন যা স্ট্রিংগুলির অ্যারে নেয় takes

public @interface ComponentScan {
String[] basePackages() default {};
}

অথবা আপনি ক্লাসগুলি স্পষ্টভাবে উল্লেখ করতে পারেন। যা ক্লাসের অ্যারে নেয়

Class<?>[]  basePackageClasses

4

ব্যবহার করে একাধিক প্যাকেজ স্ক্যান করতে আপনি কম্পোনেন্টস্ক্যান ব্যবহার করেন

@ComponentScan({"com.my.package.first","com.my.package.second"})


1

আপনি আপনার pom.xML এ এই নির্ভরতা যুক্ত করেছেন তা নিশ্চিত করুন

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

প্রায় অর্ধ ঘন্টা কাটানোর পরে ধন্যবাদ এটি অনুপস্থিত নির্ভরতা
ডিভিক্সেক্সট্রাক

1

আপনি @ কম্পোনেন্টসস্ক্যান টীকাটিও ব্যবহার করতে পারেন:

@ComponentScans(value = { @ComponentScan("com.my.package.first"),
                          @ComponentScan("com.my.package.second") })

4
দয়া করে আপনার উত্তরের ব্যাখ্যা যুক্ত করে বিবেচনা করুন
ইয়া

1

আমি ব্যবহার করি:

@ComponentScan(basePackages = {"com.package1","com.package2","com.package3", "com.packagen"})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.