5 Июль 2009 г.

Разборки с Emacs - первые результаты см. на Хабре


Выходные провел, разбираясь с замечательной операционной средой - GNU Emacs. Кстати, очень рекомендую мануалы от Алекса Отта, в которых описаны настройки Emacs для работы с C/C++, Scheme, системами контроля версий (в том числе распределенными) и многое другое.

Результатом разбирательства стали, в частности, две статьи по Emacs, опубликованные на HabraHabr.

В статье Управляем MPD из Emacs я постарался рассказать о том, что такое вообще MPD и как прикрутить режим mingus, позволяющий отправлять этому демону команды. Если вы - фанат Emacs, а музыку слушаете с помощью MPD, то возможно статья будет вам полезна.

Тем же, кто пользуется твиттером, будет интересно почитать про twit.el - клиент twitter для emacs. Кратко описал подключение клиента, его настройку (в том числе и кастомизацию внешнего вида) и основные горячие клавиши. Давайте фоловить друг друга в Twitter.

Буду рад конструктивной критике и замечаниям. Комментарии можно оставлять там же на хабре или, если нет возможности, - здесь в блоге. Буду рад пообщаться.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter


А дальше...

1 Июль 2009 г.

С Днем RSS!


Все хорошие/великие вещи должны иметь свои традиции. Доброй традицией Блога сурового челябинского программиста стало поздравлять своих читателей/подписчиков с Днем RSS в Рунете.

Рекомендую к прочтению статью "Детективная история RSS...", статья будет интересна программистам и не очень.

Ну а теперь самое интересное - Суровый челябинский программист делится ссылками на RSS-фиды, которые он читает.

  • Google Open Source Blog - все инициативы Google, касающиеся движения за открытые исходники.

  • Tapestry Central - блог разработчиков замечательного веб-фреймворка Tapestry.

  • Spring-Hibernate-Eclipse-SHE - о самых современных средствах разработки Enterprise-приложений.

  • Agile DokuWiki - одна из самых обширных вики по Agile на русском языке.

  • Русская планета Emacs - агрегатор записей в блогах, относящихся к этому замечательному инструменту.

  • Записки искателей - интересный блог о Java, Groovy, а также Client Side.

  • Записки Старины - Старина пишет четко и без понтов о разработке игр, математике и жизни в Канаде.

  • Den Plus Plus - парни из Naumen покорили Яндекс. Ден - один из первых разработчиков Naumen Kernel - пишет о своей работе над поиском Яндекса.

  • Alex Ott - блог Алекса Отта на русском языке - статьи об emacs и функциональном программировании.

  • Antilamer - пишет четко и без понтов о Java, функциональном программировании, олимпиадах и жизни. Очень уважаю этого человека.

  • Deepen C++ - блог Юрия Волкова о С++ и не только.

  • Java Buldozer - статьи о Java, Maven, Spring, Spring Security.

  • Just Code - блог Адрея Лоскутова - статьи об Eclipse и разработке плагинов под Eclipse.

  • Levin Matveev - статьи о Java, Scala, JVM и многое другое.

  • IT-блокнот - Николай Войнов пишет об IT-бизнесе, интеграторах, разработке и Ынтырпрайзе.

  • Как можно больше об Eclipse по русски - название говорит само за себя.

  • Профессия - программист - блог Антона Сабурова о том как и чему нужно учиться в программировании.

  • Блог Макса Крайнова - о финансовой грамотности, как пути к финансовой свободе. Ну и вообще очень интересный блог, рекомендую.

  • Блог про блоги - Дмитрий Донченко пишет о том как легко и просто установить и настроить свой блог на WordPress, а также - что делать с ним дальше.



Также поделюсь (вот такой я сегодня щедрый) сокровенным: для чтения RSS я использую замечательный сервис Яндекс.Лента.


Поставь ссылку на интересный (можно свой) ресурс в комментариях!

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter


А дальше...

24 Июнь 2009 г.

Вышел долгожданный релиз Eclipse Galileo


Свершилось! Eclipse Foundation точно по расписанию выпустили релиз Eclipse Galileo.



Вместе с IDE для Java-разработчиков выпущено еще 33 проекта: среды разработки для Ruby, PHP, C/С++, WEB (JavaScript + HTML + CSS), J2EE и т.д. Скачать новый Eclipse можно с официального сайта проекта. Почитать о нововведениях на разных языках (в том числе и на русском благодаря сами знаете кому) можно здесь, а вот здесь лежит красивая обоина.

Я уже скачал и пользуюсь.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

З.Ы. Если Вы есть во Вконтакте - вступайте в группу Russian Eclipse Community.


А дальше...

21 Июнь 2009 г.

Введение в SOA и BPEL


Уже более полугода я занимаюсь разработкой описаний бизнес-процессов на языке BPEL. За это время удалось кое в чем разобраться, кое что структурировать и осознать. Результатом стала данная статья, впервые опубликованная на HabraHabr. Теперь же я решил привести текст статьи в своем блоге с необходимыми изменениями.

Давайте начнем с понятия "Корпоративная Информационная Система (КИС)." Такая система, как правило, представляет собой набор программного обеспечения разной степени однородности. Т.е. в лучшем случае все необходимое ПО (для организации бухгалтерского, оперативного и складского учетов, документооборота, сервисных служб, call-центра) закупается у одного вендора, в худшем же — полный бардак (что-то по-быстрому набросали сисадмины, что-то купили у Майкрософт, что-то у Naumen, а что-то вообще у 1С).

В то же время понятно, что пользователи (сотрудники предприятия) всегда должны иметь возможность получать любую необходимую им информацию, независимо от того, в какой системе она хранится и/или обрабатывается.

Для этого необходимо интегрировать все приложения, предоставляющие и обрабатывающие информацию в единую информационную систему. Одной из концептуальных возможностей решения такой задачи является использование SOA.

Сага о SOA


Сервисно-ориентированная архитектура (СОА, SOA) — понятие, которое в последнее время становится мэйнстримом в области разработки корпоративных систем. Не буду вдаваться в дебри теории, скажу лишь о сути. Суть SOA в том, что информационная система разбивается на несколько функционально законченных узлов — сервисов, которые взаимодействуют друг с другом. Собственно, это и есть концепция SOA, остальное (устройство сервисов, обеспечение связей между ними) — детали.

Сразу хочу предостеречь от путаницы. Сервис в терминах SOA и веб-сервис — разные вещи. Веб-сервисы — это один из наиболее распространенных способов реализации сервисов в рамках SOA. Но это ортогональные понятия: в рамках SOA сервисы можно заставить взаимодействовать через RMI, CORBA, OSGi, а самим сервисом может быть та же 1С Бухгалтерия. Точно также веб-сервисы могут взаимодействовать без всякой SOA. Кстати, про то, как создать веб-сервис с помощью xfire+spring+hibernate можно прочитать здесь.

