خوشحالیم که بعنوان اولین مرجع فارسی زبان، آموزش های مربوط به فریم ورک اسپرینگ را بطور رایگان برای اولین بار در کشور در اختیارتان قرار می دهیم.
ویژگی 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 استفاده کنیم.
حال یک مثال کامل از autowiring در اسپرینگ ببینیم. برای ایجاد این مثلا، 4 فایل زیر را ایجاد کرده ایم:کد:<bean id=”a” class=”org.sssit.A” autowire=”byName”></bean>
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 ، سازنده و متود است.
applicationContext.xmlکد: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(); } }
Test.javaکد:<?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>
این کلاس bean را از فایل applicationContext.xml می گیرد و متود display را فراخوانی می کند.
خروجی: b is createdکد: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(); } }
a is created
hello a
hello b
________________________________________
1) حالت byname در حالت byname از autowiring، باید bean id و reference name یکسان باشند. در این حالت از تزریق setter استفاده می کند.
اما اگر نام bean را تغییر دهید، دیگر تزریق وابستگی را انجام نخواهد داد! در قطعه کد زیر نحوه تغییر نام bean از b به l را مشاهده می کنید.کد:<bean id="b" class="org.sssit.B"> </bean> <bean id="a" class="org.sssit.A" autowire="byName"> </bean>
________________________________________کد:<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 است.در این حالت، بدرستی کار می کند زیرا یک نمونه از نوع B ایجاد شده است و اهمیتی ندارد که نام bean و نام reference با هم تفاوت دارد. اما اگر چندین bean از یک نوع (type) داشته باشید، استثنا رخ داده و پرتاب می شود. در زیر قطعه کدی می بینید که تعداد زیادی bean از نوع B وجود دارد.کد:<bean id="b1" class="org.sssit.B"> </bean> <bean id="a" class="org.sssit.A" autowire="byType"> </bean>
در این حالت استثنا پرتاب می شود.کد:<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>





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

پاسخ با نقل قول
