Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Над чем ставить аннотации Над методами класса или интерфейса ? / 19 сообщений из 19, страница 1 из 1
08.06.2016, 11:54
    #39252647
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
собственно в документации

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#transaction-declarative-annotations

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
From Spring reference 10.5.6 Using @Transactional

Tip

Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Transactional annotation, as opposed to annotating interfaces. You certainly can place the @Transactional annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies (proxy-target-class="true") or the weaving-based aspect (mode="aspectj"), then the transaction settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a transactional proxy, which would be decidedly bad.
So even not overriden it will only work if you use Spring-Aop-Proxies (which I can not recommend), but not for AspectJ or CGILib Proxies!

But I do not expect that this work for an method that is overriden in an Interface, even not for Spring-Aop-Proxies.




но если есть классическая архитектура -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@NoRepositoryBean
public interface AbstractRepository<T , ID extends Serializable>  extends JpaRepository<T, ID>,JpaSpecificationExecutor<T>{
    
}

public interfaceTemplateRepository extends AbstractRepository<Template, Long> {



//
public interface AbstractService<T, ID> {

public abstract class AbstractServiceImpl<T, ID extends Serializable> implements AbstractService<T, ID>{

//


public interface TemplateService extends AbstractService<Template, Long> {

public class TemplateServiceImpl extends AbstractServiceImpl<Template, Long> implements TemplateService {



итд

хочется либо в интерфейсе ставить над методами либо в абстрактном классе ...


аннотации типа :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Transactional("transactionManager")


@RolesAllowed({"ROLE_ADMIN"})


@Cacheable({"templates"})


итд 




или все таки только над методами конкретного класса?
...
Рейтинг: 0 / 0
08.06.2016, 14:29
    #39252834
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1,


Для чего в интерфенйсе ?! или абстрактном классе - чтобы декларативно распространить действие транзакций или логирования на всех кто будет использовать имплементацию ...

так же как быть с mock объектами в тестах ?

если аннотация будет над интерфейсом - то вроде как она будет и когда мы обернем интерфейс mock объектом ...

а если в реализации - то нужного эффекта мы не получаем ?! так?
...
Рейтинг: 0 / 0
08.06.2016, 14:35
    #39252844
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
я не считаю себя большим специалистом по архитектуре и проектированию, но имхо транзакционность или кэш - это детали реализации, а не контракта
...
Рейтинг: 0 / 0
08.06.2016, 15:09
    #39252899
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Код: java
1.
2.
3.
Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Cache* annotation, as opposed to annotating interfaces. You certainly can place the @Cache* annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies ( proxy-target-class="true") or the weaving-based aspect ( mode="aspectj"), then the caching settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a caching proxy, which would be decidedly bad.
[Note]
In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual caching at runtime even if the invoked method is marked with @Cacheable - considering using the aspectj mode in this case. Also, the proxy must be fully initialized to provide the expected behaviour so you should not rely on this feature in your initialization code, i.e. @PostConstruct.




http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html
Тут тоже они говорят да можно на интерфейсы ... но при этом нужно понимать какой механизм будет в приложении ...

не с каждым будет работать ...

согласен полностью что интерфейс это контракт ... и не следует его грузить аннотациями и декларативными обязаностямими .


просто получается если аннотация стоит в интерфейсе - то все кто ее реализовал будет иметь некоторое задекларированное поведение ...

это удобно - так как описал в одном месте и не забудешь проставить теже транзакции в имплементациях ...


ну а тогда


если интерфейс не подходит ... остается абстрактный класс ?!
...
Рейтинг: 0 / 0
08.06.2016, 15:11
    #39252903
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
...
Рейтинг: 0 / 0
08.06.2016, 17:28
    #39253072
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1просто получается если аннотация стоит в интерфейсе - то все кто ее реализовал будет иметь некоторое задекларированное поведение ...
ну т.е. ты обещаешь атомарность на методе save у какого-нибудь FileSystemEntityPersister ;) ?
...
Рейтинг: 0 / 0
08.06.2016, 21:31
    #39253167
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
chpasha, @Transactional/@Cacheable/@Post* на класс, @Validate/@Valid на интерфейс
...
Рейтинг: 0 / 0
08.06.2016, 21:32
    #39253169
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
На интерфейс что должно прийти и что должно уйти, остальное на класс
...
Рейтинг: 0 / 0
08.06.2016, 21:34
    #39253170
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Вопросы "Что?" (интерфейс) и "Как?"(класс)
...
Рейтинг: 0 / 0
09.06.2016, 08:19
    #39253261
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1,

Интересный вы человек. Сам спросил. Сам привел нужные цитаты. Сам ответил. В пору блог завести.
Суть в том, что можно и так и так. Если не знаешь как лучше, то ставь на реализацию. Если знаешь что именно в твоем случае лучше на интерфейс и понимаешь последствия, то ставь на интерфейс.
...
Рейтинг: 0 / 0
09.06.2016, 11:44
    #39253421
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
BlazkowiczAtum1,

Интересный вы человек. Сам спросил. Сам привел нужные цитаты. Сам ответил. В пору блог завести.
Суть в том, что можно и так и так. Если не знаешь как лучше, то ставь на реализацию. Если знаешь что именно в твоем случае лучше на интерфейс и понимаешь последствия, то ставь на интерфейс.

>Мне ответ понравился

На интерфейс что должно прийти и что должно уйти, остальное на класс


нужны какие то правила разделения , от которых нужно отталкиваться в декларативном программировании ... вот и их и пытаюсь выспросить :)

ну т.е. ты обещаешь атомарность на методе save у какого-нибудь FileSystemEntityPersister ;) ?


Это я не понял ... я обещаю у всех своих наследников одинаковое поведение ...
...
Рейтинг: 0 / 0
09.06.2016, 11:50
    #39253427
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1Это я не понял ... я обещаю у всех своих наследников одинаковое поведение ..."Обещать, не значит - жениться" ...
...
Рейтинг: 0 / 0
09.06.2016, 12:02
    #39253442
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Basil A. SidorovAtum1Это я не понял ... я обещаю у всех своих наследников одинаковое поведение ..."Обещать, не значит - жениться" ...

@RolesAllowed({"ROLE_ADMIN"})

например - в интерфейсе лучше смотрится .. если есть некий абстрактный интерфейс - что дает гарантию что никто из программистов не забудет к примеру проставить @RolesAllowed({"ROLE_ADMIN"}) над методом delete
...
Рейтинг: 0 / 0
09.06.2016, 12:02
    #39253443
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1я обещаю у всех своих наследников одинаковое поведение ...
Смотри. Есть контракт. Он обещает какое-то поведение. А есть поведение, которое контракт не обещает. Например ACID. В RDBMS он на месте. Но стоит тебе предложить реализацию под NoSQL и файловую систему, весь ACID идёт лесом. Но в контракте его явно нет.
...
Рейтинг: 0 / 0
25.10.2016, 12:17
    #39333461
May12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Blazkowicz,

можно вопрос?

У меня есть класс. Класс проаннотирован как компонент Spring. Нужно ли для каждого такого класса делать интерфейс чтобы "уменьшить связанность?"
...
Рейтинг: 0 / 0
25.10.2016, 12:23
    #39333471
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
May12можно вопрос?
Кто же вам запретит?

May12У меня есть класс. Класс проаннотирован как компонент Spring. Нужно ли для каждого такого класса делать интерфейс чтобы "уменьшить связанность?"
Нет с таким подходом не нужно. Можно создать интерфейс с ограниченным набором методов, но это тоже не шибко поможет.
Просто каждый раз когда у вас один класс использует другой, нужно задуматься, действительно ли эта связь необходима, или есть способ её избежать, переместив реализацию логики в определенный класс. Это трудно объяснять на пальцах. Нужен какой-то пример, который можно было бы исправить.
...
Рейтинг: 0 / 0
25.10.2016, 14:04
    #39333576
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
May12Blazkowicz,

можно вопрос?

У меня есть класс. Класс проаннотирован как компонент Spring. Нужно ли для каждого такого класса делать интерфейс чтобы "уменьшить связанность?"

Да. нужно

и это основная проблема при использовании DI паттерна через spring

Почему так - потому что Вашего класса в рантайме не будет - будет прокси который будет обернут еще одним прокси итд ...

чтобы потом не наступить на грабли WTF - пишите все через интерфейсы , не вы так ваш коллега наступит .

тут

YouTube Video
...
Рейтинг: 0 / 0
25.10.2016, 14:31
    #39333610
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
Atum1и это основная проблема при использовании DI паттерна через spring

О какой версии Spring речь?

Atum1Почему так - потому что Вашего класса в рантайме не будет
ROFL

Atum1 - будет прокси который будет обернут еще одним прокси итд ...

Прокси на прокси сидит и интерфейсом погоняет. Классам даже места не нашлось. Так?
...
Рейтинг: 0 / 0
25.10.2016, 23:10
    #39333987
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
BlazkowiczAtum1и это основная проблема при использовании DI паттерна через spring

О какой версии Spring речь?

Atum1Почему так - потому что Вашего класса в рантайме не будет
ROFL

Atum1 - будет прокси который будет обернут еще одним прокси итд ...

Прокси на прокси сидит и интерфейсом погоняет. Классам даже места не нашлось. Так?

=) ну в самом простом случае да )

посмотрите к примеру во что превращается обычный enitiy после того как с ним поработает Хибер - сколько в нем всего интересного и ненужного появляется :)

Я уже молчу про спринг :) и его BFPP итд
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Над чем ставить аннотации Над методами класса или интерфейса ? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]