Примерами сервисов могут являться такие узлы, как менеджер задач (всем сотрудникам в рамках КИС будут создаваться задачи и будет контролироваться их выполнение), сервис расчета зарплаты, сервис отображения начисленной зарплаты в интерфейсе КИС, сервис взаимодействия с пенсионным фондом, с налоговой инспекцией, сервис складского учета и т.д. Главное, что сервис — это некий черный ящик, который умеет получать, обрабатывать и выдавать информацию.

Раз сервисы обмениваются информацией, то возникает вопрос: «как организовать этот обмен». Дело в том, что сервисы потребляют, обрабатывают и выдают самую разную (как по семантике, так и по формату) информацию (грубо говоря бухгалтерской системе абсолютно параллельно распилены в цеху доски или нет, но не параллельно сколько часов их пилили и сколько рабочего времени потратили, его ведь надо оплатить). Более того, следует учитывать большое количество уже имеющихся legacy-систем, которые имеют свой формат представления информации.

Таким образом, первая проблема взаимодействие сервисов — согласование информации и форматов ее передачи.

Решение данной задачи напрямую зависит от того, как мы соединим сервисы. Мы можем соединить сервисы друг с другом напрямую. Тогда мы получим огромное количество связей, в которых со временем будет трудно разобраться. Плюс к этому нам необходимо будет писать конвертеры данных из формата одного сервиса в форматы каждого сервиса с которым он взаимодействует.

Другим, более правильным, решением является использование сервисной шины (ESB — Enterprise Service Bus). Сервисная шина является посредником между сервисами. Соответственно, она обеспечивает унификацию формата обмена (теперь нужно всего лишь написать для каждого сервиса один конвертер — в формат шины), а также синхронизацию и управление обменом между сервисами.

В мире Java (а именно про этот мир я и буду писать) существуют такие реализации ESB, как:

— Sun Microsystems — OpenESB
— IBM — IBM WebSphere ESB
— BEA Systems (куплена Oracle) — ALSB (AquaLogic Service Bus)
— Oracle — Application Server 10g + WebService Manager
— JBoss — JBoss ESB + JBoss Web Services

Сага о BPM


Итак, первым вопросом было «как заставить сервисы взаимодействовать». Вторым вопросом является: «как управлять вызовом сервисов».

Давайте задумаемся над следующим: «Что такое вообще работа любого предприятия»? Т.е. что общего между работой больницы, школы, пилорамы, шинного завода и IBM? На мой взгляд общим является то, что деятельность любого из этих предприятий представляет собой множество параллельно выполняющихся последовательностей создания-выполнения-контроля-завершения задач, т.е. множество бизнес-процессов.

Примеры бизнес-процессов: обработка входящего письма, подготовка исходящего документа, составление инструкции, создание шестеренки, расчет заработной платы для сотрудника, оформление отпуска, оформление командировки и т.д.

Раз любой бизнес — это ничто иное, как выполнение бизнес-процессов, то и управление бизнесом сводится к управлению бизнес-процессами. В то же время управление бизнес-процессами включает в себя и их автоматизацию. Именно для автоматизации бизнес-процессов и для контроля за их исполнением и заказывают дорогостоящие КИС.

Таким образом, мы вплотную подошли к рассмотрению класса систем, которые называются BPMS (Business Processes Management Systems — системы управления бизнес-процессами). В чем же особенности разработки таких систем и почему я до этого так много писал про какую-то SOA? А вся правда жизни в том, что BPMS очень удобно разрабатывать в рамках концепции SOA. Собственно, BPMS и SOA — это, как русский с китайцем — братья на век.

Фактически, реализация любого бизнес-процесса в рамках SOA является лишь последовательностью (зачастую очень хитрой и запутанной) вызовов тех или иных сервисов. Т.е. у нас есть набор строительных блоков — сервисов, мы задаем последовательность вызовов этих блоков — получаем автоматизацию бизнес-процесса. Меняем последовательность вызовов — получаем автоматизацию другого бизнес-процесса.

Несомненым плюсом такого подхода является высочайшая масштабируемость, причем как техническая так и функциональная. Добавляем новые сервисы — реализуем новые бизнес-процессы. Разворачиваем каждый сервис на свей машине — решаем проблемы производительности.

Теперь посмотрим, что же предлагают нам вендоры для работы с BPM:

— Sun Microsystems — Application Server GlassFish + java.sun.com/javaee/community/
— IBM — IBM WebSphere Business Modeller, IBM WebSphere Integration Developer, IBM WebSphere Process Server
— BEA Systems — BPM (Business Process Management), DSP (Data Services Platform)
— Oracle — Application Server 10g + WebService Manager
— JBoss — JBoss Web Services + JBoss BPM
— Active Endpoints — ActiveBPEL Engine + ActiveBPEL Designer

Сага о BPEL





Итак, мы разобрались с тем, что такое SOA и как заставить это все работать для решения основной задачи автоматизации предприятия — автоматизации обработки бизнес-процессов. Осталось рассмотреть такой вопрос: как описывать бизнес-процессы в терминах BPMS?

Вообще, некоторые вендоры (например, JBoss) предлагают свой формат описания, однако существует стандарт и этим стандартом является язык Business Process Modeling and Execution (BPEL, читается «БИПЛЬ»). BPEL — XML-based язык, что позволяет довольно легко его парсить машиной и в то же время читать и даже слегка править человеком. Также сохраняются все преимущества текстовых форматов, такие как легкость в передаче по сети, читабельность, работа с системами контроля версий и т.д. Подробное описание формата BPEL выходит за рамки данной статьи, опишу лишь основные понятия.

Как и в любом языке программирования в BPEL есть набор конструкций (можно рассматривать его как набор операторов). Так вот, операторов, которыми задается непосредственно действие, всего два: присваивание и вызов веб-сервиса (есть реализации, позволяющие вызывать EJB). Остальные конструкции являются управляющими — их задача обеспечить правильную последовательность присваиваний и вызовов внешних сервисов. В теории предполагается, что бизнес-аналитик будет рисовать бизнес-процесс, задавая порядок вызова сервисов, а программисты - разрабатывать эти сервисы.

Также любой BPEL-процесс имеет точку входа и точку выхода. Правда, это не совсем соответствует понятию «начало» и «конец» на схеме алгоритма. Точка входа представляет собой уведомление BPEL-машине о том, что надо создать и запустить экземпляр бизнес-процесса. Точка выхода — уведомление вызвавшей процесс системе о том, что процесс запущен. Также можно передать некоторые данные в вызвавшую систему, например pid процесса. После того, как мы уведомили вызвавшую нас систему о том, что процесс запущен, можем продолжать его исполнение.

Обычно работа с BPEL-описаниями процессов состоит из двух этапов: создание и выполнение. Создается процесс с помощью специализированных графических редакторов, которые позволяет этот процесс нарисовать. Примерами таких редакторов являются:

