PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : راه اندازی خودکار (Autowiring) در فریم ورک اسپرینگ



saeed.mihan
July 27th, 2017, 12:34
خوشحالیم که بعنوان اولین مرجع فارسی زبان، آموزش (https://www.mihanlearn.net) های مربوط به فریم ورک اسپرینگ (https://www.mihanlearn.net/tag/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%a7%d8%b3%d9%be%d8%b1%db%8c%d9%86%da%af/) را بطور رایگان برای اولین بار در کشور در اختیارتان قرار می دهیم. https://www.mihanlearn.net/wp-content/uploads/2017/07/SpringFramework_MihanLearn_NET-1024x466.jpg (https://www.mihanlearn.net)
ویژگی Autowiring از فریمورک اسپرینگ (https://www.mihanlearn.net/category/learn/java-spring-tutorial/) این قابلیت را در اختیار شما قرار می دهد تا صریحا، اقدام به تزریق وابستگی اشیا نمایید و برای اینکار از تزریق سازنده و setter استفاده می کند. Autowiring را نمی توان برای تزریق مقادیر اولیه (primitive) و رشته ها (string) به کار برد. Autowiring تنها با reference کار می کند. مزیت Autowiring نیاز به کد کمتر، چرا که برای تزریق وابستگی نیاز به نوشتن کد بصورت صریح نخواهیم داشت. معایب Autowiring کنترل در دست برنامه نویس نیست.
برای مقادیر primitive و رشته ها نمی توان از آن استفاده کرد. حالت های Autowiring Autowiring دارای mode های زیادی به شرح زیر است:

Mode
توضیحات


no
این حالت پیشفرض Autowiring است. یعنی در حالت پیشفرض این قابلیت غیرفعال است


byName
حالت byname وابستگی اشیا را بر اساس نام bean تزریق می کند. در این حالت، لازم است نام property و نام bean یکسان باشند. برای تزریق از فراخوانی متود setter استفاده می کند.


byType
حالت byType وابستگی اشیا را بر اساس نوع (type) انجام می دهد. بنابراین نام property و نام bean می توانند متفاوت باشند. برای تزریق از فراخوانی متود setter استفاده می کند.


constructor
مد constructor، وابستگی را با فراخوانی سازنده کلاس تزریق می کند. این حالت سازنده ای را فراخوانی می کند که تعداد پارامترهای ورودی زیادی دارد.


autodetect
این حالت بعد از ورژن 3 اسپرینگ، حذف شد.



نمونه هایی از Autowiring بیایید چند نمونه کد ساده برای استفاده از Autowiring در فریمورک اسپرینگ را با هم ببینیم. برای اینکه حالت autowire را فعال کنید باید از خصیصه autowire از bean استفاده کنیم.

<bean id=”a” class=”org.sssit.A” autowire=”byName”></bean>

حال یک مثال کامل از autowiring در اسپرینگ ببینیم. برای ایجاد این مثلا، 4 فایل زیر را ایجاد کرده ایم:
B.java
A.java
applicationContext.xml
Test.java

B.java

این کلاس تنها شامل یک سازنده و یک متود است.


package org.sssit;
public class B {
B(){System.out.println("b is created");}
void print(){System.out.println("hello b");}
}

A.java

این کلاس شامل ارجاعی به کلاس B ، سازنده و متود است.


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();
}

}

applicationContext.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

</beans>

Test.java

این کلاس bean را از فایل applicationContext.xml می گیرد و متود display را فراخوانی می کند.


package org.sssit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlAp plicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
A a=context.getBean("a",A.class);
a.display();
}
}
خروجی: b is created
a is created
hello a
hello b
________________________________________
1) حالت byname در حالت byname از autowiring، باید bean id و reference name یکسان باشند. در این حالت از تزریق setter استفاده می کند.

<bean id="b" class="org.sssit.B"> </bean>
<bean id="a" class="org.sssit.A" autowire="byName"> </bean>

اما اگر نام bean را تغییر دهید، دیگر تزریق وابستگی را انجام نخواهد داد! در قطعه کد زیر نحوه تغییر نام bean از b به l را مشاهده می کنید.


<bean id=”b1″ class=”org.sssit.B”></bean>
<bean id=”a” class=”org.sssit.A” autowire=”byName”></bean>
________________________________________
2) حالت byType در حالت byType autowiring، bean id و reference name می تواند متفاوت باشد. اما باید تنها یک bean از یک type وجود داشته باشد. روش تزریق نیز تزریق setter است.
<bean id="b1" class="org.sssit.B"> </bean>
<bean id="a" class="org.sssit.A" autowire="byType"> </bean>

در این حالت، بدرستی کار می کند زیرا یک نمونه از نوع B ایجاد شده است و اهمیتی ندارد که نام bean و نام reference با هم تفاوت دارد. اما اگر چندین bean از یک نوع (type) داشته باشید، استثنا رخ داده و پرتاب می شود. در زیر قطعه کدی می بینید که تعداد زیادی bean از نوع B وجود دارد.

<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>

در این حالت استثنا پرتاب می شود.
________________________________________
3) حالت constructor autowiring در این حالت، مدیر اسپرینگ تزریق وابستگی را با استفاده از سازنده ای که بیشترین پارامتر را دارد، انجام می دهد. اگر در یک کلاس شما سه سازنده داشته باشید، یکی با 0 آرگومان، دیگری با 1 آرگومان و دیگری با 2 آرگومان، در این حالت تزریق با فراخوانی متودی که 2 آرگومان دارد صورت خواهد پذیرفت.


<bean id="b" class="org.sssit.B"> </bean>
<bean id="a" class="org.sssit.A" autowire="constructor"> </bean>

________________________________________

4) حالت no autowiring در حالت no autowiring، مدیر اسپرینگ از طریق autowiring تزریق وابستگی انجام نمی دهد.


<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="no"></bean>

منبع: میهن لرن (https://www.mihanlearn.net/2017/07/autowiring-in-spring/)