title: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency
body: <p>I am newbie to Spring framework. I am trying to learn it. But I have all the time the same problem with Ioc. I cant correctly implement it. Please help.</p>
  
  <p>I have problem with @Autowiring classes. Error stack:</p>
  
  <pre><code>cze 27, 2014 12:03:56 PM org.springframework.web.context.ContextLoader initWebApplicationContext
  SEVERE: Context initialization failed
  
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sprhib.dao.UserDao com.sprhib.controller.UserController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4959)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:634)
      at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:671)
      at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1840)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
      at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      at java.lang.Thread.run(Thread.java:744)
  Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sprhib.dao.UserDao com.sprhib.controller.UserController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
      at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
      ... 26 more
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
      ... 28 more
  
  cze 27, 2014 12:03:56 PM org.apache.catalina.core.StandardContext listenerStart
  SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sprhib.dao.UserDao com.sprhib.controller.UserController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4959)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5455)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:634)
      at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:671)
      at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1840)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
      at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      at java.lang.Thread.run(Thread.java:744)
  Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sprhib.dao.UserDao com.sprhib.controller.UserController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
      at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
      ... 26 more
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.sprhib.dao.UserDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
      at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
      ... 28 more
  
  cze 27, 2014 12:03:56 PM org.apache.catalina.core.StandardContext startInternal
  SEVERE: Error listenerStart
  cze 27, 2014 12:03:56 PM org.apache.catalina.core.StandardContext startInternal
  SEVERE: Context [/spr-mvc-hib] startup failed due to previous errors
  cze 27, 2014 12:03:56 PM org.apache.catalina.core.ApplicationContext log
  INFO: Closing Spring root WebApplicationContext
  cze 27, 2014 12:03:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
  SEVERE: The web application [/spr-mvc-hib] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
  cze 27, 2014 12:03:56 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
  SEVERE: The web application [/spr-mvc-hib] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
  cze 27, 2014 12:03:56 PM org.apache.catalina.startup.HostConfig deployDirectory
  INFO: Deploying web application directory C:\Program Files\spring_ide_64\vfabric-tc-server-developer-2.9.5.SR1\base-instance\webapps\manager
  cze 27, 2014 12:03:56 PM org.apache.catalina.startup.HostConfig deployDirectory
  INFO: Deploying web application directory C:\Program Files\spring_ide_64\vfabric-tc-server-developer-2.9.5.SR1\base-instance\webapps\ROOT
  cze 27, 2014 12:03:56 PM org.apache.coyote.AbstractProtocol start
  INFO: Starting ProtocolHandler ["http-bio-8080"]
  cze 27, 2014 12:03:56 PM org.apache.catalina.startup.Catalina start
  INFO: Server startup in 3776 ms
  </code></pre>
  
  <p>I've based my application on com.sprhib application tutorial.
  You can find it here:
  <a href="http://fruzenshtein.com/spring-mvc-hibernate-maven-crud/" rel="nofollow">http://fruzenshtein.com/spring-mvc-hibernate-maven-crud/</a></p>
  
  <p>My UserController class</p>
  
  <pre><code>package com.sprhib.controller;
  
  import java.util.List;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Controller;
  import org.springframework.web.bind.annotation.ModelAttribute;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RequestMethod;
  import org.springframework.web.servlet.ModelAndView;
  
  import com.sprhib.dao.UserDao;
  import com.sprhib.model.User;
  
  @Controller
  @RequestMapping(value="/user")
  public class UserController {
  
      @Autowired
      private UserDao userDao;
  
      @RequestMapping(value="/add", method=RequestMethod.GET)
      public ModelAndView addUserPage() {
          ModelAndView modelAndView = new ModelAndView("add-user-form");
          modelAndView.addObject("User", new User());
          return modelAndView;
      }
  
      @RequestMapping(value="/add", method=RequestMethod.POST)
      public ModelAndView addingUser(@ModelAttribute User User) {
  
          ModelAndView modelAndView = new ModelAndView("home");
          userDao.addUser(User);
  
          String message = "User was successfully added.";
          modelAndView.addObject("message", message);
  
          return modelAndView;
      }
  
      @RequestMapping(value="/list")
      public ModelAndView listOfUsers() {
          ModelAndView modelAndView = new ModelAndView("list-of-users");
  
          List&lt;User&gt; Users = userDao.getUsers();
          modelAndView.addObject("Users", Users);
  
          return modelAndView;
      }
  
      @RequestMapping(value="/edit/{id}", method=RequestMethod.GET)
      public ModelAndView editUserPage(@PathVariable Integer id) {
          ModelAndView modelAndView = new ModelAndView("edit-user-form");
          User User = userDao.getUser(id);
          modelAndView.addObject("User",User);
          return modelAndView;
      }
  
      @RequestMapping(value="/edit/{id}", method=RequestMethod.PUT)
      public ModelAndView edditingUser(@ModelAttribute User User, @PathVariable Integer id) {
  
          ModelAndView modelAndView = new ModelAndView("home");
  
          userDao.updateUser(User);
  
          String message = "User was successfully edited.";
          modelAndView.addObject("message", message);
  
          return modelAndView;
      }
  
      @RequestMapping(value="/delete/{id}", method=RequestMethod.DELETE)
      public ModelAndView deleteUser(@PathVariable Integer id) {
          ModelAndView modelAndView = new ModelAndView("home");
          userDao.deleteUser(id);
          String message = "User was successfully deleted.";
          modelAndView.addObject("message", message);
          return modelAndView;
      }
  }
  </code></pre>
  
  <p>My User model class:</p>
  
  <pre><code>package com.sprhib.model;
  
  import java.util.Date;
  import java.util.List;
  
  import javax.persistence.Entity;
  import javax.persistence.FetchType;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
  import javax.persistence.OneToMany;
  import javax.persistence.Temporal;
  import javax.persistence.TemporalType;
  import javax.persistence.Transient;
  
  @Entity
  public class User {
      @Id
      @GeneratedValue
      Long id;
      String email;
      String lastName;
      String firstName;
  //  @OneToMany(fetch=FetchType.LAZY)
  //  List&lt;Address&gt; address;
      String password;
      @Transient
      String repeatPassword;
      @Temporal(TemporalType.TIMESTAMP)
      Date creationDate;
      @Temporal(TemporalType.TIMESTAMP)
      Date updateDate;
      boolean active;
  
      public Long getId() {
          return id;
      }
      public void setId(Long id) {
          this.id = id;
      }
      public String getEmail() {
          return email;
      }
      public void setEmail(String email) {
          this.email = email;
      }
      public String getLastName() {
          return lastName;
      }
      public void setLastName(String lastName) {
          this.lastName = lastName;
      }
      public String getFirstName() {
          return firstName;
      }
      public void setFirstName(String firstName) {
          this.firstName = firstName;
      }
  //  public List&lt;Address&gt; getAddress() {
  //      return address;
  //  }
  //  public void setAddress(List&lt;Address&gt; address) {
  //      this.address = address;
  //  }
      public String getPassword() {
          return password;
      }
      public void setPassword(String password) {
          this.password = password;
      }
      public String getRepeatPassword() {
          return repeatPassword;
      }
      public void setRepeatPassword(String repeatPassword) {
          this.repeatPassword = repeatPassword;
      }
      public Date getCreationDate() {
          return creationDate;
      }
      public void setCreationDate(Date creationDate) {
          this.creationDate = creationDate;
      }
      public Date getUpdateDate() {
          return updateDate;
      }
      public void setUpdateDate(Date updateDate) {
          this.updateDate = updateDate;
      }
      public boolean isActive() {
          return active;
      }
      public void setActive(boolean active) {
          this.active = active;
      }
  
  }
  </code></pre>
  
  <p>My UserDao interface:</p>
  
  <pre><code>package com.sprhib.dao;
  
  import java.util.List;
  
  import com.sprhib.model.User;
  
  public interface UserDao {
      public void addUser(User user);
      public void updateUser(User user);
      public void deleteUser(long id);
      public User getUser(long id);
      public List&lt;User&gt; getUsers();
  }
  </code></pre>
  
  <p>My UserDao interface implemantation class</p>
  
  <pre><code>package com.sprhib.dao;
  
  import java.util.List;
  
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;
  import org.springframework.beans.factory.annotation.Autowired;
  
  import com.sprhib.model.User;
  
  public class UserDaoImpl implements UserDao {
      @Autowired
      private SessionFactory sessionFactory;
      private Session getCurrentSession() {
          return sessionFactory.getCurrentSession();
      }
      @Override
      public void addUser(User user) {
          getCurrentSession().save(user);
      }
      @Override
      public void updateUser(User user) {
          User toUpdate = getUser(user.getId());
          toUpdate.setLastName(user.getLastName());
          toUpdate.setFirstName(user.getFirstName());
          toUpdate.setEmail(user.getEmail());
          getCurrentSession().update(toUpdate);
      }
      @Override
      public User getUser(long id) {
          User user = (User) getCurrentSession().get(User.class, id);
          return user;    }
      @Override
      public void deleteUser(long id) {
          User user = getUser(id);
          if (user != null)
          getCurrentSession().delete(user);
      }
      @SuppressWarnings("unchecked")
      @Override
      public List&lt;User&gt; getUsers() {
          return getCurrentSession().createQuery("from User").list();
      }
  
  }
  </code></pre>
  
  <p>web.xml file is empty  cause I use JavaConfig class approach</p>
  
  <p>My configuration is:</p>
  
  <pre><code>package com.sprhib.init;
  
  import javax.servlet.ServletContext;
  import javax.servlet.ServletException;
  import javax.servlet.ServletRegistration.Dynamic;
  
  import org.springframework.web.WebApplicationInitializer;
  import org.springframework.web.context.ContextLoaderListener;
  import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  import org.springframework.web.filter.HiddenHttpMethodFilter;
  import org.springframework.web.servlet.DispatcherServlet;
  
  public class Initializer implements WebApplicationInitializer {
  
      public void onStartup(ServletContext servletContext) throws ServletException {
          AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
          ctx.register(WebAppConfig.class);
          servletContext.addListener(new ContextLoaderListener(ctx));
  
          ctx.setServletContext(servletContext);
  
          Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
          servlet.addMapping("/");
          servlet.setLoadOnStartup(1);
          // Allow to use Put and Delete method for REST architecture
          registerHiddenFieldFilter(servletContext);
      }
  
      private void registerHiddenFieldFilter(ServletContext aContext) {
          aContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*"); 
      }
  }
  </code></pre>
  
  <p>and:</p>
  
  <pre><code>package com.sprhib.init;
  
  import java.util.Properties;
  
  import javax.annotation.Resource;
  import javax.sql.DataSource;
  
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.PropertySource;
  import org.springframework.core.env.Environment;
  import org.springframework.jdbc.datasource.DriverManagerDataSource;
  import org.springframework.orm.hibernate4.HibernateTransactionManager;
  import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
  import org.springframework.transaction.annotation.EnableTransactionManagement;
  import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  import org.springframework.web.servlet.view.JstlView;
  import org.springframework.web.servlet.view.UrlBasedViewResolver;
  
  @Configuration
  @ComponentScan("com.sprhib")
  @EnableWebMvc
  @EnableTransactionManagement
  @PropertySource("classpath:application.properties")
  public class WebAppConfig {
  
      private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
      private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
      private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
      private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
  
      private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
      private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
      private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
      private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
  
      @Resource
      private Environment env;
  
      @Bean
      public DataSource dataSource() {
          DriverManagerDataSource dataSource = new DriverManagerDataSource();
  
          dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
          dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
          dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
          dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
  
          return dataSource;
      }
  
      @Bean
      public LocalSessionFactoryBean sessionFactory() {
          LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
          sessionFactoryBean.setDataSource(dataSource());
          sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
          sessionFactoryBean.setHibernateProperties(hibProperties());
          return sessionFactoryBean;
      }
  
      private Properties hibProperties() {
          Properties properties = new Properties();
          properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
          properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
          properties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
          return properties;  
      }
  
      @Bean
      public HibernateTransactionManager transactionManager() {
          HibernateTransactionManager transactionManager = new HibernateTransactionManager();
          transactionManager.setSessionFactory(sessionFactory().getObject());
          return transactionManager;
      }
  
      @Bean
      public UrlBasedViewResolver setupViewResolver() {
          UrlBasedViewResolver resolver = new UrlBasedViewResolver();
          resolver.setPrefix("/WEB-INF/pages/");
          resolver.setSuffix(".jsp");
          resolver.setViewClass(JstlView.class);
          return resolver;
      }
  
  }
  </code></pre>