— Eclipse BPEL
— ActiveBPEL Designer (плагин для Eclipse)
— IBM Integration Developer
— NetBeans SOA-плагины
— Oracle JDeveloper

После того как процесс сохранен как .bpel-файл, его необходимо развернуть на сервере выполнения бизнес-процессов. Например, в ActiveBPEL Engine такой процедурой является создание bpr-архива: архива, включающего в себя bpel-описание процесса, метаинформацию, набор WSDL-файлов, описывающих вызываемые веб-сервисы и сам бизнес-процесс, как веб-сервис.

В этом, кстати, одно из преимуществ технологии BPEL — извне каждый бизнес-процесс представляет собой веб-сервис, имеющий собственное описание. В частности, запуск процесса представляет собой вызов веб-сервиса. Это позволяет рассматривать BPEL-Engine как один из элементов SOA и менять Engine не меняя описания процессов и не перестраивая всю архитектуру.

На этом введение можно считать законченным. Не думал, что статья получится такой длинной. Впрочем, в ней удалось описать суть основных технологий и понятий, которые постепенно становятся мэйнстримом при разработке КИС. Буду рад вашим комментариям.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter


А дальше...

19 Июнь 2009 г.

Как подружить Hibernate со Spring и обеспечить управление транзакциями через @ннотации


На работе завершена большая и сложная задача и перед началом решения следующей хочется немного отвлечься и поделиться чем-нибудь с вами, уважаемые читатели. Сегодняшний пост будет из серии "для самых маленьких". Давайте поговорим о связке Spring-Hibernate, слое DAO и динамическом управлении транзакциями.

SpringFramework штука довольно сложная и интересная. В частности, в его состав входит package org.springframework.orm.hibernate3, который обеспечивает взаимодействие SpringFramework и Hibernate ORM.

Давайте создадим простое консольное приложение (чтобы не заморачиваться на определение сервлетов и прочего overhead'а), которое что-то пишет в БД.

Соответственно, прежде всего определим сущность, с которой будем работать. Назовем ее непритязательно: MyEntity.

Код сущности будет таким:

package ru.naumen.demo.entity;



import java.io.Serializable;



import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;



import org.hibernate.annotations.GenericGenerator;



@Entity

public class MyEntity implements Serializable

{

    private static final long serialVersionUID = 382157955767771714L;



    @Id

    @Column(name = "uuid")

    @GeneratedValue(generator = "system-uuid")

    @GenericGenerator(name = "system-uuid", strategy = "uuid")

    private String id;



    @Column(name = "name")

    private String name;



    public MyEntity()

    {

    }



    public MyEntity(String id, String name)

    {

        this.id = id;

        this.name = name;

    }



    public String getId()

    {

        return id;

    }



    public void setId(String id)

    {

        this.id = id;

    }



    public String getName()

    {

        return name;

    }



    public void setName(String name)

    {

        this.name = name;

    }

}

 


Напомню, что аннотации @Entity, @Id и т.д. относятся к JPA и заменяют собой Hibernate-mapping.

Работать с сущностью мы будем не напрямую, а через DAO. Использование DAO является одним из устоявшихся паттернов работы со SpringFramework. Определив бин, реализующий DAO можно легко и просто инъектировать его в бины, реализующие бизнес-логику приложения и тем самым полностью отделить бизнес-логику от работы с данными. DAO у нас будет реализовано следующим интерфейсом:

package ru.naumen.demo.dao;



import ru.naumen.demo.entity.MyEntity;



public interface IEntityDao

{

    public void save(MyEntity entity);

}

 


Для примера мы определим один метод - save, который будет сохранять сущность в БД. Реализация DAO довольно примитивна:

package ru.naumen.demo.dao;



import org.springframework.orm.hibernate3.support.HibernateDaoSupport;



import ru.naumen.demo.entity.MyEntity;



public class EntityDao extends HibernateDaoSupport implements IEntityDao

{

    @Override

    public void save(MyEntity entity)

    {

        getHibernateTemplate().save(entity);

    }

}

 


Мы наследуемся от класса HibernateDaoSupport, который инкапсулирует работу с Hibernate Session, Hibernate Session Factory и предоставляет нам простое API для взаимодействия с Hibernate. Рекомендую статью, в которой описано, как грамотно организовать слой DAO в своем приложении.

Теперь перейдем к классам, которые будут реализовывать бизнес-логику. В нашем случае бизнес-логика будет проста - мы будем просто брать и сохранять сущность.

Интерфейс IMyEntityService:

package ru.naumen.demo.services;



import ru.naumen.demo.entity.MyEntity;



public interface IMyEntityService

{

    public void saveEntity(MyEntity entity);

}

 


Реализация - класс MyEntityService:

package ru.naumen.demo.services;



import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;



import ru.naumen.demo.dao.IEntityDao;

import ru.naumen.demo.entity.MyEntity;



@Transactional(readOnly = true)

public class MyEntityService implements IMyEntityService

{

    private IEntityDao dao;



    public void setDao(IEntityDao dao)

    {

        this.dao = dao;

    }



    @Override

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)

    public void saveEntity(MyEntity entity)

    {

        dao.save(entity);

    }

}

 


Данный класс - самое интересное, что есть в нашей программе. Нам необходимо обернуть метод saveEntity в транзакцию. Для этого существует аннотация @Transactional, которой можно аннотировать методы или целый класс. Параметрами данной аннотации задается поведение транзакции. Основными параметрами являются readOnly, который указывает на возможность или невозможность менять состояние БД и propagation, который задает стратегию создания транзакции (не создавать транзакцию, создать новую, присоединиться к существующей и т.д.). Помимо этих параметров можно указывать таймаут, уровень изоляции, классы и типы исключений для которых надо и ненадо делать rollback.

Подробнее про параметры и их значения можно прочесть в официальном руководстве по SpringFramework.

Собственно, теперь надо рассмотреть конфигурацию Spring-контекста, которая будет храниться в файле 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:aop="http://www.springframework.org/schema/aop"

       xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">




   

</beans>


Обратите внимание! Очень важно правильно прописать все namespaces и пути к схемам, иначе конфиг просто не будет парситься.

Итак, сначала добавим в контекст необходимые конфигурационные файлы, в нашем случае - jdbc.properties, в котором мы будем хранить параметры подключения к СУБД. Для работы с конфигурационными файлами SpringFramework содержит класс org.springframework.beans.factory.config.PropertyPlaceholderConfigurer. Разметка будет вот такой:

<bean id="propertyConfigurer"  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="location" value="jdbc.properties" />

</bean>


Далее следует определить источник данных - мост между СУБД и Hibernate. Я предпочитаю использовать для этого замечательную библиотеку apache.commons.dbcp.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}" />

    <property name="url" value="${jdbc.url}" />

    <property name="username" value="${jdbc.username}" />

    <property name="password" value="${jdbc.password}" />

