2014-11-10 2 views
1

Я изучаю сертификацию Spring Core.Некоторые сомнения относительно Java-конфигурации контекста Spring Spring (зависимость)

Я знаю, что весной я могу настроить инъекции зависимостей с использованием 3 пути:

  1. Конфигурация Java
  2. Классы аннотаций
  3. XML конфигурации

У меня есть некоторые сомнения относительно того, как использовать конфигурацию впрыска первого типа.

Например, у меня есть что-то вроде этого:

1) Класс с именем TransferServiceImpl:

public class TransferServiceImpl implements TransferService { 

    public TransferServiceImpl(AccountRepository ar) { 
     this.accountRepository = ar; 
    } 
    ... 
    ... 
    ... 
} 

Этот класс содержать TransferServiceImpl() конструктор, который принимают AccountRepository объект как input paramether, поэтому AccountRepository - это зависимость, которая должна быть введена в Transf erServiceImpl().

2) Это реализация предыдущего AccountRepository класса:

public class JdbcAccountRepository implements AccountRepository { 
    public JdbcAccountRepository(DataSource ds) { 
     this.dataSource = ds; 
    } 
    ... 
    ... 
    ... 
} 

Таким образом, конструктор этого класса thake DataSource объект, который должен быть введен в класс JdbcAccountRepository.

Тогда у меня есть конфигурации класса, который содержит конфигурацию инъекции зависимостей:

@Configuration 
public class ApplicationConfig{ 

    @Bean public TransferService transferService(){ 
     return new TransferServiceImpl(accountRepository()); 
    } 

    @Bean public AccountRepository accountRepository(){ 
     return JdbcAccountRepository(dataSoruce()); 
    } 

    @Bean public DataSource dataSource(){ 
     DataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     ................................... 
     ................................... 
     ................................... 
    } 
} 

Так что мне кажется, что это работает следующим образом:

У меня есть 2 реализованы бобы по названию TransferServiceImpl и JdbcAccountRepository и класс конфигурации с именем ApplicationConfig.

В классе конфигурации я говорю, что, когда кто-то спросить на завод, чтобы создать TransferService объект автоматически строить его реализация TransferServiceImpl создание и введение автоматически в JdbcAccountRepository в конструктор TransferServiceImpl.

Таким же образом, когда JdbcAccountRepository создается его вводят в DataSource объект в конструктор.

Правильно ли это?

Если это право у меня есть следующие сомнения:

1) в ApplicationConfig класса я также объявить DataSource боб, но я не реализовать этот класс. Является ли это классом, предоставленным Spring, и мне нужно только установить его значения свойств?

2) Когда создаются бобы, определенные в классе ApplicationConfig? При запуске приложения? Я думаю, что в предыдущем примере, если я комментирую конструктор, используя @Bean, он создается как singleton при запуске приложения. Правильно или я что-то упускаю?

Tnx

ответ

1

1) В классе ApplicationConfig я также объявить DataSource боб , но я не реализовать этот класс. Это класс, предоставленный Spring и Мне нужно только установить его значения свойств?

Да. Существует ряд версий DataSource, предоставляемых Spring. Например: DriverManagerDataSource, SingleConnectionDataSource и другие.

2) Когда создаются бобы, определенные в классе ApplicationConfig ? При запуске приложения? Я думаю, что в предыдущем примере , если я комментирую конструктор с помощью @Bean, он создается как singleton при запуске приложения. Правильно ли я или я пропустил что-то?

По умолчанию бобы создаются при создании экземпляра Spring (обычно при запуске, если приложение подключено как таковое). Однако вы можете изменить это поведение, используя аннотацию @Lazy, где компонент будет создан только при явном запросе.

@Bean @Lazy public TransferService transferService(){ 
    return new TransferServiceImpl(accountRepository()); 
} 
+0

Tnx, теперь для меня более понятно – AndreaNobili

Смежные вопросы