معماری
ضعیفبد نیستمتوسطخوبعالی (2 votes, average: 5٫00 out of 5)
Loading...

راه اندازی خودکار (Autowiring) در فریم ورک اسپرینگ

به نام خدای بخشنده مهربان

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

آموزش فریم ورک اسپرینگ | Spring

ویژگی 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>

همچنین ببینید

امنیت در پیام رسانی

امنیت پیام های شما چقدر است؟

با نام و یاد خدا با توجه به گسترش روز افزورن استفاده از نرم افزارهای …

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *