مشخصات مقاله
آموزش Auto wiring-Java Spring
راه انداز خودکار (Autowiring)
Autowiring در اسپرینگ
ویژگی Autowiring در فریمورک اسپرینگ این قابلیت را به شما می دهد تا به صورت ضمنی به تزریق وابستگی اشیا بپردازید و برای این کار از تزریق setter یا سازنده استفاده می کند. از ویژگی Autowiring نمی توان برای تزریق مقادیر اولیه و رشته استفاده کرد. این ویژگی تنها با مرجع کار می کند.
مزیت Autowiring :
نوشتن کد کمتر! زیرا دیگر نیاز نداریم صریحاً کد تزریق وابستگی را بنویسیم.
معایب Autowiring :
1- کنترل در اختیار برنامه نویس نیست
2- برای مقادیر اولیه و رشته ها نمی توان از Autowiring استفاده کرد.
حالت های Autowiring :
این ویژگی دارای حالات زیادی است از جمله:
- No : این حالت پیش فرض Autowiring است و به این معنی است که این ویژگی به طور پیش فرض غیر فعال است.
- Byname : این حالت بر اساس نام bean ، وابستگی شی را تزریق می کند. در این حالت، نام bean و property باید یکسان باشد. برای تزریق متد setter فراخوانی می شود.
- Bytype : این حالت بر اساس نوع ، وابستگی شی را تزریق می کند. بنابراین نام bean و property می تواند متفاوت باشد. برای تزریق متد setter فراخوانی می شود.
- Constructor : این حالت با فراخوانی سازنده کلاس به تزریق وابستگی می پردازد. به این صورت که سازنده ای با تعداد پارامتر بیشتر را فراخوانی می کند.
- Autodetect : این حالت بعد از نسخه 3 اسپرینگ حذف شد.
مثال Autowiring :
مثالی ساده از کاربرد Autowiring در اسپرینگ را بررسی می کنیم. برای اعمال حالات Autowire ، باید از ویژگی autowire عنصر bean استفاده کنید.
1 2 | < bean id= "a" class = "org.sssit.A" autowire= "byName" >< /bean> <button></button> |
اکنون مثال کاملی از Autowiring در اسپرینگ را بررسی می کنیم. برای ساخت این مثال چهار فایل زیر را ایجاد کردیم.
1. B.java
2. A.java
3. applicationContext.xml
4. Test.java
B.java:
این کلاس تنها شامل یک سازنده و متد است.
1 2 3 4 5 6 | package org.sssit; public class B { B(){System.out.println( "b is created" );} void print(){System.out.println( "hello b" );} } <button></button> |
A.java:
: این کلاس شامل مرجع کلاس B و سازنده و متد است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package org.sssit; public class A { B b; A(){System.out.println( "a is created" );} public B getB() { return b; } public void setB(B b) { this .b = b; } void print(){System.out.println( "hello a" );} void display(){ print(); b.print(); } } <button></button> |
applicationContext.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 | < ? xml version = "1.0" encoding = "UTF-8" ?> 6. xsi:schemaLocation="http://www.springframework.org/schema/beans < bean id = "b" class = "org.sssit.B" >< / bean > < bean id = "a" class = "org.sssit.A" autowire = "byName" >< / bean > < / beans > < button ></ button > |
Test.java:
این کلاس bean را از فایل applicationContext.xml می گیرد و متد display را فراخوانی می کند.
1 2 3 4 5 6 7 8 9 10 11 | package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context= new ClassPathXmlApplicationContext( "applicationContext.xml" ); A a=context.getBean( "a" ,A. class ); a.display(); } } <button></button> |
خروجی :
b is created
a is created
hello a
hello b
1- حالت byname Autowiring
در این حالت، شناسه bean و نام مرجع باید یکسان باشد. این حالت از تزریق setter استفاده می کند.
1 2 3 | < bean id= "b" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "byName" >< /bean> <button></button> |
اما اگر نام bean را تغییر دهید، وابستگی را تزریق نخواهد کرد. در اینجا مثالی داریم که در آن نام bean را از b به b1 تغییر داده ایم.
1 2 3 | < bean id= "b1" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "byName" >< /bean> <button></button> |
2- حالت byType Autowiring
در این حالت، شناسه bean و نام مرجع ممکن است متفاوت باشد. اما باید تنها یک bean از هر نوع وجود داشته باشد. این حالت از تزریق setter استفاده می کند.
1 2 3 | < bean id= "b1" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "byType" >< /bean> <button></button> |
این کد، به درستی کار می کند زیرا یک نمونه از نوع B ایجاد کرده ایم و اهمیتی ندارد که نام bean و نام مرجع متفاوت است. اما اگر چندین bean از یک نوع داشته باشیم، کد کار نمی کند و خطا می دهد. در ادامه کدی را داریم که چندین bean از نوع B دارد.
1 2 3 4 | < bean id= "b1" class = "org.sssit.B" >< /bean> < bean id= "b2" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "byName" >< /bean> <button></button> |
در این حالت خطا رخ می دهد.
3- حالت constructor Autowiring
در این حالت، مدیر اسپرینگ وابستگی را توسط سازنده با بیشترین پارامتر تزریق می کند. اگر در یک کلاس سه سازنده با صفر، یک و دو آرگومان داشته باشیم، تزریق با فراخوانی سازنده با دو آرگومان انجام می شود.
1 2 3 | < bean id= "b" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "constructor" >< /bean> <button></button> |
4- حالت no Autowiring
در این حالت، مدیر اسپرینگ وابستگی را با Autowiring تزریق نمی کند.
1 2 3 | < bean id= "b" class = "org.sssit.B" >< /bean> < bean id= "a" class = "org.sssit.A" autowire= "no" >< /bean> <button></button> |