powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Над чем ставить аннотации Над методами класса или интерфейса ?
19 сообщений из 19, страница 1 из 1
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39252647
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно в документации

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
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39252834
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,


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

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

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

а если в реализации - то нужного эффекта мы не получаем ?! так?
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39252844
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не считаю себя большим специалистом по архитектуре и проектированию, но имхо транзакционность или кэш - это детали реализации, а не контракта
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39252899
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39252903
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39253072
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1просто получается если аннотация стоит в интерфейсе - то все кто ее реализовал будет иметь некоторое задекларированное поведение ...
ну т.е. ты обещаешь атомарность на методе save у какого-нибудь FileSystemEntityPersister ;) ?
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39253167
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha, @Transactional/@Cacheable/@Post* на класс, @Validate/@Valid на интерфейс
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39253169
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На интерфейс что должно прийти и что должно уйти, остальное на класс
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39253170
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопросы "Что?" (интерфейс) и "Как?"(класс)
...
Рейтинг: 0 / 0
Spring Над чем ставить аннотации Над методами класса или интерфейса ?
    #39253261
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

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

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

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

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


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

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


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

@RolesAllowed({"ROLE_ADMIN"})

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

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

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

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

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

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

Да. нужно

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

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

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

тут

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

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

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

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

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

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

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

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

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

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

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

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


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