自动装配在春季如何工作?

问题:

inversion of controlIoC)在Spring中的工作有点困惑
 说我有一个叫做服务类
这将是@Autowired
在我的Controllers行动中,我如何instantiate instance这项服务?
我会做以下吗?

UserService userService = new UserServiceImpl();

回答:

首先,最重要的是 – 所有的Spring bean都被管理 – 它们“存在”在一个容器内,称为“应用程序上下文”。
第二,每个应用程序都有一个入口点。 Web应用程序有一个Servlet,JSF使用el-resolver等。此外,还有一个应用程序上下文被引导并且所有bean – 自动连线的地方。在Web应用程序中,这可以是启动侦听器。
通过将一个bean的实例放在另一个bean的实例中的所需字段中来实现自动装配。这两个类都应该是bean,即它们应被定义为生活在应用程序上下文中。
什么是“生活”的应用程序上下文?这意味着上下文instantiates对象,而不是你。即 – 你永远不会new UserServiceImpl() – 容器找到每个注入点并在那里设置一个实例。
在您的控制器中,您只需具备以下功能:

@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {

    // Tells the application context to inject an instance of UserService here
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(@RequestParam("username") String username,
           @RequestParam("password") String password) {

        // The UserServiceImpl is already injected and you can use it
        userService.login(username, password);

    }
}

几个注释:

  • applicationContext.xml中,您应该启用<context:component-scan>,以扫描类别为@Controller@Service等注释。
  • Spring-MVC应用程序的入口点是DispatcherServlet,但它隐藏在您的身上,因此应用程序上下文的直接交互和引导发生在场景后面。
  •  UserServiceImpl也应该被定义为bean – 使用<bean id=".." class="..">或使用@Service注释。由于它将是UserService的唯一实施者,因此将被注入。
  • 除了@Autowired注释,Spring可以使用XML可配置的自动装配。在这种情况下,具有与现有bean匹配的名称或类型的所有字段将自动获取注入的bean。事实上,这是自动装配的初始想法 – 将场注入依赖关系而无需任何配置。也可以使用其他注释,如@Inject@Resource

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How does autowiring work in Spring?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

37 − = 29