LINUX.ORG.RU

Google Guice


0

0

Google объявила о выпуске своего легковесного программного комплекса для Java 5 - Guice (произносится как 'juice'), который работает по принципу шаблона Dependency Injection (инверсия зависимостей) и доступна под лицензией Apache License 2.0. Guice полностью использует мощь Java 5 и повсеместно использует аннотации и параметризуемые классы (generics).

В кратце:

- Guice берёт заботу над сильной комплексацией кода.
- Guice позволяет делать простые и быстрые тесты на всех уровнях.
- Guice уменьшает излишний код.
- Guice является типизированным (type safe).
- Guice, где уместно использует внешние настройки.
- Guice позволяет собрать приложение из компонент, которые действительно независимы.
- Guice генерирует понятные отчёты об ошибках, если бы их читал человек.
- Guice маленький и очень быстрый.

Домашняя страница проекта: http://code.google.com/p/google-guice/
Сравнение со Spring Framework: http://code.google.com/p/google-guice...
Первый обзор Guice: http://crazybob.org/2007/03/first-gui...
Руководство пользователя: http://docs.google.com/Doc?id=dd2fhx4...

>>> Подробности

★★★★★

Проверено: Shaman007 ()

Ответ на: комментарий от WFrag

>Конкретный пример можешь привести?

Кусок конфига пойдет?:)

<doxy:schema xmlns:doxy="http://anonysoft.com/ns/doxy">;
        <doxy:document type="company" title="Company" category="Contacts" order="2">
                <doxy:attribute name="name" title="Name" type="doxy:string" required="true" primary="true"/>
                <doxy:attribute name="type" title="Type" type="type" required="true"/>
                <doxy:attribute name="status" title="Status" type="status" required="true"/>
                <doxy:attribute name="url" title="URL" type="doxy:url" in-list="false"/>
                <doxy:attribute name="address" title="Address" type="doxy:string" in-list="false"/>
                <doxy:reference name="country" title="Country" required="true" type="country" display="name"/>
                <doxy:attribute name="phone" title="Phone" type="doxy:string" in-list="false"/>
                <doxy:attribute name="fax" title="Fax" type="doxy:string" in-list="false"/>
                <doxy:attribute name="comment" title="Comment" type="doxy:text" in-list="false"/>
                <doxy:attribute name="satellite" title="Satellite" type="doxy:text" in-list="false" category="Client Accounts"/>
                <doxy:attribute name="extranet" title="Extranet" type="doxy:text" in-list="false" category="Client Accounts"/>
        </doxy:document>
        <doxy:enumeration name="status">
                <doxy:element value="active"/>
                <doxy:element value="inactive"/>
        </doxy:enumeration>
        <doxy:enumeration name="type">
                <doxy:element value="Direct Client"/>
                <doxy:element value="Indirect Client"/>
                <doxy:element value="Direct E-shop Client"/>
                <doxy:element value="Indirect E-shop Client"/>
                <doxy:element value="ASP Partner"/>
                <doxy:element value="ASP Client"/>
                <doxy:element value="Distributor/Reseller"/>
                <doxy:element value="OEM Partner"/>
                <doxy:element value="Other"/>
        </doxy:enumeration>
</doxy:schema>

r ★★★★★
()
Ответ на: комментарий от r

>Кусок конфига пойдет?:)

Разве это плохо мапиЦЦа на ORM? :)

Хотя я смотрю вы крутые перцы раз свой маппер написали. Только вот хочется узнать: свой "велосипед" яйца не трёт?

anonymous
()
Ответ на: комментарий от anonymous

>В принципе можно принять что компилятор это редактор "class"-файла а интерфейсом к нему есть код на Java

понимать это можно как угодно. Зайди в etc и посмотри туда. Большинство вещей которые там написаны можно сделать с помощью аннотаций. Одна херня - на каждый чих ядро компилять придется.

>Это не туча аннотаций, а всего одна и говорит что всё параметры для конструктора должны быть "вставлены"

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

>И где тут "tight coupling"?

Вот тут: import com.google.inject.Inject;

>Ничто не мешает мне использовать этот код без использования Guice.

Кроме того, что оно даже неоткомпилится, если ты выкинешь guice?:))



>Если свойство было аннотировано то ты автоматически удаляеш и аннотации. Если же используется внешний XML для описания чего либо что использует это свойство то ты в полной заднице.

Ну да. Предположим у нас ORM. Легче тебе станет от того, что аннотация удалена? Схеме базы на SQL полегчает? Разным EJBQL полегчает? Шаблонам вывода полегчает? Так что все зависит от продвинутости IDE и поддержки в ней разных фреймворков и позможностей скана на "похоже тут есть какаято связь". А легко все бывает в очень простых случаях.

>поэтому не стоит всех косить под свою гребёнку