</bean>


После того, как определили источник данных, пришла пора описать фабрику, которая будет строить Hibernate-сессии. Для этого существует класс org.springframework.orm.hibernate3.LocalSessionFactoryBean. Мы опишем этот бин следующим образом:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="dataSource" ref="dataSource" />

    <property name="configLocation" value="classpath:/hibernate.cfg.xml" />

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />

    <property name="hibernateProperties">

        <props>

            <prop key="hibernate.dialect">${hibernate.dialect}</prop>

        </props>

    </property>

</bean>


Все специфичные настройки Hibernate будем хранить в файле hibernate.cfg.xml, диалект - в файле jdbc.properties. Обратите внимание, что т.к. мы определяем мэппинг аннотациями, то работать с такой конфигурацией должен класс org.hibernate.cfg.AnnotationConfiguration.

С базой данных мы соединились и Hibernate-сессию создали. Пришла пора указать приложению на то, что нужно динамически управлять транзакциями. Что значит "динамически управлять транзакциями?" Это значит, что нам не нужно писать код, который создает/закрывает/откатывает транзакции и размещать его везде, где нужно. Нам достаточно лишь передать классу HibernateTransactionManager некие правила создания/завершения транзакций, а остальное он возьмет на себя.
Понятно, что все это счастье работает через AOP. Правило представляет собой соответствие между методом и типом создаваемой транзакции. Это обозначает, что когда мы входим в метод (перед самым началом выполнения кода метода) - необходимо создать транзакцию, а перед выходом из метода (после выполнения последней инструкции метода) транзакцию закоммитить. Ну и дополнительно можно описать при каких типах исключений должен быть выполнен откат транзакции.

Существует два основных способа определения правил: использование нотации Spring AOP в xml-конфигах Spring и использование аннотаций в Java-коде. Каждый метод имеет свои достоинства и недостатки, но это уже тема другой статьи. Мы же рассмотрим как управлять транзакциями с помощью аннотаций.

Для управления транзакциями в Spring существует пространство имен tx, в котором определена, в частности, директива tx:annotation-driven, включающая механизм управления транзакциями через аннотации. Про параметры этой директивы можно прочитать в секции 9.5.6. документа.

Мы определим менеджер транзакций следующим образом:

<tx:annotation-driven transaction-manager="txManager" />



<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory" />

</bean>


Ну и остается определить бины для слоя DAO и слоя бизнес-логики:

<bean id="entityDAO" class="ru.naumen.demo.dao.EntityDao">

    <property name="sessionFactory" ref="sessionFactory" />

</bean>



<bean id="entityService" class="ru.naumen.demo.services.MyEntityService">

    <property name="dao" ref="entityDAO" />

</bean>


Напоследок приведу код класса Main, который запускает приложение:

package ru.naumen.demo;



import org.springframework.context.support.ClassPathXmlApplicationContext;



import ru.naumen.demo.entity.MyEntity;

import ru.naumen.demo.services.IMyEntityService;



public class Main

{

    public static void main(String[] args)

    {

        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        IMyEntityService service = (IMyEntityService) ctx.getBean("entityService");



        MyEntity entity = new MyEntity();

        entity.setName("Pavel");



        service.saveEntity(entity);

    }

}

 


Код не сложный. Сначала мы загружаем контекст приложения, затем из контекста достаем нужный нам бин (в данном случае - "entityService". Ну а дальше используем бин по назначению - сохраняем с его помощью сущность в БД.

Вообще, я считаю, что конфигурация аннотациями проще, чем xml, да и читается лучше. В принципе, можно было бы и взаимодействие бинов сконфигурировать с помощью аннотаций, Spring это позволяет уже довольно давно. На тему конфигурирования Spring-бинов через аннотации можно почитать статьи на habrahabr: эту и эту.

Теперь вы знаете, как подключить к SpringFramework СУБД и Hibernate, опеспечить динамическое управление транзакциями, описать слой DAO и подключить DAO к бизнес-логике. Фактически, мы создали "рыбу" приложения и теперь можем неограниченно наращивать его функционал.

Скачать приложение со всеми исходниками и библиотеками можно отсюда (6.3 Мб).

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter


А дальше...

12 Июнь 2009 г.

Записал подкаст


Спонсор поста: подкаст от Davnozdu

Давненько я не писал в свой блог, все почивал на лаврах последней статьи. Однако, так жить нельзя, надо двигаться вперед - открывать новые горизонты и все такое. Поэтому я с радостью согласился на приглашение Gamussa и Golodnyj поучаствовать в записи 25-го, юбилейного выпуска подкаста The Art Of Programming.

Темой подкаста было введение в OSGi. Вообще поговорили довольно интересно и про жизнь, и про Naumen, и про OSGi. Бренд Суровый челябинский программист покоряет эти ваши интернеты :)

Сам подкаст The Art Of Programming я слушаю с первого выпуска. Мне показалось, что сначала был выбран не самый удачный формат для программерского подкаста - все же диктовать и объяснять код - это не самая лучшая идея. Но, со временем, парни нашли свое. Т.е. получился такой подкаст о Java, проектировании и сопуствующих экосистемах (тот же OSGi, например). Плюс очень нравится формат интервью, например, очень интересным было интервью с Яковом Сироткиным. По моему, TAOP - единственный подкаст о Java на русском языке. Если я ошибаюсь - поправьте.

Ну и конечно же - ссылки:
Golodnyj
gAmUssA

З.Ы. Так же подкаст опубликован на Хаброхабре и вы можете плюсануть его, если у вас есть возможность. Тем самым вы поможете обрести инвайт на Хаброхабр какому-нибудь хорошему человеку.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter


А дальше...

19 Май 2009 г.

Давайте посмотрим, что нового будет в Eclipse 3.5


Буквально вчера вышел 1-й релиз-кандидат замечательной IDE для Java-разработчиков и не только - Eclipse 3.5 Galileo RC1. Модель разработки Eclipse строится следующим образом: раз в 2-3 месяца выходит так называемый milestone-билд (отмечаемый буквой M), в котором реализовывается и отлаживается часть предполагаемого функционала. В случае Eclipse 3.5, начиная с билда M6 фиксируется API, начиная с билда M7 - фичи, а далее идет серия релиз-кандидатов для бета-тестирования.

Сразу хочу сказать, что изменений в Galileo очень много. Эти изменения касаются различных частей платформы и имеют разную значимость для пользователей. Я постарался сгруппировать и отсортировать список так, чтобы им было удобно пользоваться.

Итак, что же нам готовит Eclipse 3.5?



Поддержка новых архитектур


1. Поддержка Solaris x86
OpenSolaris x86 - теперь официально поддерживаемая платформа. Т.е. для нее будет разрабатываться своя ветка SWT и будут собираться официальные билды.
Solaris x86

