Весенний IOC с аннотациями сбивает с толку парня из Guice. Помоги мне просветить - PullRequest
2 голосов
/ 18 ноября 2009

Я пришел в МОК через Google Guice.

И теперь я был вынужден использовать Spring 2.5.6 на работе, и я потерян, потому что Spring довольно сложен. Вот несколько вопросов после прочтения битов весенних документов:

  • В чем разница между @Service, @Controller и @Component? Если я просто хочу автоматически связать свои объекты, как Guice, нужно ли мне беспокоиться обо всех этих стереотипах?
  • Я планирую пойти по пути сканирования компонентов, используя только конструкторское внедрение (внедрение сеттера в основном защищается Церковью Саентологии) и без каких-либо неприятных XML-вещей. Так этот код извлекает все, что мне нужно?

    @Component
    public class Foo
    {
        @Autowired(required=true)
        public Foo( Bar bar, @Qualifier("yay") Boo yay, 
                    @Qualifier("hoo") Boo hoo )
        {
            _bar = bar; _boo = boo;
        }
    
        Bar _bar;
        Boo _boo;
    ....snipped...
    }
    
    @Component
    @Qualifier("yay")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooYay implements Boo
    {
    }
    
    @Component
    @Qualifier("hoo")
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    public BooHoo implements Boo
    {
    }
    
    • В приведенном выше примере правильно ли я квалифицировал 2 различные реализации Boo?
    • Есть ли какая-либо функция, аналогичная поставщикам Google Guice?
    • Как мне подражать поведению @Singleton (в Guice) весной?

1 Ответ

4 голосов
/ 18 ноября 2009

Глядя на ваш код, кажется, все в порядке, и ваши компоненты получат autowired. Вы должны указать имя пакета в XML-файле конфигурации, чтобы Spring мог отсканировать его для аннотаций.

Компоненты, управляемые Spring, в целом, по умолчанию и наиболее распространенной областью действия для автоматически определяемых компонентов является singleton.

На самом деле @Component является обобщением @Service и @Controller. См. документы .

Spring 2.5 вводит дальше аннотации стереотипа: @Component, @Service и @Controller. @Составная часть служит общим стереотипом для любого Пружинный компонент; в то время как, @Repository, @Service и @Controller служить специализациями @Component для более конкретных случаев использования (например, в постоянство, обслуживание и слои представления соответственно). Это означает, что вы можете аннотировать ваши классы компонентов с @ Компонент, но аннотируя их с @Repository, @Service или Вместо этого @Controller, ваши классы более подходит для обработки инструменты или связь с аспектами. За Например, эти стереотипные аннотации сделать идеальные цели для pointcut из Конечно, также возможно, что @Repository, @Service и @Controller может нести дополнительную семантику в будущие релизы весны Фреймворк. Таким образом, если вы делаете решение между использованием @Component или @ Сервис для вашего сервисного уровня, @Service - лучший выбор. Точно так же, как указано выше, @Repository уже поддерживается как маркер для автоматического исключения перевод в вашем постоянном слое.

Убедитесь, что значение default-autowire или autowire для этих бобов равно byType. И тогда вы должны изменить ваши компоненты Boo, как показано ниже,

@Component("yay")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooYay implements Boo
{...}


@Component("hoo")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public BooHoo implements Boo
{...}

Возможно, вы захотите сделать это с autowire = "byName", в этом случае вам не понадобится @Qualifiers, но вы должны предоставить соответствующие установщики. Надеюсь, вам сейчас удастся сбить это с толку.

...