А я и не говорю. Связность сама по себе - это ярлык, физического смысла не несет. Серп появляется в развитии и усложнении проекта. Есть обобщенные подходы, которые в методике анализа принято называть "обощение" и "абстракция". Можно ими пользоваться с целью сделать проект устойчивым к изменениям. Это все конечно не бесплатно. Если проект небольшой и конечный особо заморачиваться на перспективу смысла конечно нет. Если проект большой - есть.

Вот например

Конфиг модуля Tomcat который подключается в контейнер:

<?xml version="1.0"?>
<?metasax namespace="http://anonysoft.com/microkernel/jmx"; class="com.anonysoft.microkernel.jmx.MBeanDescriptorBuilder"?>
<microkernel:module xmlns:microkernel="http://anonysoft.com/microkernel/module"; name="JMX Tools" version="1.0">
<microkernel:service name="JMXTools:name=HttpAdaptorStartup"
implementation="com.anonysoft.microkernel.jmx.HttpAdaptorStartup">
<microkernel:depends-on name="JMXTools:name=Adaptor,protocol=http"/>
<microkernel:property name="adaptorName" value="JMXTools:name=Adaptor,protocol=http"/>
<jmx:mbean xmlns:jmx="http://anonysoft.com/microkernel/jmx";
managed-interface="com.anonysoft.microkernel.jmx.HttpAdaptorStartupMBean&qu ot;/>
</microkernel:service>
<microkernel:service name="JMXTools:name=Adaptor,protocol=http" implementation="mx4j.tools.adaptor.http.HttpAdaptor">
<microkernel:depends-on name="JMXTools:name=XsltProcessor"/>
<microkernel:property name="port" value="3333"/>
<microkernel:property name="processorName" value="JMXTools:name=XsltProcessor"/>
<jmx:mbean xmlns:jmx="http://anonysoft.com/microkernel/jmx"/>;
</microkernel:service>
<microkernel:service name="JMXTools:name=XsltProcessor" implementation="mx4j.tools.adaptor.http.XSLTProcessor">
<jmx:mbean xmlns:jmx="http://anonysoft.com/microkernel/jmx"/>;
</microkernel:service>
</microkernel:module>


Как ты понимаешь mx4j я аннотировать не могу, чтобы этот контейнер инжектил ему зависимости. mx4j до контейнера нету никакого дела. Ну и что? Я взял контейнер, написал конфиг к mx4j и он с полпинка запустился внутри. Точно так же совершенно внешним конфигом заставил запущенные сервисы экпоузнуться в JMX. Если они уже JMX-enabled - они экпоузнулись по умолчанию. Если нет - через динамический mbean-proxy или через обвязку MBean интерфейсом. При чем самой реализации абсолютно побарабану в какой среде она работает и с чем ее связали.

r ★★★★★
()
Ответ на: комментарий от anonymous

>Хотя я смотрю вы крутые перцы раз свой маппер написали. Только вот хочется узнать: свой "велосипед" яйца не трёт?

Это не маппер на ORM. Это кусок описания схемы данных. Который является достаточным для построения на его основе интерфейса и персистенса без всяких объектов между ними.

r ★★★★★
()
Ответ на: комментарий от r

Самого интересного - разных хитрых отношений - нет. То, как выглядят отношения в объектах (объект "документ", свойство "редакторы" типа массив), по-моему, гораздо удобнее для отображения, чем то, как они выглядят в БД (FK).

WFrag ★★★★
()
Ответ на: комментарий от r

>понимать это можно как угодно. Зайди в etc и посмотри туда. Большинство вещей которые там написаны можно сделать с помощью аннотаций. Одна херня - на каждый чих ядро компилять придется.

Дальнейший спор бесполезен, так как речь пошла не о том что Guice это плохо или хорошо, а о том что аннотации это плохо или хорошо. Я так понял что аннотации тебя не устраивают в принципе. Лично меня устраивают. И меня устраивает то что у меня в интерфейсе будет присутсвовать import com.google.inject.Inject;.

anonymous
()
Ответ на: комментарий от r

> Это не маппер на ORM. Это кусок описания схемы данных. Который является достаточным для построения на его основе интерфейса и персистенса без всяких объектов между ними.

До тех пор пока все что мапится есть простын типы либо энумы...

anonymous
()
Ответ на: комментарий от anonymous

>так понял что аннотации тебя не устраивают в принципе.

Не правильно понял. Аннотации вещь полезная и правильная. Но они должны подчинятся тем же принципам дизайна что и прочий код. А не все кинулись модную фишку юзать и обложили каждый свой фреймворк аннотациями.

r ★★★★★
()
Ответ на: комментарий от anonymous

>До тех пор пока все что мапится есть простын типы либо энумы...

Хто тебе сказал? А что ты в SQL такого можешь намапить? Там зачастую даже енумов нет.

r ★★★★★
()
Ответ на: комментарий от dotcoder

не "уменьшает высокую связанность", а "уменьшает связанность" тогда уж

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.