2. Поддержка 32-х и 64-х битных Mac Cocoa
Макофилам посвящается. Теперь Eclipse поддерживает и Mac Cocoa, что включает в себя нативную поддержку системы со стороны SWT, лук-энд-филы для данной платформы и т.д.
SWT for 32-bit Cocoa

Данная ветка активно разрабатывается, поэтому в ней могут быть баги. Но, я думаю, к релизу их исправят.

Общесистемные изменения


1. Возможность сравнения Word-документов непосредственно в Eclipse
Ребята написали плагин, который позволяет сравнивать содержимое Word-документов прямо в Eclipse. Очень удобно использовать совместно с системами контроля версий. Так же документы можно править не выходя из Eclipse. Интересно, что плагин совместим с Eclipse 3.3 и Eclpse 3.4. А вот здесь можно почитать подробности.
Compare Word Documents

2. Возможность легкого обновления плагинов
В меню Help добавлены новые элементы, позволяющие управлять установленными плагинами. Например, теперь можно проверить обновления плагинов двумя кликами: Help > Check for Updates.
Software updates menu items

3. Установка новых плагинов
Страница Available Software перенесена в визард , который доступен по адресу: Help > Install New Software... Теперь навигация по фичам, фильтрация по сайтам, категориям и именам плагинов доступны с первой страницы визарда. Добавлено поле с описанием отмеченного плагина. Так же добавлено поле, для отображения информации по установленным и обновленным плагином. Это все, конечно, очень удобно.


4. Изменение в отображении информации об уже установленных плагинах
Страница Installed Software перемещена в отдельный диалог, который можно вызвать так: Help > About Eclipse SDK > Installation Details. Так же, теперь можно разворачивать элементы верхнего уровня, для того, чтобы посмотреть зависимости. Добавлено поле с описанием отмеченного плагина.


5. История инсталяций
В окно Installation Details добавлена вкладка Installation History на которой отображается история изменений состояния плагинной системы. Теперь всегда можно откатиться к предыдущему состоянию, если что-то пошло не так.
Installation history

6. Расширены возможности редактора сравнения файлов
Добавлены новые возможности к редактору сравнения файлов. Теперь можно вызывать диалог "Перейти к строке". Так же текущее выделенное значение автоматически служит фильтром в диалогах Open Type и Open Resource.
Compare Editor enhancements

Теперь поддерживается переключение кодировки непосредственно из редактора сравнения.
Set encoding in Compare Editor

Также добавлена возможность выбирать тип редактора сравнения, например переключаться между Java Source Compare в Text Compare и наоборот.
Compare Editor enhancemen

7. Выделение произвольного блока текста
StyledText теперь может быть переключен в режим выделения произвольного блока текста. Используется новое API: StyledText.setBlockSelection(true).
Block selection in StyledText
Активируется данная функция нажатием Alt+Shift+A или кнопочкой на тулбаре.

8. Отображение конкретного активного контекста отладки
Отладчик теперь может отображать только один активный контекст отладки. Включается данная функция автоматически, при ресайзе окна отладчика. Так же добавлено выпадающее меню, позволяющее выбрать активный контекст.
Debug view breadcrumb
Debug view breadcrumb

9. Быстрое переключение между потоками в отладчике
В отладчике появилась возможность быстрого переключения между отлаживаемыми потоками. Для этого служат действия Navigate > Next и Navigate > Previous, на которые можно назначить клавиатурные комбинации.

10. Улучшено отображение фильтруемых деревьев
При отображении деревьев иногда присутствует поле ввода для фильтра. Теперь это поле снабжено кнопкой очистки. При нажатии на нее фильтр очищается.
Improved look for filtered tree

11. Поддержка нескольких шрифтов в одной ячейке
Теперь в одной ячейке можно отображать информацию разными шрифтами.
Multiple fonts in one cell

Это очень юзабельно, при отображении результатов поиска в диалогах выбора класса или ресурса.
Emphasized matching characters in Open Type dialog

12. Go To и Go Into в Project Explorer'е
Теперь можно перейти в любой каталог (в случае JDT - package) и сделать так, что в Package Explorer будет отображаться содержимое только этого каталога. Удобно, когда у вас с воркспейсе 20 проектов, но в данный момент вы работаете только с одним.
Project Explorer improvements

13. Индивидуально-настраиваемые меню и тулбары
Расширен и улучшен диалог кастомизации перспектив. Теперь можно скрывать или показывать индивидуальные для пользователя пункты меню и элементы тулбаров.
Customize menus and toolbars

14. Двойной клик по линии фолдинга
Теперь при двойном клике на линию фолдинга сворачивается/разворачивается блок текста.
Double-click on folding line collapses the folding region

15. Новый вид окна приветствия
Добавлена новая тема для окна приветствия, под названием Slate. Данная тема не является используемой по умолчанию, но ее можно выбрать в списке поддерживаемых тем.
Выглядит тема вот так:
New intro theme
И так:
New intro theme

16. Переключение редакторов и страниц в многостраничных редакторах
Новые клавиатурные комбинации для переключения редакторов: Ctrl+PageDown и Ctrl+PageUp. Для переключения страниц внутри многостраничного редактора можно использовать Alt+PageDown и Alt+PageUp.
Switch editors and multi-page editors

17. Пропуск очистки локальной истории при выходе из Eclipse
Если у вас большая локальная история изменений, то время ожидания ее очистки Eclipse'ом может затянуться. Но теперь можно нажать Cancel, тем самым пропустив процесс очистки истории.
Skip history cleanup on shutdown

18. Диалог Open Resource поддерживает выбор редактора
Теперь можно открыть искомый ресурс в нужном вам редакторе сразу же из окна поиска. Для этого достаточно вызвать контекстное меню объекта и выбрать пункт Open With.
Open Resource dialog allows choice of editor

19. Пользователь может задавать свои имена для update-сайтов
Теперь пользователь может задавать свои имена для update-сайтов. Данные имена будут отображаться в списке выбора update-сайта. Можно явно указать, что tigris - это subclipse и больше никогда об этом не забывать.
User-named software sites

20. Автодополнение в поле выбора update-сайта
Теперь в поле выбора update-сайта работает автодополнение, т.е. если вы вводите какую-либо строку, то в выпадающем меню будут отображаться только те сайты, которые ее содержат.
Install New Software auto-complete support

21. Возможность работы с несколькими экземплярами редактора свойств
Редактор свойств (вид Properties) позволяет теперь отображать несколько своих экземпляров. Т.е. теперь из существующего экземпляра можно вызывать другие, которые будут отображать только выбранную группу свойств. Удобно, например, при разработке BPEL, когда часто нужно менять свойства элементов.
Multi-instance Properties view

22. Диалог управления воркспейсами
В настройки добавлен диалог управления воркспейсами. Теперь можно удалять/добавлять воркспейсы, которые будут отображаться для выбора при старте Eclipse. Так же можно изменять количество таких воркспейсов (по умолчанию - 5). Диалог доступен из General > Startup and Shutdown > Workspaces.
Workspaces preference page

