Spring构造函数dependency injection – 有和没有自动assembly

我遇到了这个问题中描述的问题 ,我已经通过将@Autowired注释添加到构造函数来解决了这个问题 。 现在我想知道,为什么它有所帮助。 有什么区别

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

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

在这两种情况下,userDao都会注入Controller。 我发现的唯一区别是,使用@persistenceContext注释标记的entityManager仅在第二个示例中注入userDao。 但我不知道为什么。 有什么线索吗? 还有其他差异吗?

编辑:我的servlet上下文如下所示:

    <!-- Set loading annotations from classes -->                       <!---->              

编辑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("/"); } } 

道:

 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); } } } 

存在两种注射forms大多数使用对象!

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

当为两个以上的对象实现接口时 ,必须限定要插入的对象。

始终将每个要注入组件的对象 ,最常见的@Repository,@ Services,@ Controller和@Component各自具有适当的范围。

注射具有相同的目的只是对象所需的不同方式和需求