Реферат на тему " Spring Framework"




Скачати 329,45 Kb.
Сторінка4/4
Дата конвертації23.10.2016
Розмір329,45 Kb.
1   2   3   4

AOP

Одним з ключових компонентів Spring є AOP framework. Навіть не використовуючи AOP напряму всі, швидше за все, зіштовхнуться з ним непрямо.


Основні задачі, які вирішуються за допомогою AOP в Spring:

  1. Декларативне управління транзакціями.

  2. Організація пулів об’єктів.

  3. Написання власних аспектів.

Найзручніший і найгнучкіший спосіб управління транзакціями це декларативне управління транзакціями. Якщо хтось раніше працював з EJB CMT, то він чудово уявляє, що це таке. Декларативне управління транзакціями позбавляє код від залежності від фреймворка чи конкретного механізму управління транзакціями.
Конфігураційний файл (applicationContext.xml) виглядає наступним чином:


>



PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED

Об’єкт myService - це вже транзакційний MyBusinessObject, доступ до нього здійснюється через Proxy (TransactionProxyFactoryBean), який і управляє транзакціями. Для користувача не буде ниякої різниці, чи то робота з Proxy, чи то робота з MyBusinessObject напряму. Є і інший спосіб опису транзакційної конфігурації, через BeanNameAutoProxyCreator. Даний спосіб дозволяє скоротити розмір конфігураційного файлу.

Організація пулів об’єктів застосовується і до EJB. Контейнер підтримує пул stateless session EJB, при виклику методу об’єкт звільняється з пула. При використанні Spring, пул об’єктів може підтримуватись для будь-яких POJO (Plain Old Java Object). Приклад конфігураційного файлу:

singleton="false"/>


>

25





>


AOP допомагає позбавитись від дублювання коду. Java - це об’єктно-орієнтована мова, яка дозволяє створювати ієрархії взаємозв’язаних об’єктів. Але як бути, якщо один і той самий код використовується в різних ієрархіях об’єктів?

Будь-яке застосування можна розглядати з двох позицій: з точки зору функціональності окремих класів (core concerns) і функціонала, який охоплює все застосування (crosscutting concerns). Модулі, які керують crosscutting concerns, називаються аспектами. В Spring аспекти реалізуються через Advisors і Interceptors.
Аспекти можуть вирішувати наступні задачі: логування, кешування, управління безпекою, транзакції і т.д. Введення додаткового шару інтерцепторів размежовує відповідальність між основним кодом і допоміжними задачами. В результаті спрощується супроводження коду і його повторне використання. Інтерцептори конфігуруються незалежно, вони моуть використовуватись в інших проектах, в свою чергу об’єкти можуть конфігуруватись з різними інтерцепторами.
В якості прикладу візьмемо задачу - визначення часу виконання методів. Це може бути корисно для виявлення вузьких місць, як в час тестування, так і на production при реальній кількості користувачів на реальних даних.


public class PerformanceInterceptor implements MethodInterceptor {

private static Logger log = Logger.getLogger(PerformanceInterceptor.class);
public Object invoke(MethodInvocation methodInvocation) throws Throwable {

Method method = methodInvocation.getMethod();
log.info("========= Start Performance log =============");

log.info("1. executing method: " + method.getName());


long startTime = System.currentTimeMillis();

Object result = methodInvocation.proceed();

long endTime = System.currentTimeMillis();
log.info("2. time: " + (endTime - startTime) + " ms");

log.info("========= End Performance log =============");


return result;

}

}


Зверніть увагу на інтерфейс org.aopalliance.intercept.MethodInterceptor. Це інтерфейс AOP Alliance. Відповідно такі інтерцептори є переносними в інші AOP frameworks. В Spring є свої власні інтерфейси інтерцепторів, призначені для різних випадків.


MethodInterceptor є найбільш повним контролем над процесом виконання. Для нашої задачі підходить саме цей інтерфейс. В рядку 12 відбувається виклик наступного інтерцептора в ланцюжку, або методу основного об’єкта. Варто зазначити, що для того, щоб PerformanceInterceptor надавав найточнішу інформацію про час виконання методу, він має бути останнім в ланцюжку.
Тепер залишилось тільки змінити конфігураційний файл.

/>

/>

>



performanceInterceptor







Додаткові можливості

