View Full Version : تکنولوژِی spring جیست و چه کاربردی داره؟
mimre73
شنبه 31 مرداد 1394, 21:57 عصر
سلام دوستان کسی میتونه در مورد spring بهم اطلاعاتی بده؟
Sina.iRoid
یک شنبه 01 شهریور 1394, 11:21 صبح
من خیلی راجع بش نمی دونم. فقط اینکه Spring یه framework که تو سال 2002 معرفی شد. در برنامه نویسی چند لایه به کار برده میشه. و باید با مفاهیمی مثه Hibrenate و Struct آشنا باشی تا بدونی spring در کدام لایه ایفای نقش کنه. مثلا در لایه نمایش قرار داره یا اینکه در لایه ذخیره سازی داده قرار داره و جانشین مناسبی برای تکنولوژی EJB هست. میگم خیلی نمی دونم. ولی spring یکی از اجزای غیر قابل تفکیک در پروژه های Java EE هست.
persianshadow
سه شنبه 03 شهریور 1394, 16:45 عصر
البته لزومآ اینطوری نیست که حتمآ توی پروژه های javaEE از spring استفاده کنید. spring یه فریم ورک هست که solution های مختلفی برای نیازهای پروژه های سازمانی ارائه میده و خب چون بر اساس config کردن بنا شده میتونه به شما کمک های گسترده ای بکنه. spring در هر لایه یک solution و حتی چندین solution داره.
در ضمن دیگه الان spring فقط برای JavaEE نیست. حتی برای اندروید و NoSQL ها هم راه حل ارائه میده.
ahmad.mo74
سه شنبه 03 شهریور 1394, 18:37 عصر
هدف اصلی از ایجاد فریم ورک Spring (https://spring.io/) (میشه گفت بیشتر یه دیزاین پترنه)، رفع وابستگی (Dependency Injection (https://en.wikipedia.org/wiki/Dependency_injection)) بود.
اول درباره DI توضیح بدم.
در واقع DI صورتی از IoC (https://en.wikipedia.org/wiki/Inversion_of_control) هست. مفهوم کلیش یعنی اینکه به جای اینکه ما بیایم متدهایی از یک فریم ورک رو کال کنیم، اون فریم ورک بیاد یک سری پیاده سازی ها رو که ما در اختیارش گذاشتیم کال کنه.
که تو DI این پیاده سازی ها در قالب آبجکت (ها) در اختیار اون فریم ورک قرار میگیره. (این (http://martinfowler.com/articles/injection.html) رو هم بخونید)
یه اصل تو هالیوود هست : ".Don't call us, we'll call you"
با یه مثال بیشتر توضیح میدم.
فرض کنید یه کلاس DAO داریم این شکلی :
public interface IUserDAO {
long save(User user);
boolean update(User user);
User get(long id);
void delete(User user);
List<User> getAll();
}
و یه کلاس کنترلر :
public class UserController {
private IUserDAO userDAO;
public String register(String username, String password) {
User user = new User(0, username, password);
long id = userDAO.save(user);
return "Successfully registered. user id = " + id;
}
/*...*/
}
خب اگه به کد بالا دقت کنید، تو UserController هنوز IUserDAO ای بهش داده نشده.
اول میایم یه پیاده سازی برای IUserDAO مینویسیم مثلا با JDBC و اسمشو میزاریم JDBCUserDAO :
public class JDBCUserDAO implements IUserDAO {
/*...*/
}
خب حالا توی کلاس UserController میتونیم چند کار کینم.
مثلا userDAO رو همونجا new کنیم (که در اینصورت UserController کاملا به IUserDAO وابسته میشه)، یا اینکه با کانستراکتور (بازم وابستگی وجود داره اما کمتر) یا ...
public class UserController {
private IUserDAO userDAO;
public UserController(IUserDAO userDAO) {
this.userDAO = userDAO;
}
/*...*/
}
اگر بخوایم از UserController استفاده کنیم مجبوریم همچین کاری بکنیم :
UserController userController = new UserController(new JDBCUserDAO());
خب این داره کار میکنه کسی هم مشکلی نداره.
اما مثلا فرض کنیم به IUserDAO تو ده تا کلاس دیگه هم نیاز داریم اونوقت باید تو تک تکشون کد بالا رو بنویسیم.
حالا اگر بعدا خواستیم به جای JDBC از Hibernate یا چیز دیگه ای استفاده کنیم (یعنی وجود پیاده سازی های متفاوت) باید بریم بگردیم دنبالشون و کدمونو عوض کینم.
همه اینا یعنی وجود وابستگی توی کد.
این یه مثال ساده بود و برای همچین مقیاس کوچیکی توجیهی نداره که بخوایم از Spring استفاده کنیم، اما تو پروژه های واقعی و بزرگتر (یعنی خییییییلی بزرگتر) که چندین نفر دارن روش کار میکنن دیگه به این راحتی نمیشه هندلش کرد و احتمال خطا هم به شدت افزایش پیدا میکنه.
اینجاست که فریم ورکی مثل Spring وارد میشه و همه اینکارا رو به بهترین و ساده ترین شکل ( + کلی امکانات دیگه) برامون انجام میده.
تنها کاری که ما باید بکنیم اینه که پیاده سازی (های) IUserDAO رو بهش بشناسونیم، و توی UserController به Spring بگیم تا اونارو در اختیارمون بذاره (اصطلاحا wire کنه).
2 روش برای اینکار وجود داره.
XML : همه این تنظیمات رو میتونیم تو یه فایل xml بدیم به Spring.
bean.xml :
<bean id="jdbcUserDAO" class="JDBCUserDAO"/>
<bean class="UserController">
<constructor-arg name="userDAO" ref="jdbcUserDAO"/>
</bean>
Annotation : با استفاده از Autowired@ خیلی راحت میشه اینکارو کرد.
import org.springframework.beans.factory.annotation.Autow ired;
import org.springframework.beans.factory.annotation.Quali fier;
/**
* @author ahmad
*/
public class UserController {
@Autowired
@Qualifier(value = "jdbcUserDAO")
private IUserDAO userDAO;
/*...*/
}
(Qualifier@ رو موقعی استفاده میکنیم که چندین پیاده سازی داشته باشیم و بخوایم از بینشون یکی رو مشخص کنیم)
bean ها باید تو فایل xml تعریف بشن.
bean.xml :
<bean id="jdbcUserDAO" class="JDBCUserDAO"/>
<bean class="UserController"/>
یا اینکه از Component@ روی نام کلاس استفاده کنید تا دیگه لازم نباشه تو فایل xml تعریف بشن.
فقط نکته اینجاست که با new کردن UserController اسپرینگ نمیتونه کارشو بکنه. باید bean رو از Spring بگیریم (که براشون proxy بسازه).
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserController userController = context.getBean(UserController.class);
}
vahid forghani
پنج شنبه 02 مهر 1394, 17:09 عصر
من چندتا مقاله خیلی خوب راجع به Spring پیدا کردم میتونید در زیر اونارو ببینید. کاملا فارسی و روان
مقالات مربوط به Spring (http://jprogrammers.com/category/Spring)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.