2015-04-28 3 views
2

Согласно определению неизменяемого объекта (see this question), я не очень уверен, что создание сеттеров Spring DAO как единственно возможного использования - это способ гарантировать неизменность или нет. Например (DataSource свойство):Spring DAO и неизменяемые объекты

public class MySpringPojoDAO extends JdbcDaoSupport implements IMySpringPojoDAO { 

    private boolean dataSourceSet = false; 


    @Override 
    public void setDataSource(DataSource dataSource){ 

     if (dataSourceSet) { 
      throw new IllegalStateException("..."); 
     } 

     dataSourceSet = true; 
     this.dataSource = dataSource; 
     } 
    } 

} 

В случае это не так, что это способ гарантировать неизменность с помощью Spring Framework или IoC?

+0

Что вы подразумеваете под одним-единственным? – Adelin

+0

Я имею в виду, что сеттер можно использовать только один раз (когда IoC инициализирует контекст Spring), так что объект не будет изменен на «другие» компоненты или объекты. –

+0

Вы не можете '@ Override', так как' JdbcDaoSupport # setDataSource' является окончательным. – dit

ответ

1

Если посмотреть на реализацию JdbcDaoSupport вы найдете этот:

public abstract class JdbcDaoSupport extends DaoSupport { 

    private JdbcTemplate jdbcTemplate; 


    /** 
    * Set the JDBC DataSource to be used by this DAO. 
    */ 
    public final void setDataSource(DataSource dataSource) { 
     if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { 
      this.jdbcTemplate = createJdbcTemplate(dataSource); 
      initTemplateConfig(); 
     } 
    } 

    /** 
    * Return the JDBC DataSource used by this DAO. 
    */ 
    public final DataSource getDataSource() { 
     return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null); 
    } 

    [...] 

} 

JdbcDaoSupport#setDataSource является окончательным. Вы не можете переопределить этот метод.Это означает, что вы должны сделать это таким образом:

public class MySpringPojoDAO extends JdbcDaoSupport implements IMySpringPojoDAO { 

    @Autowired 
    public MySpringPojoDAO (DataSource dataSource){ 
     setDataSource(dataSource); // JdbcDaoSupport#setDataSource(..) 
    } 

    [...] 

} 

Так пусть весна обрабатывать жизненный цикл бобов, как DataSource для вас. Вы никогда не должны вручную создавать экземпляр MySpringPojoDAO. Вместо этого:

@Autowired 
private MySpringPojoDAO _myDao; 
4

Сеттеры предназначены для использования более одного раза, а конструкторы с другой стороны - нет.

Когда дело доходит до весны, то лучше, чтобы установить все необходимые бобы через застройщик:

final DataSource dataSource;// will force this property to be set only once 

@Autowired(required=true) 
public MySpringPojoDAO (DataSource dataSource){ 
    this.dataSource = dataSource; 
} 

Во-вторых, вы можете просто добавить необходимый атрибут, который сделает ваш код короче. Spring обеспечит получение компонента DataSource.

UPDATE: Если вы все еще хотите использовать сеттеры, чем вам не нужен другой флаг, просто проверить = нулевое состояние:

@Override 
    public void setDataSource(DataSource dataSource){ 
     if (this.dataSource != null) { // has been already set 
      throw new IllegalStateException("..."); 
     } 
     this.dataSource = dataSource; 
    } 
+0

На самом деле вам не нужна переменная 'DataSource'. Посмотрите на 'JdbcDaoSupport # getDataSource()' – dit

+0

Нет, вы не делаете :) Я просто хотел объяснить, что, когда вы хотите установить переменную только один раз, использование final может быть хорошим вариантом. – Beri

+0

ОК, я вижу. Но если я не предлагаю никаких методов настройки, мне не нужно делать это окончательным. Правильно? – dit

0

Неизменные объекты просто объекты, состояние которых (данные объекта) не может измениться после строительства. Примеры неизменяемых объектов из JDK включают String и Integer.

Чтобы застраховать изменчивость MySpringPojoDAO, сделайте ее окончательной, чтобы она не могла быть продолжена во второй раз. Внесите методы, которые могут изменить ее внутреннее состояние, как сеттеры. И это то, что мне нравится в Spring и Guice Dependency injection, вы можете вставить конструктор.

final public class MySpringPojoDAO extends JdbcDaoSupport implements IMySpringPojoDAO { 

    // private boolean dataSourceSet = false; 

@Autowired 
public MySpringPojoDAO (DataSource dataSource){ 
this.dataSource= dataSource 
} 
    /* @Override 
    public void setDataSource(DataSource dataSource){ 

     if (dataSourceSet) { 
      throw new IllegalStateException("..."); 
     } 

     dataSourceSet = true; 
     this.dataSource = dataSource; 
     } */ 
     //don't use setters you'll need synchronization!!! 
    } 

} 

check this out

0

неизменные объекты

Объект считается непреложным, если ее состояние не может измениться после того, как он построен. Максимальное использование неизменяемых объектов широко используется в качестве звуковой стратегии для создания простого и надежного кода.

Неизменные классы - java.lang.String, java.lang.Integer, java.lang.Byte, java.lang.Character, java.lang.Short, java.lang.Boolean, java.lang.Long , java.lang.Double, java.lang.Float ... и т. д.

Классы, которые могут/не могут быть окончательными, но не совсем соответствуют размеру для (im) изменчивости - java.util.Collections, java.util. Массивы и т. Д.

IMHO, неизменяемость является хорошим кандидатом для рассмотрения - при определении определенного типа (объекта - типа Pojo) объекта. Поэтому, пока никто не остановит создание своего «MySpringPojoDAO» неизменяемым - это будет иметь больше смысла, если вы будете использовать «MySpringPojo» неизменяемым, а DAO - изменчивым. (Или может быть окончательным)

чтения - https://stackoverflow.com/a/5124214/760393

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