Як вже було сказано раніше, Spring крім IoC контейнера включає в себе безліч класів, які реалізують найбільш необхідний функціонал J2EE застосувань. Spring суттєво спрощує роботу з JDBC, ORM frameworks, EJB, Web services. Framework реалізує більш високий рівень абстракції управління розсилкою пошти, кэшуванням, виконанням задач за розкладом. Крім цього Spring включає в себе ще і Web framework.


Малоймовірно, що в розроблюваному застосуванні будуть використовуватись всі можливості Spring. Тому можна включати в застосування тільки ті jar-архіви, класи котрих використовуються. Spring групує класи в jar по пакетах: spring-aop.jar, spring-beans.jar і т.д. Можна включити один jar з усіма класами - spring.jar.

Далі будуть описані деякі з можливостей Spring Framework.

JDBC


Розглянемо приклад.


public class SimpleDAO extends JdbcDaoSupport {

// SqlRowSet это disconnected java.sql.ResultSet



public SqlRowSet getUserRowSet(String id) {

return getJdbcTemplate().queryForRowSet(

"select name, email from user where id = ?",



new Object[] {id});

}

public int getMaxAmount() {



return getJdbcTemplate().queryForInt("select max(amount) from payments");

}

// Результат запроса "оборачивается" в бин User



public List getUsersByName(String username) {

return getJdbcTemplate().query(

"select * from user where username = ?",



new Object[] { username },

new RowMapper() {

public Object mapRow(ResultSet resultSet, int i)

throws SQLException {

User user = new User();

user.setId(resultSet.getInt(1));

user.setName(resultSet.getString(2));



return user;

}

});



}}

Більше не потрібно писати громіздкі конструкції try {..} catch (..) finally {..}, керувати з’єднаннями, транзакціями. Прості запити взагалі вміщуються в один рядок.


ІнтерналізацІя (i18n) і конфігурація

Spring включає класи й інтерфейси, призначені для інтерналізації застосування. Всі повідомлення зберігаються в properties файлах. Один properties файл відповідає одній мові. Для того, щоб отримати доступ до цих повідомлень, в applicationContext.xml необхідно додати messageSource бін. Ім’я messageSource є обов’язковим. Spring підтримує ієрархічні повідомлення.



>



springfundamentals.i18n.messages

springfundamentals.i18n.formats



В інтерфейсі ApplicationContext (основний інтерфейс, який визначає конфігурацію застосування) є відповідні методи getMessage(MessageSourceResolvable resolvable, Locale locale), getMessage(String code, Object[] args, Locale locale), getMessage(String code, Object[] args, String defaultMessage, Locale locale). Приклад використання:



messages_en.properties

======================

mesg=test message parameter: {0}
...
ApplicationContext context = ...

String message = context.getMessage(

"mesg",

new Object[] {"paramName"} ,



"default message",

Locale.US));


Всі конфігураційні параметри застосування зручно зберігати в одному чи декількох properties файлах. До них можна буде звертатись прямо з applicationContext.xml. Для цього в applicationContext.xml необхідно додати бін.



>



Тоді до параметрів можна буде звертатись наступним чином.



>


Де jdbc.jndiName - конфігураційний параметр в WEB-INF/config.properties.


Events


Обробка подій в Spring здійснюється через клас ApplicationEvent та інтерфейс ApplicationListener. При настанні події нотифікуються всі об’єкти, які реалізують інтерфейс ApplicationListener.

Розглянемо приклад.



public class EventPublisher implements ApplicationContextAware {

private ApplicationContext context;

public void setApplicationContext(ApplicationContext applicationContext)

throws BeansException {

this.context = applicationContext;

}

public void go() {

context.publishEvent(new ApplicationEvent("event") {



public long getTimestamp() {

return super.getTimestamp();

}

});



}

}

public class EventListener implements ApplicationListener {



public void onApplicationEvent(ApplicationEvent event) {

System.out.println("Event: " + event.getSource());



}

}



Виклик context.publishEvent() відбувається в синхронному режимі. Всі ApplicationListener виконуються в тому ж транзакційному контексті, що й EventPublisher.

Переваги Spring