23. Быстрый поиск в Help-топиках
Теперь можно делать поиск справочной информации в конкретной книге или топике.
Help quick search

24. Настраиваемые иконки в справочной системе
Теперь для отображения тем, каталогов тем и страниц справки можно задавать свои иконки. Для этого используется элемент tocIcon в точке расширения org.eclipse.help.toc.
Custom icons in help system

Java Development Tools (JDT)


1. Редактор сравнения Java-файлов по возможностям приближен к редактору самих Java-файлов
Редактор, обеспечивающий сравнение Java-элементов оброс новыми функциями и по возможностям вплотную приблизился к редактору Java-кода.

Автодополнение кода:
Java compare enhancements

Гиперссылки:
Java compare enhancements

Всплывающие окошки с JavaDoc:
Java compare enhancements

Quick Outline:
Java compare enhancements

Более того, теперь можно набирать код прямо в этом окне и оно будет каждый раз перерегулироваться, т.е. отображения различий не собьются, а пересчет номеров строк будет производиться на лету.
Reconcile Java compare structure while typing

2. Новые опции форматтера - сохранять пользовательские переносы строки
Теперь форматтер Java-кода сохраняет пользовательские переносы строки и не объединяет их, и не выравнивает.

Предположим, мы написали вот такой вот код:
Formatter option to preserve user line breaks

И выполнили его форматирование:
Formatter option to preserve user line breaks

Настраивается данная опция на странице Java > Code Style > Formatter. Ищите опцию Never join lines на вкладках Line Wrapping и Comments.

3. Автодополнение конструкторов
То, что уже давно было в IntelliJ Idea и чего так не хватало в Eclipse. Теперь автодополнение кода умеет предлагать конструктор инстанцируемого класса из списка доступных.
Constructor completion

4. Генерация метода toString()
Добавлена генерация метода toString() для класса. Вызывается генератор из меню Source > Generate toString()... Можно выбрать какие поля и методы включить в процесс генерации, настроить формат генерируемого сообщения.
Generate toString()

5. Изменения в генераторе методов hashCode() и equals
Добавлен чекбокс "использовать блоки в операторе 'if'.
Optionally use blocks when generating hashCode() and equals()

6. В диалог Quick Fix добавлен запуск рефакторинга переименования сущности
Теперь рефакторинг "переименование сущности" можно запускать из диалогового окна Quick Fix.
Quick Fix to start Rename refactoring

7. Наследование JavaDoc-описаний переопределяемых методов
JavaDoc-вьювер теперь поддерживает атрибут {@inheritDoc} - добавляет ссылку на переопределенные методы.
Improved Javadoc view and hover

8. Гиперссылки в заголовках JavaDoc
Упоминания типов данных или членов класса в заголовках JavaDoc вьювера и всплывающих окошек теперь являются ссылками на JavaDoc соответсвующих элементов. Можно кликнуть, например, на тип возвращаемого методом значения и прочесть JavaDoc по этому типу. Вернуться назад можно будет кликнув Back в тулбаре.
Links in Javadoc headers

9. Гиперссылка на реализацию
Теперь при клике на переопределенном методе появляется всплывающее окошко, предлагающее вызвать реализацию метода или его определение. Поведение ссылки можно настроить на странице General > Editors > Text Editors > Hyperlinking.
Open Implementation hyperlink

10. Гиперссылка на файл-свойств
Теперь при клике на константе, определенной как ключ в файле-свойств (.properties) всплывает окошко, которое показывает имя этого файла. Окошко содержит кнопочку, нажав на которую, можно открыть сам файл свойств.
Open in Properties File action in NLS Hover

11. Двойной клик по комментарию
Двойной клик в начале или конце комментария выделяет весь комментарий. После чего его можно скопировать или вырезать.

12. Вызов *.jardesc файлов через JAR Export - визард
*.jardesc файлы - файлы описания jar-архивов открываются теперь с помощью визарда экспорта JAR.
Open *.jardesc files with JAR Export Wizard

13. Файлы с результатами JUnit-тестов теперь открываются с помощью вида JUnit
Файлы, содержащие результаты JUnit-тестов (созданные с помощью Eclipse или Ant JUnit task) теперь открываются с помощью вида JUnit по двойному щелчку или через выбор Open With > JUnit View в контекстном меню.
Open test result files in JUnit view

Если файл находится вне воркспейса, то открыть его можно через Test Run History-меню или выполнив импорт (с помощью Import).
Open test result files in JUnit view

14. ClassPath теперь учитывает значения заголовков Class-Path в манифестах jar-файлов
Заголовок Class-Path, указанный в манифесте jar-файла теперь учитывается Java-моделью. Все Jar-ы указанные в заголовке Class-Path автоматически добавляются в build-path проекта.
Classpath resolution honors the 'Class-Path' header of JAR manifest file

15. BuildPath теперь допукает дублирование сущностей
Дублирование сущностей в BuildPath теперь допускается, если эти сущности разнесены по разным библиотекам. К примеру, две пользовательские библиотеки используют lib.jar - это допустимо.
Build path resolution tolerates duplicate entries

Однако, если мы просто поместим в BuildPath эти библиотеки - то получим сообщение об ошибке.
Build path resolution tolerates duplicate entries

16. Новый экспортер исполняемых JAR-файлов
Теперь исполняемые JAR-файлы экспортируются со всеми зависимостями. Причем, можно явно указать куда экспортировать эти зависимости - в сам JAR-файл или в каталог рядом с ним.
Runnable Jar-in-Jar exporter

17. В Call Hierarhy теперь можно просматривать вызовы конструкторов
В контекстное меню методов, отображаемых в Call Hierarhy добавлен пункт Expand With Constructors. При выборе этого пункта будут отображены вызовы всхе конструкторов, которые производятся в методе.
Call Hierarchy can expand with constructors

18. Добавление патчей через Package Explorer
Теперь можно еще быстрее применять патчи, которые оставлены, например, в багзиле. Достаточно скопировать патч в буфер обмена и вставить через Package Explorer.

19. Удаление Working Set из Package Explorer
Добавлена возможность удалять Working Set'ы непосредственно из Package Explorer'а. Напомню, что Working Set - логическое объединение проектов.
Delete working sets from the Package Explorer

20. Сортировка рабочих пространств
В диалогове окно Configure Working Sets... добавлена опция Sort working sets, позволяющая включить сортировку рабочих пространств по алфавиту. Если у вас очень большой проект и в нем выделено много рабочих пространств - данная опция может быть очень удобной.
Sort working sets in Package Explorer

21. Предупреждение при сравнивании переменной с самой собой.
При сравнивании переменной самой с собой (что естественно вернет true) будет генерироваться предупреждение. Данное поведение можно настроить установив значение Potential programming problems в Java > Compiler > Errors/Warnings или просто кликнув на кнопочке Configure Problem Severity во всплывающем сообщении о ворнинге.
New compiler diagnostic

