2014-11-03 4 views
0

Я в основном использую @Autowired и @Component аннотации в моем проекте. Тем не менее, я собираюсь использовать класс DataSource для действий с базой данных.Весна объявить компонент в xml

Итак, я использую это в моем диспетчерскую-servlet.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/market"/> 
    <property name="username" value="root"/> 
    <property name="password" value=""/> 
</bean> 

В моем классе дао, Мой сеттер для dataSource является:

@Autowired 
private DataSource dataSource; 

public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
    this.jdbcTemplateObject = new JdbcTemplate(dataSource); 

} 

Однако это не делая трюк. Мой jdbcTemplateObject: null.

Если я не использую «контекст: компонентное сканирование ...» и вместо этого использую классические весенние бобы, не используя аннотацию @Autowired, все работает хорошо.

Я могу использовать свою базу данных. Тем не менее, я не хочу объявлять все компоненты по одному в моем XML-файле. По мере роста проекта это не будет практичным. Как я могу решить эту проблему ? Можно ли объявить dataSource в моем dispatcher-servlet.xml как компонент, поэтому @Autowired работает на dataSource?

+0

Когда вы используете '@ Autowired' в полях, Spring будет искать зависимости и вводить их прямо там, нет смысла использовать метод setter здесь. –

+0

Весна сделает то, что вам не нужен сеттер. Вы можете использовать jdbctemplate в xml и autowire. –

+0

Большое спасибо. Я не знал, что мне не нужен сеттер. Как он может установить его без сеттера? –

ответ

1

Когда вы используете @Autowired на полях Spring, мы будем искать dependencies и вводить их прямо там, нет смысла использовать метод setter здесь.

Вам не нужно беспокоиться о том, как весна будет вводить зависимость. Он позаботится о полном жизненном цикле.

Подробнее о Spring's Dependecy Injection visit this ссылка.

0

Вы отметили поле с @Autowired, которое сообщает весне, чтобы ввести зависимость непосредственно в поле. Если вы действительно хотите использовать сеттер, аннотируйте установщик с помощью @Autowired вместо поля.

@Autowired 
public void setDataSource(DataSource ds) { ... } 

Однако я настоятельно рекомендую, чтобы не создавать JdbcTemplate для каждого компонента, который нуждается в одном (это довольно тяжело создать). JdbcTemplate - это поточно-безопасный объект, однажды построенный. Поэтому вместо того, чтобы создавать новый для каждого компонента, который нуждается в нем (в методе setDataSource), просто создайте один JdbcTemplate и введите его.

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

Тогда в вашем dao.

@Autowired 
private JdbcTemplate jdbcTemplate; 

Или, что мне нравится делать ..

private final JdbcTemplate jdbcTemplate; 

@Autowired 
public YourRepository(JdbcTemplate jdbcTemplate) { 
    this.jdbcTemplate=jdbcTemplate; 
} 

Таким образом, вы не можете построить нелегальный объект, в то время как с инъекцией на основе инкубационного вы могли. Поддерживая возможность вводить один для тестирования.

Другое примечание: DriverManagerDataSource подходит для тестирования, но не для использования в производстве, для чего используется реальный пул соединений, например HikariCP или Tomcat JDBC.

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