-
July 27th, 2017, 12:34
#1
عضو انجمن
راه اندازی خودکار (Autowiring) در فریم ورک اسپرینگ
خوشحالیم که بعنوان اولین مرجع فارسی زبان، آموزش های مربوط به فریم ورک اسپرینگ را بطور رایگان برای اولین بار در کشور در اختیارتان قرار می دهیم. 
ویژگی Autowiring از فریمورک اسپرینگ این قابلیت را در اختیار شما قرار می دهد تا صریحا، اقدام به تزریق وابستگی اشیا نمایید و برای اینکار از تزریق سازنده و 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.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();
}
}
خروجی: 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>
منبع: میهن لرن
ویرایش توسط saeed.mihan : July 27th, 2017 در ساعت 12:43
مشاهده آموزش های صفر تا صد سئو، دیجیتال مارکتینگ، شبکه: میهن لرن
-
-
July 27th, 2017 12:34
# ADS