22. Предупреждение компилятора при потере модификатора synchronized
Возможна ситуация, когда мы переопределяем метод, снабженный модификатором synchronized, но забываем поставить данный модификатор у разрабатываемого метода. Теперь Eclipse сгенерирует соответствующее предупреждение и - самое главное - quick fix для него.
Compiler problem for missing synchronized modifier

Отключить данную возможность можно во вкладке Potential programming problems в меню настроек Preferences > Java > Compiler > Errors/Warnings

23. Подавление ошибки компиляции в case-секции оператора switch, отмеченной комментарием $FALL-THROUGH$
По-хорошему в Java каждая case-секция оператора switch должна завершаться или ключевым словом break или return, или генерацией исключения. Иначе, будут выполнены все секции, следующие за данной. Теперь за каждой такой "незакрытой" case-секцией можно будет следить, оставляя комментарий //$FALL-THROUGH$. Можно настроить Eclipse, чтобы он генерировал предупреждения, если отсутствует break, return, throw или данный комментарий.
Suppress compiler problem for 'switch' case fall-through

Для этого надо отметить галочку 'switch' case fall-through на вкладке Potential programming problems в меню настроек Preferences > Java > Compiler > Errors/Warnings.

24. Проблемы компиляции при потере метода hashCode()
Каждый java-разработчик знает, что при переопределении метода equals() необходимо переопределять и метод hashCode(). Некоторые, правда, об этом забывают. Ничего, Eclipse теперь напомнит им об этом.
Compiler problem for missing hashCode() method

Как видим, quick fix предложит нам два решения этой проблемы - переопределить метод hashCode() или сгенерировать hashCode() и equals().

По умолчанию эта опция отключена. Включить ее можно на вкладке Potential programming problems в меню настроек Preferences > Java > Compiler > Errors/Warnings.

25. Проблемы компиляции при появлении мертвого кода
Eclipse генерирует предупреждение при наличии мертвого кода, т.е. такого кода, который никогда не вызовется. По умолчанию данная опция включена, но ее можно настроить на вкладке Potential programming problems в меню настроек Preferences > Java > Compiler > Errors/Warnings.
dead code diagnosis

Plugins Development Enviroment (PDE)


1. Редактор для декларативных сервисов
В PDE добавили инструментарий для разработки декларативных сервисов. Подробнее про декларативные сервисы OSGi можно почитать в статье Введение в OSGi. Декларативные сервисы - первое знакомство. Инструментарий содержит расширения для редактора кода, средства автодополнения, визарды, редакторы свойств и т.д.
Declarative services editor

Так же добавлен пример декларативного сервиса, который можно выбрать при создании нового PDE-проекта.
DS Tooling enhancements

2. Настройки версионирования
Иногда при разработке OSGi-бандлов можно запутаться в требуемых версиях пекеджей и бандлов. К счастью, теперь PDE берет эту работу на себя и будет проверять версии импортируемых, экспортируемых пакетов и бандлов.
Versioning options

3. Экспорт плагинов в один клик и установка в уже работающий воркспейс
Заметное упрощение разработки бандлов. Теперь можно одним кликом экспортировать разрабатываемые бандлы и установить их в уже запущенную систему.
Single-click export and install into running platform

Экспортированные бандлы появятся в списке установленных и смогут быть удалены из платформы.
Single-click export and install into running platform

4. Экспорт вместе с бинарными циклами
Теперь можно экспортировать бандлы вместе с бинарными циклами. Бинарные циклы - циклы, существующие в целевой платформе (для которой пишется плагин), а не в нашем воркспейсе. Данная опция добавлена на различные визарды PDE и включена по-умолчанию.
Exporting with binary cycles

5. Экспорт source-бандлов
В OSGi допустимы бандлы, содержащие только исходники других бандлов. В частности, такими являются все бандлы Eclipse, имеющие в названии слово source в названии. Теперь можно создавать такие бандлы из PDE.
Export source bundles

6. Экспорт классов из воркспейса
Движок экспорта плагинов теперь поддерживает экспорт существующих класс-файлов из воркспейса. Если данная опция включена, то PDE не будет запускать перекомпиляцию классов, а воспользуется существующими файлами.
Export plug-ins using class files from the workspace

7. Параллельная компиляция
Если плагины рассортированы по feature, Eclipse может их компилировать параллельно. Для этого необходимо установить свойство parallelCompilation=true в конфигурации сборки. Устанавливая свойства parallelThreadCount и parallelThreadsPerProcessor, можно управлять параметрами параллельной сборки.

8. Изменения настроек совместимости API
Упрощены настройки совмести API. Колличество опций уменьшено, сами опции перегруперованы. Улучшены описания опций. Разработан набор регрессионных тестов (более 1600) для валидации API, проверки совместимости и проверки сценариев управления версиями.
API compatibility options

9. Валидация среды исполнения
PDE предупредит вас, если вы пытаетесь использовать код из системных библиотек, не поддерживаемых средой исполнения, для которой разрабатывается ваш бандл. Например, если вы при создании проекта указали среду исполнения J2SE-1.3, но разрабатываете с использованием JDK 1.5 или JDK 1.6 вы можете легко ошибиться и начать использовать методы, доступные в JDK 1.5, но недоступные в J2SE-1.3, для которой разрабатывается бандл. Чтобы избежать таких ошибок добавлена опция Invalid references in system libraries, которую можно включить на вкладке API Use страницы Plug-in Development > API Errors/Warnings.
Execution environment validation

10. Уведомление о поломке API
Разработчики добавили уведомления об критических изменениях в API, т.е. тех изменениях, в результате которых что-то может сломаться. Это особо важно, если вы внесли столько изменений, что пора менять мажорную версию вашего плагина. Используйте новую настройку Report API breakage even if authorized by major version increment, чтобы включить эту фичу. Настройка расположена у начала таба API Compatibility на странице редактирования настроек Plug-in Development > API Errors/Warnings. Когда эта опция включена, вам будут доступны фильтры, исключающие API с неподдерживаемыми изменениями.
Selective API breakage

11. Сравнение API
Теперь можно просматривать изменения, которые произошли в API относительно некоего базового состояния. Для этого надо выбрать проект и выполнить Compare With > API Baseline, выбрать базовое состояние API и нажать OK. После этого можно увидить что-то вроде:
Compare APIs

12. Фильтр проблем устаревших API
PDE генерирует предупреждение при использовании API, которое долго не поддерживалось, поскольку такое API может являться источником несовместимостей.
Stale API problem filters

13. Аnt-таски для анализа, заморозки API и генерации отчетов
Разработаны API Tool Ant Tasks. Именно эти таски используются для сборки самого Eclipse. Документация по ним поставляется в месте с PDE.
API tooling Ant tasks

