Вовед во Spring Framework
Мартин Спасовски, Институт за Информатика, 2009
Агенда:
Што е Java EE (J2EE)
Што е Spring
Зошто Spring
Spring Mission Statement
Архитектура
Inversion of Control
AOP
MVC
Пристап до податоци
Spring.NET
Демо
Aлатки и Ресурси
Што е Java EE (J2EE) • Платформа за развивање на сервер апликации, и е кратенка од Java 2 Enterprise Edition (Тековно се исфрла од употреба терминот J2EE, со терминот Java EE) • Се разликува од Java SE (Standard Edition) во тоа што додава библиотеки кои овозможуваат функционалност за креирање на дистрибуирани апликации базирани на модуларни компоненти, кои би се извршувале на серверот • Примери за сервери на Java EE решенија: – IBM WebSphere Application Server; – SAP NetWeaver Application Server; – Red Hat JBoss, итн...
Што е Spring • Технологија напишана за Java платформата, и за .NET платформата, првенствено наменета да го поедностави дизајнот на Java web решенијата направени во Java EE: – component-based Java EE сервер апликациите сеуште не се забавни за пишување
• Првата верзија е напишана од Rod Johnson и издадена на CD со неговата книга “Expert One-onOne J2EE Design and Development” • Стана популарен во заедницата и како замена на Enterprise JavaBean (EJB) програмскиот модел
Зошто Spring? • Се адресира на важни области кон кои другите технологии делумно обрнале внимание: – Spring се цели да овозможи начин на менаџирање на бизнис објектите
• Напреден и модуларен: – Spring има слоевита архитектура, значи може да одбереме било кој дел од него, а сепак внатрешно да е конзистентен. – Тоа е добро ако сакаме да го употребиме само за нешто конкретно, пример, само за да поедостави JDBC во некој проект, или пак можеме да го употребиме за да ни ги менаџира сите бизнис објекти.
Зошто Spring? (2) • Дизајниран е со цел да може да се пишува код кој е лесен за тестирање: – со тоа е идеална околина за работење на test-driven проекти
• Затоа што е се позначајна интеграциска технологија: – Неговата улога е препознаена и од мали и големи добавувачи
• Затоа што Spring е јадрото на Spring Portfolio, пакет решенија за Java EE кој расте се повеќе од ден на ден
Spring == Java EE app. server? • Spring не е Java EE апликациски сервер • Знае да се интегрира убаво со Java EE апликациските сервери (односно со било која Java околина) • Знае (во многу случаи) елегантно да ги замени сервисите кои се традиционално овозможени од Java EE апликациските сервери
Spring Mission Statement • Што е мисијата на креаторите на Spring? – J2EE should be easier to use. – It’s best to program interfaces, rather than classes. Spring reduces the complexity cost of using interfaces to zero. – JavaBeans offer a great way of configuring applications. – OO design is more important than any implementation technology, such as J2EE. – Checked exceptions are overused in Java. A framework shouldn’t force you to catch exceptions you’re unlikely to recover from. – Testability is essential, and a framework such as Spring should help make your code easier to test. Извадок од: springframework.org
Spring Mission Statement (2) • Со ова креаторите на Spring се целат да: – Spring да биде задоволство за употребување – Нашиот апликациски код не треба да зависи на Spring API-а, или пак што помалце да ги користи – Spring не треба да се натпреварува со веќе постоечки добри решенија, туку да се интегрира со нив
Архитектура • Но всушност, што е Spring? – Inversion of Control контејнер (подетално за IoC подоцна) • Исто познато како Dependency Injection
– Технологија која овозможува аспект ориентирано програмирање (подетално за АОП подоцна) – Service Apstraction Layer
• Кратко речено, е технологија за ‘врзување’ на целата апликација, и во срцето на Spring лежат BeanFactories
Архитектура (2) • BeanFactory е типично конфигуриран во XML датотека со root елемент: • XML датотеката се содржи од повеќе елементи – Id (или име) атрибут за да се идентификува bean-от – Класен атрибут за да се специфицира целосно квалифицираната класа (fully qualified class)
Архитектура (3) • Пример (конзолна калкулатор апликација): package com.wrox.begspring; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; public class CalculateSpring { private Operation ops; private ResultWriter wtr; public void setOps(Operation ops) { this.ops = ops; } public void setWriter(ResultWriter writer) { this.wtr = writer; } public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( “beans.xml”);
• CalculateSpring главната класа, наместо да прави конкретни инстанци на Operation или ResultWriter, ја дава оваа задача на Spring контејнерот; • Контејнерот послем, ја чита конфигурациската датотека, која уште се вика дескриптор (context descriptor); Продолжува примерот
Архитектура (4) • Пример (конзолна калкулатор апликација - продолжение):
BeanFactory factory = (BeanFactory) context; CalculateSpring calc = (CalculateSpring) factory.getBean(“opsbean”); calc.execute(args); } public void execute(String [] args) { long op1 = Long.parseLong(args[0]); long op2 = Long.parseLong(args[1]); wtr.showResult(“The result of “ + op1 + ops.getOpsName() + op2 + “ is “ + ops.operate(op1, op2) + “!”); } }
• Кодот со масни букви, креира ApplicationContext; • Контекстот е креиран од страна на Spring контејнерот; Beans.xml дескрипторот е даден како аргумент на конструкторот; • на крај, се кастира објект, се врши пресметката и се враќа резултатот;
Inversion of Controls • За да го сватиме IoC контејнерот на Spring ќе дадеме прост пример: – Кога во својствата на еден bean референцираме друг bean (ова е основниот концепт )
<property name=“widgetDAO”> [ • Го повикува setWidgetDAO (myWidgetDAO), каде ]
myWidgetDAO е друг bean дефиниран во конфигурацијата
Ова е дел од кодот кај дескрипторот
Inversion of Controls (2) • Конкретниот подтип на IoC кој го врши контејнерот на Spring е наречен Dependency Injection • IoC се грижи да се ‘случуваат’ работите, и тоа да биде подалеку од апликацискиот код • Додека традиционалниот код повикува библиотеки, IoC повикува код • Контејнерот е одговорен за креирање објекти, повикување иницијализациски методи, и конфигурирање објекти преку нивно меѓусебно поврзување • Креираните објекти се всушност bean-овите, и типично е да биде контејнерот конфигуриран преку XML датотеката која содржи дефиниции за bean-овите
Inversion of Controls (3) • Пример (конекција со датабаза): private DataSource ds; public void setDs(DataSource datasource) { ds = datasource; } ... Connection conn = ds.getConnection(“user”, “pass”); Statement stmt = conn.createStatement(); ResultSet rs =stmt.executeQuery( “SELECT * FROM Cust” ); while( rs.next() ) System.out.println( rs.getString(1)) ; rs.close() ; stmt.close() ; conn.close() ;
• Кодот воспоставува JDBC врска од контејнерот, и при дефинирање на конекцијата никаде не ги внесуваме корисничкото име и лозинката, да ја воспоставувавме конекцијата конвенционално, ќе беше потребно; • Во дескрипторот се чуваат тие информации, а Spring контејнерот автоматски ги побарува од него; На следната страна: beans.xml
Inversion of Controls (4) • Пример (конекција со датабаза - продолжение): – На претходниот слајд видовме дека никаде не е наведен DataSource-от. И дека компонентата, променливата ds ја користи без да се прашува како се добиени тие податоци – Spring контејнерот ја донесува одлуката наместо компонентата која се конектира со базата, контролата над ресурсот е инвертирана – Компонентата не одлучува кој DataSource ќе се користи, во тоа е инверзијата на контролите <property name=”ds” ref=”jdbcds” />
Аспект-ориентирано програмирање (AOП) • Во големите софтверски системи, голем дел од код се адресира на специфичен проблем • АОП ја разложува апликацијата во аспекти (проблеми), наместо во објекти • АОП е техника на делење на кодот на аспекти, кои се ‘сечат’ низ еден код во дадена апликација, некогаш со чисто ООП тешко е да се модуларизира апликацијата • Типичен пример е поделба на кодот во дадена апликација на код за логирање, код за трансакции, и код за безбедност
MVC • MVC, или model-view controller e кратенка за архитектурален метод на високо ниво, и тој се грижи за сепарација на: – Корисничкиот интерфејс (view) – Податочните и бизнис сервисите (model) – И интеракциите помеѓу нив (controller)
• Се користи кога изработуваме: – Веб решенија
MVC (2) • Пример, ако креираме web фото албум, кој повлекува слики од датабаза, не би било паметно да го пишуваме кодот за пристап до датабазата директно во страната која ја прикажува сликата • Тоа доведува до: – Скоро невозможно ре-искористување на податоците без за секоја конекција да ги пишуваме одделно (или copy/paste) – Податочната и бизнис логиката станува тесно поврзана што е многу лошо кога сакаме да додадеме некоја нова опција во web решението
MVC (3) • Контролерите се специфицираат со IoC, исто како и секој друг објект public class OrderController implements Controller { private OrderRepository repo; @Autowired public OrderController(OrderRepository orderRepository) { repo = orderRepository; }
• Пример како може Spring контролер да пристапува бизнис објекти, • Spring IoC го изолира овој контролер од OrderRepository, може репозиториумот да биде од JDBC до веб сервис
public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); Order order = repo.getOrderById(id); return new ModelAndView("orderView", "order", order); }}
MVC (4)
• Илустрација на MVC и неговата слоевита структура во Spring • Овој концепт е најдобро применлив во презентациското ниво – тој е делот кој ја диригира интеракцијата помеѓу клиентот и бизнис слоевите
Пристап до податоци • Spring има поддршка за JDBC (Java Database Connectivity) • JDBC всуштност е: – API кое дефинира како може клиент да пристапи датабаза (било да е MSSQL, Oracle, MySQL, DB2, ...) – API ориентирано кон релациони датабази
• Spring JDBC може да се користи индивидуално во некоја друга апликација, не сме принудени другите делови од Spring да ги користиме
Пристап до податоци (2) • Spring JDBC е уште една област во која Spring сјае: – Нема т.н. ‘connection leaks’ – Ќе пишуваме помалце код, и впрочем скоро целиот код ќе биде пишување на кверињата – Нема да мораме повеќе да читаме RDBMS документација за чудните грешки што може да ги врати базата, нашата апликација нема да зависи од RDBMS-специфичните кодови за ракување грешки – Поголема портабилност во споредба со чист JDBC во области како ракување со BLOB-ови и повикување за зачувани процедури
Spring.NET • Дизајнот на Spring.NET e превземан од Java имплементацијата, има поддршка од Visual Studio 2002 до 2008, и од .NET 1.1 до .NET 3.0 -моментално • Не е само брзо портирање од една платформа во друга, туку, како што наведуваат авторите, е ‘спиритуално’ портирање базирано на докажана технологија и концепти кои не се врзани за една платформа • Како кај Spring, така и тука, немора да се користи целата платформа, може и само конкретен модул да искористиме доколку ни треба
Spring.NET (2)
• Илустрација на Spring.NET имплементацијата
Демо • За да се запознаеме на кратко со Spring апликација, ќе инсталираме NetBeans 6.5 (или што понова верзија)
• Одбираме Java WEB -> Web Application
Демо (2) • И најважно, од технологиите кои сакаме да ги користиме, одбираме само Spring Web MVC 2.5
• Одбираме патека и име на проект, одбираме Apache Tomcat или Glass Fish (сервери)
Демо (3) • Проектот во интернет прелистувач
• Хиерархијата на еден проект, мора да содржи дескриптори, и index.jsp
Алатки и ресурси • NetBeans: – http://www.netbeans.org
• Spring IDE plugin за Eclipse: – http://springide.org
• Sping.NET за Visual Studio: – http://www.springframework.net
• И секако, продуктот на SpringSource, т.н. SpringSource Tool Suite (STS), кој е базиран на Eclipse и е специјализиран за оваа намена: – http://springsource.com • IDE околини
Алатки и ресурси (2) • BeanDoc: – http://opensource.atlassian.com/confluence/spring/display/ BDOC/Home
• Wrox Beginning Spring Framework 2: – Кодовите на слајд 12, 13, 16, 17, и графикот на слајд 22 © Wiley Publishing, Inc.
• Spring Reference Manual: – http://static.springframework.org/spring/docs/2.5.x/referen ce/index.html
• Introduction to Spring Framework – by Rod Johnson • ресурси