За Родом Джонсоном Spring унікальний з декількох причин:

  • Він торкається багатьох сфер, яких інші популярні фреймворки не чіпають. Spring фокусується на забезпеченні можливості управління бізнес об’єктами.

  • Spring одночасно і рівневий, і модульний. Spring має рівневу архітектуру, що означає, що ви можете використовувати будь-яку її частину ізольовано, але все ж таки її структура внутрішньо послідовна. Ви можете використовувати Spring лише для спрощення використання JDBC, наприклад, або для управління всіма вашими бізнес об’єктами. До того ж, легко поступово впроваджувати Spring в інші готові проекти.

  • Spring спроектований з основи, для того, щоб допомогти вам писати код, який легко тестувати. Spring – ідеальний фреймворк test driven проектів.

  • Spring – інтеграційна технологія, яка набуває все більшої популярності, тому що її роль визнана кількома великими vendors.

Отже, Spring – потенційний one-stop магазин, який торкається більшості моментів інфраструктура типових додатків.

Архітектурні переваги Spring:

  • Spring може ефективно організувати об’єкти проміжного рівня, незалежно від того, чи вирішите ви використовувати EJB чи ні. Spring дбає про “склепання”, яке б залишилось на вашу долю, коли б ви використовували Struts чи інші фреймворки, залежних від певних J2EE APIs. А так як це, мабуть, найцінніше в проміжному рівні, Spring-ові сервіси управління конфігурацією можуть бути використані в будь-якому архітектурному рівні, в будь-якому runtime середовищі.

  • Spring може виключити неконтрольоване розмноження синглтонів, які спостерігаються в багатьох проектах. Насправді, це велика проблема, яка погано впливає на тестованість і об’єктну орієнтацію.

  • Spring може виключити необхідність в використанні різних форматів файлів для користувацьких властивостей, підтримуючи конфігурацію в несуперечливому стані для всіх застосувань і проектів. Вам траплялось цікавитись, які магічні ключі властивостей чи системні властивості необхідні конкретному класу, ф лізти за цими відомостями в Javadoc чи навіть вихідний код? В Spring досить подивитись у властивості JavaBean цього класу. Досягти такого спрощення допомагає використання Inversion of Control (інверсія керування, див. нижче).

  • Spring сприяє хорошому програмуванню, зменшуючи вартість програмування до інтерфейсів, замість класів, практично до нуля.

  • Spring спроектований так, щоб застосування, створені з його допомогою, залежали від найменшого можливого числа його API. Більшість бізнес-об’єктів в Spring-застосуваннях ніяк не залежать від Spring.

  • Для застосувань, створених за допомогою Spring, дуже просто проводити юніт-тестування.




  • Spring може зробити вибір EJB питанням реалізації, а не вирішуючим фактором архітектури застосування. Ви можете вирішити реалізовувати бізнес-інтерфейси як POJO (Plain Old Java Object, тобто прості об’єкти, а не Java Beans і т.п.) чи локальні EJB, ніяк не впливаючи цим на викликаний код.

  • Spring допомагає вирішити багато проблем, не втягуючи в це EJB. Spring може надати альтернативу EJB, застосовну для багатьох Web-застосувань. Наприклад, Spring може використовувати АОП для декларативного управління транзакціями без використання EJB-контейнера, і навіть без реалізації JTA, якщо обмежитись використанням одної БД.

  • Spring надає середовище доступу до даних з використанням JDBC чи таких ORM-продуктів, як Hibernate.

  • Spring надає стійку, просту модель програмування, перетворюючи її в ідеальний архітектурний "клей". Це можна простежити в підході Spring до JDBC, JMS, JavaMail, JNDI та багатьох інших важливих API.



Висновок

До основних переваг Spring відносяться: простота; зручність тестування; використання Spring позитивно відображається на дизайні застосування і простоті коду.


В Spring реалізовано багато, без чого не обходиться практично будь-яке Java застосування. Перед Тим, як щось винаходити щось своє, варто подивитись, може, це вже є в Spring.

Використані джерела





  1. http://springframework.org

  2. http://www.onjava.com/pub/a/onjava/2005/05/11/spring.html

  3. http://lib.juga.ru/article/articleview/216/1/3/

  4. http://www.optim.su/cs/2004/3/spring/spring.asp

  5. http://www.intuit.ru/department/se/compprog/15/4.html
1   2   3   4


База даних захищена авторським правом ©uchika.in.ua 2016
звернутися до адміністрації

    Головна сторінка