#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
.