หลายแพ็คเกจในบริบท: การสแกนคอมโพเนนต์, การกำหนดค่าสปริง


185

ฉันจะเพิ่มหลายแพ็คเกจในไฟล์ spring-servlet.xml ในcontext:component-scanองค์ประกอบได้อย่างไร

ฉันเหนื่อย

<context:component-scan base-package="z.y.z.service" base-package="x.y.z.controller" />

และ

<context:component-scan base-package="x.y.z.service, x.y.z.controller" />

และ

<context:component-scan base-package="x.y.z.service" />
<context:component-scan base-package="x.y.z.controller" />

แต่มีข้อผิดพลาด:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [x.y.z.dao.daoservice.LoginDAO] found for dependency:

คำตอบ:


272

วิธีการต่อไปนี้ถูกต้อง:

<context:component-scan base-package="x.y.z.service, x.y.z.controller" /> 

โปรดทราบว่าข้อผิดพลาดบ่นx.y.z.dao.daoservice.LoginDAOซึ่งไม่ได้อยู่ในแพ็คเกจที่กล่าวถึงข้างต้นบางทีคุณลืมที่จะเพิ่ม:

<context:component-scan base-package="x.y.z.service, x.y.z.controller, x.y.z.dao" /> 

5
คำตอบนี้ก็หมายความว่าจะไม่มีการเรียกซ้ำสำหรับสมาชิกของฐานแพคเกจ แต่มี: stackoverflow.com/questions/7774295/... ฉันขอแนะนำให้แก้ไขคำตอบเล็กน้อยเพื่อให้ชัดเจน
djangofan

52

วิธีการใส่หมายเหตุ

@ComponentScan({ "x.y.z", "x.y.z.dao" })

เราจำเป็นต้องเพิ่มแพ็คเกจเฉพาะหรือสามารถสแกนแพ็กเกจย่อยโดยอัตโนมัติหากเรากำหนดแพ็คเกจระดับบนสุดเท่านั้น?
Nikhil Sahu

@NikhilSahu ไม่ก็เป็นการสแกนแบบเรียกซ้ำ (สปริง 3>)
biology.info

ลิงก์สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/questions/10794587/…
dkb

43

คุณสามารถเพิ่มแพ็คเกจพื้นฐานได้หลายแพ็คเกจ (ดูคำตอบของ axtavt ) แต่คุณสามารถกรองสิ่งที่สแกนภายในแพ็คเกจฐานได้:

<context:component-scan base-package="x.y.z">
   <context:include-filter type="regex" expression="(service|controller)\..*"/>
</context:component-scan>

2
@shams ไม่จำเป็นต้องเซอร์ฉัน แต่ถ้าคำตอบนั้นถูกต้องคุณควรทำเครื่องหมายว่ายอมรับ (คลิกที่เครื่องหมายถูก)
Sean Patrick Floyd

1
ทำไมคุณไม่สามารถเพิ่มแพ็คเกจพื้นฐานหลายแพคได้? ชอบอินสแตนซ์ "org.example, com.example" หรือไม่
Shervin Asgari


19
<context:component-scan base-package="x.y.z"/>

จะทำงานได้เนื่องจากส่วนที่เหลือของแพ็คเกจเป็นแพ็คเกจย่อยของ "xyz" ดังนั้นคุณไม่จำเป็นต้องพูดถึงแต่ละแพ็คเกจเลย


2
ตกลง! บางทีมันอาจจะเป็นอีกเหตุผลหนึ่ง แต่ตอนนี้ก็ไม่ได้ทำงานให้ฉันด้วย MVC ฤดูใบไม้ผลิสำหรับพอร์ตเล็ต ...
elcadro

@elcadro ต้องผ่านเหตุผลอื่น ๆ เนื่องจากเป็นคุณลักษณะที่ได้รับการบันทึกไว้เป็นอย่างดี
eis

ฉันไม่สามารถพูดสิ่งที่ตรงกันข้ามได้หลายคนกำลังแก้ไขฉัน ฉันหวังว่าฉันจะพบว่าทำไมสิ่งนี้ไม่ได้ผลสำหรับฉัน ... ขอบคุณต่อไป!
elcadro

มันยังคงเป็นจริงแม้สำหรับการกำหนดค่าตามหมายเหตุประกอบ?
Nikhil Sahu


2

หาก xyz เป็นแพ็คเกจทั่วไปคุณสามารถใช้:

<context:component-scan base-package="x.y.z.*">

มันจะรวมแพ็คเกจทั้งหมดที่เริ่มต้นด้วย xyz like: xyzcontroller, xyzservice เป็นต้น


1

ตัวอย่างเช่นคุณมีแพ็คเกจ "com.abc" และคุณมีหลายแพ็คเกจอยู่ข้างในคุณสามารถใช้งานได้

@ComponentScan("com.abc")

0

การตอบกลับล่าช้า แต่เพื่อให้หลายแพ็คเกจโดยใช้วิธีการเพิ่มความคิดเห็นเราสามารถใช้ดังต่อไปนี้:

@ComponentScan({"com.my.package.one","com.my.package.subpackage.two","com.your.package.supersubpackage.two"})

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.