Я пытался загрузить класс в контексте приложения, который реализует интерфейс, я столкнулся с двумя ситуациями
- Когда интерфейс GenericDao не имеет никакого объявленного метода: здесь, вв этом случае мой класс CriteriaQuerySampleDao загружается в соответствии с приведенным ниже кодом в контексте приложения, нет проблемы
CriteriaQuerySampleDao dao= context.getBean(CriteriaQuerySampleDao.class);
Когда мой интерфейс GenericDao имеет объявленный метод и который реализован моим классом CriteriaQuerySampleDao :
Здесь, в этом случае, мой класс незагружаться в контексте приложения Spring согласно приведенному ниже коду
CriteriaQuerySampleDao dao= context.getBean(CriteriaQuerySampleDao.class);
и выбрасывает
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.journaldev.spring.config.CriteriaQuerySampleDao' available
, но когда я загружаю его с помощью кода ниже, который использует интерфейс GenericDaoмоего класса CriteriaQuerySampleDao успешно загружается, как показано ниже: код
GenericDao dao= context.getBean(GenericDao.class);
может кто-нибудь объяснить, почему я вынужден загружать CriteriaQuerySampleDao класс с помощью интерфейса GenericDao , если мой классРеализация даже одного метода интерфейса.
Я не уверен в деталях, это весной?
GenericDao Interface
interface GenericDao<T>
{
Session getSession();
Class<T> getDefaultMappedObject();
}
CriteriaQuerySampleDao Класс, реализующий GenericDao
@Transactional
@Repository
public class CriteriaQuerySampleDao implements GenericDao<MyDBTable>
{
protected final static Logger logger= LogManager.getLogger(CriteriaQuerySampleDao.class);
@Inject
SessionFactory sessionFactory;
@Override
public Session getSession()
{
Session session= null;
try
{
logger.debug(" ++++ getSession try ++++ ");
session= sessionFactory.getCurrentSession();
}catch(Exception ex)
{
logger.debug(" ++++ getSession catch ++++ ", ex);
session= sessionFactory.openSession();
}
return session;
}
@Override
public Class<MyDBTable> getDefaultMappedObject()
{ return MyDBTable.class; }
}
LocalHibernateConfig Конфигурация класса и класс, имеющий основной метод:
@Configuration
@PropertySource(value= {"classpath:hibernate.properties"}, ignoreResourceNotFound= true)
@EnableTransactionManagement
@ComponentScan
@Component(value= "LocalHibernateConfig")
public class LocalHibernateConfig
{
public static void main(String[] args) throws Exception
{
AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
// context.getEnvironment().setActiveProfiles("local");
context.register(LocalHibernateConfig.class);
context.refresh();
LocalHibernateConfig lch= context.getBean(LocalHibernateConfig.class);
logger.debug(" ++++ Properties is null "+(lch.properties==null)+" properties: "+lch.getProperties());
CriteriaQuerySampleDao dao= context.getBean(CriteriaQuerySampleDao.class);
// GenericDao dao= context.getBean(GenericDao.class);
logger.debug(" ++++ dao: "+(dao==null));
}
}