2016-01-08 3 views
0

Я столкнулся с проблемой, описанной в this question, которую я уже разрешил, добавив @Autowired аннотацию к конструктору. Теперь я удивляюсь, почему это помогло. Что разница междуВпрыск зависимостей пружинных конструкторов - без против.

public RegistrationController(UserDao userDao) { 
    this.userDao = userDao; 
} 

и

@Autowired 
public RegistrationController(UserDao userDao) { 
    this.userDao = userDao; 
} 

В обоих случаях userDao вводится в контроллер. Единственное различие, которое я обнаружил, заключается в том, что entityManager, помеченный аннотацией @persistenceContext, вводится в userDao только во втором примере. Но я не знаю почему. Любые подсказки? И есть ли другие различия?

EDIT: мой контекст сервлета выглядит следующим образом:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <!-- 
    Adds some default beans (HandlerAdapter, HandlerMapping, Binding Initializer...). It also turn on some annotations. 
    Explanation in https://stackoverflow.com/questions/28851306/spring-framework-what-is-the-purpose-of-mvcannotation-driven 

    WITHOUT THIS, @RequestMapping ANNOTATIONS ARE LOADED, BUT MAPPING DO NOT WORK!! 
    --> 
    <mvc:annotation-driven /> 

<!-- Set loading annotations from classes 
    <context:component-scan base-package="com.fido.pia"/>--> 

    <!--manual homepage--> 
    <mvc:view-controller path="/" view-name="home"/> 

    <!--view resolver--> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/view/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <!--static resources - request will be handeled by ResourceHttpRequestHandler--> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 

    <!--database config--> 
    <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/pia" /> 
     <property name="username" value="root" /> 
     <property name="password" value="" /> 
    </bean> 

    <!--entity manager factory--> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="packagesToScan" value="com.fido.pia.*/**" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <!--<property name="generateDdl" value="true" />--> 
       <property name="showSql" value="true" /> 
      </bean> 
     </property> 
    </bean> 

    <!-- Transactions --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <!-- enable the configuration of transactional behavior based on annotations --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <!--Set loading annotations from classes--> 
    <context:component-scan base-package="com.fido.pia"/> 
</beans> 

Edit 2: Контроллер:

package com.fido.pia; 

import com.fido.pia.dao.UserDao; 
import com.fido.pia.model.User; 
import java.io.IOException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/register") 
public class RegistrationController { 

    private UserDao userDao; 

    @Autowired 
    public RegistrationController(UserDao userDao) { 
     this.userDao = userDao; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    @Transactional 
    public void registrationSubmit(HttpServletRequest request, HttpServletResponse response) 
      throws IOException{ 
     String username = request.getParameter("first_name"); 

     userDao.save(new User("test")); 

     response.sendRedirect("/"); 
    } 
} 

Dao:

package com.fido.pia.dao; 

import com.fido.pia.model.User; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Repository; 


@Repository 
public class UserDao { 

    @PersistenceContext 
    protected EntityManager entityManager; 

    public User save(User row) { 
     if(row.isNew()) { 
      entityManager.persist(row); 
      return row; 
     } else { 
      return entityManager.merge(row); 
     } 
    } 
} 
+0

Это не то, что я имел в виду контекста (плохое использование, извините). Отправьте сообщение [MCVE], которое продемонстрирует ваше замешательство. –

+0

Извините, теперь я добавил контроллер и код dao. Думаю, теперь он должен быть полным, но я могу добавить дополнительную информацию, если это уместно. – Fido

+0

'@ Autowired' выставит компонент, который вы ввели в свой« контекст приложения » – msagala25

ответ

-4

Существуют две формы для инъекций наиболее использование объектов!

- First 
    @Autowired, 
- Second in constructor 
@Autowired 
constructor(Object object) 
- other 
@Autowired 
setObjectMehod(Object object) 

Когда интерфейс реализован в течение более чем двух объектов, необходимо, чтобы квалифицировать объект, подлежащий включению.

Всегда каждый объект, который должен быть введен в компоненте, наиболее распространенной @Repository, @Services, @Controller и @Component каждый с его надлежащим объемом.

Инъекция имеет ту же цель только разные способы и потребность, необходимый объект

+1

Это очень сложно понять. Если вы не владеете английским языком, попросите кого-нибудь просмотреть ваши сообщения. –

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