Какой объект в UserDao при его автоматической настройке в Spring MVC, если у нас есть два класса реализации и оба имеют компоненты

#java #spring #spring-mvc

Вопрос:

В Spring MVC предположим, что у нас есть Dao с именем UserDao

 public interface UserDao {

}
 

и он имеет два класса реализации UserDaoImpl и UserDaoImpl2

 public class UserDaoImpl implements UserDao {

}

public class UserDaoImpl2 implements UserDao {

}
 

если мы создадим компоненты обоих этих классов:

servelet-context.xml

 <beans:bean id="userDao" class="com.usr.UserDaoImpl">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

<beans:bean id="userDao2" class="com.usr.UserDaoImpl2">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
 

и мы @Автоматически подключили его в моем контроллере, как

 @Controller
public class UserController {
    @Autowired
    UserDao userDao;
}
 

Тогда у UserDao есть объект какой реализации UserDaoImpl или UserDaoImpl2.

Пожалуйста, помогите мне с этим.

Ответ №1:

Это должно привести к ошибке, потому что Spring не знает, какой компонент вводить, так как доступно несколько.

Чтобы исправить это, вам нужно будет либо установить один из них в качестве основного (основной, который следует вводить, когда вы не указываете дополнительную информацию, чтобы Spring знал, какой из них вам нужен).:

 <beans:bean id="userDao" class="com.usr.UserDaoImpl" primary="true">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

<beans:bean id="userDao2" class="com.usr.UserDaoImpl2">
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
 

Это приведет к введению компонента класса com.usr.UserDaoImpl .

Или вы также можете использовать квалификаторы, чтобы точно определить, какой компонент вам нужен.

 <beans:bean id="userDao" class="com.usr.UserDaoImpl">
    <qualifier value="one"/>
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>

<beans:bean id="userDao2" class="com.usr.UserDaoImpl2">
    <qualifier value="two"/>
    <beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>
 

И в зависимом коде:

 @Controller
public class UserController {
    @Autowired
    @Qualifier("two")
    UserDao userDao;
}
 

Это приведет к введению компонента класса com.usr.UserDaoImpl2 .