14. Копирование стектрейсов в консоль
Вьювер логов теперь позволяет копировать сообщения об ошибках и дампы стектрейсов в консоль.
Jump to Console from stacktrace

15. Генератор файлов для локализации плагинов
Добавлен новый визард (PDE Tools->Internationalize...), поддерживающий генерацию NL-фрагментов плагинов.
NL fragment generation

16. Страница настроек целевых платформ
Добавлена страница настроек для целевых платформ (Preferences > Plug-in Development > Target Platform). Данная страница отображает все целевые платформы, определенные в воркспейсе. Можно добавлять/удалять/редактировать платформы, а также быстро переключаться между ними.
Target platform preference page

17. Отображение состояния целевой платформы
Добавлен новый вид Target Platform State, отображающий бандлы, которые будут использоваться при сборке, запуске и отладке разрабатываемого плагина.
Target platform state

18. JUnit тесты плагинов теперь можно запускать вне UI-потока
Теперь можно запускать JUnit тесты плагинов вне UI-потока. Для этого в диалог запуска тестов добавлен специально обученный чекбокс.
JUnit plug-in tests in non-UI thread

19. Управление автозапуском плагинов
Редактор конфигурации запуска Eclipse теперь позволяет управлять автозапуском плагинов. Т.е. теперь можно включить автозапуск всех плагинов и тогда они все стартуют вместе с Eclipse, либо тех, которыми вы часто пользуетесь.
Start levels

20. Изменен вид реестра плагинов
Вид "Реестр плагинов" отображает OSGi-сервисы, предоставляемые плагинами.
Plug-in Registry view enhancements

Так же добавлена возможность отображать фрагменты данного плагина.
Fragments in the Plug-in Registry view

Team/CVS


1. Диалог просмотра истории тегов
Сам я с тегами в Eclipse не работал, но судя по всему штука удобная. Основная идея - состояние воркспейсов можно сохранять, отмечая тегами. Соответственно, данный диалог служит для отката на предыдущее работоспособное состояние.
History in Tag Resources Dialog

2. Новые опции в диалоге настройки синхронизации по времени
В диалоге настройки Synchronize Schedule появились новые опции. Теперь можно запускать синхронизацию в заданное время и задавать частоту повторов синхронизации.
More options for synchronization scheduling

3. Улучшение диалога настроек соединения
Диалог настроек соединения изменен в сторону лучшего отображения настроек Proxy. Поддерживает экспорт настроек из браузера, Gnome, переменных среды Linux.
Improved Network Connections page

4. Apply patch прямо в виде Synchronize
Теперь применить чей-то патч можно непосредственно на открытом виде синхронизации с CVS-сервером. Очень удобно при коммитах.
Apply patch in the Synchronize view

5. Warnings при экпорте проектов
В Eclipse есть возможность экспортировать сразу множество проектов. Однако при этом возможна ситуация, когда по той или иной причине какие-то проекты не могут быть экспортированы. Теперь, когда происходит эта досадная неприятность мы увидим предупреждение.
New export wizard warning

Equinox


1. Реализация OSGi R4.2
Более полно теперь реализован драфт стандарта OSGi R4.2. Изменения касаются механизма безопасности, механизма трассировки и отладки, а также framework launching.

2. Добавление декларативных сервисов в платформу
Eclipse RCP отныне включает и поддержку декларативных сервисов. Подробнее про декларативные сервисы можно прочитать в статье Введение в OSGi. Декларативные сервисы - первое знакомство, а здесь тред из мейл-листа разработчиков Eclipse.

3. Новое API для многопоточности
Серьезные изменения в API, обеспечивающем многопоточную работу Equinox. Предполагается, что это приведет к ускорению работы системы на многоядерных процессорах.

SWT


1. Появился JNI-генератор
Добавлен новый плагин, для упрощения процесса генерации SWT JNI кода.
JNI Generator

2. JavaScript-to-Java
Теперь в виджете Browser JavaScript-код может обращаться к Java. Поддерживаются следующие типы данных: числа, булевские переменные, строки, null и массивы. Пример.

3. Поддержка OpenGL в Cocoa
Версия SWT для Cocoa теперь работает и с OpenGL.
OpenGL on Cocoa

4. На Mac Cocoa модальные окна имеют вид, характерный для этой системы
Теперь на Mac Cocoa модальные окна Eclipse отображаются так же, как и модальные окна других приложений. Интерфейс Eclipse становиться все более и более приближен к родному маковскому.
Using sheets on Mac Cocoa

5. Полная поддержка Drag-n-Drop для Mac Cocoa
Cocoa Drag-n-Drop в деревьях и таблицах теперь полностью поддерживается в SWT вместе со всеми native-фичами платформы.
Improved DND feedback on Cocoa

6. Улучшение copy-paste файлов
Теперь можно напрямую перемещать файлы между Explorer и менеджером файлов Nautilus. Как это работает с другими менеджерами файлов - пока не знаю, но гномоводы могут радоваться.
Improved copy and paste support

7. Альтернативное расположение кнопок
В версии SWT для GTK появилась возможность изменять дефолтное расположение кнопок в Eclipse. Чтобы разместить кнопку OK слева, необходимо внести изменения в файл ~/.gtkrc-2.0 - добавить строку gtk-alternative-button-order=1.
Alternate button order

8. Выпадающий календарик для выбора даты/времени
Добавлен новый компонент пользовательского интерфейса - выпадающий календарик, для выбора даты/времени. Выгладит календарик так:
DateTime DROP_DOWN

9. Поддержка браузера Mozilla на Solaris x86
В Eclipse для Solaris x86 включена поддержка браузера Mozilla.
Mozilla browser support on Solaris x86

10. Выбор ориентации в диалоге печати
В диалоге печати теперь добавлена возможность выбора ориентации: портретная или альбомная. Так же можно задать разворот на 180 градусов.
Paper orientation

Так же добавлена поддержка новых версий библиотек, в частности JUnit 4.5, Jetty 6.1, ICU4J 4,

По поводу быстродействия трудно сказать что-либо определенное. Во-первых данный параметр зависит от платформы. Лично я на Windows XP не заметил резкого прироста быстродействия. По отзывам владельцев ноутбуков от Apple - сборка с Cocoa работает гораздо шустрее предыдущих версий. На днях постараюсь потестировать версию под Linux. Насколько я знаю, именно сейчас разработчики Eclipse целенаправленно занимаются повышением быстродействия. Т.н. performance bugs.

Здесь надо сказать спасибо тем, кто дочитал до конца. Как видим, список изменений впечатляет, причем он далеко не полон. Поэтому у меня такой вопрос к читателям: какие изменения наиболее важны для вас?

З.Ы. А может вы заметили какое-то новшество, которого нет в списке? Не постесняйтесь - напишите об этом комментарий.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

З.Ы. Если Вы есть во Вконтакте - вступайте в группу Russian Eclipse Community.


А дальше...