Spring中的自动装配是如何工作的?

2024-02-05

我有点困惑如何控制反转 http://en.wikipedia.org/wiki/Inversion_of_control (IoC)工作于Spring.

假设我有一个名为的服务类UserServiceImpl实现UserService界面。

这会怎样@Autowired?

而在我的Controllers,我会怎样instantiate an instance这项服务的?

我会做以下事情吗?

UserService userService = new UserServiceImpl();

首先,也是最重要的 - 所有 Spring bean 都是受管理的 - 它们“生活”在一个称为“应用程序上下文”的容器内。

其次,每个应用程序都有一个该上下文的入口点。 Web应用程序有一个Servlet,JSF http://en.wikipedia.org/wiki/JavaServer_Faces使用 el-resolver 等。此外,还有一个地方可以引导应用程序上下文并自动连接所有 bean。在 Web 应用程序中,这可以是启动侦听器。

自动装配是通过将一个 Bean 的实例放入另一 Bean 实例的所需字段中来实现的。这两个类都应该是 bean,即它们应该被定义为存在于应用程序上下文中。

在应用程序环境中什么是“活着”?这意味着context实例化对象,而不是你。 IE。 -你永远不会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);

    }
}

一些注意事项:

  • In your applicationContext.xml你应该启用<context:component-scan>这样就可以扫描类@Controller, @Service等注释。
  • Spring-MVC 应用程序的入口点是 DispatcherServlet,但它对您来说是隐藏的,因此应用程序上下文的直接交互和引导发生在幕后。
  • UserServiceImpl也应该被定义为 bean - 或者使用<bean id=".." class="..">或使用@Service注解。因为它将是唯一的实施者UserService,它将被注入。
  • 除了@Autowired注解,Spring可以使用XML可配置的自动装配。在这种情况下,所有具有与现有 bean 匹配的名称或类型的字段都会自动注入一个 bean。事实上,这就是自动装配的最初想法——在不进行任何配置的情况下向字段注入依赖项。其他注释如@Inject, @Resource也可以使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中的自动装配是如何工作的? 的相关文章

随机推荐

  • C++ 私有函数真的需要放在头文件中吗?

    我一直认为头文件是一种描述类的 公共接口 在这种情况下 最好将私有字段和函数保留在 cpp 文件中 我知道私有字段需要位于标头中 以便其他类可以知道类的实例将消耗多少内存 但当我即将编写一个私有辅助函数时 我想到可以使该函数成为static
  • 如何防止用户通过写URL直接访问我的html页面?

    我想要一个硬编码的登录页面 登录 html 没有数据库 如果一个人写了正确的用户名和密码 它会重定向到 page2 html 现在我的问题是 如果一个人直接为 page2 html 编写 URL 他将能够访问它 而无需任何登录 理想案例 g
  • 对 JPanel 使用 addMouseListener() 和 PaintComponent()

    这是我的后续previous https stackoverflow com questions 12175174 paintcomponent vs paint and jpanel vs canvas in a paintbrush t
  • Realm 的 kotlin 中的 Android 测试

    如何在 Kotlin 中实现 Android 中领域数据库的简单测试 我尝试改编来自java领域的片段在github上测试 https github com realm realm java blob master examples uni
  • 有没有跨平台的方法来检查 stdout 是否正在通过管道传输到 Rust 中的另一个程序?

    当输出通过管道传输到终端以外的其他地方时 我想禁用颜色 翻译成 POSIX 语言 你的问题将是 stdout 不是 TTY 所以 nix 上的答案可以通过以下方式获得 isatty STDOUT FILENO https stackover
  • 禁止来自 3rd 方 jar 的 java util 日志记录

    我从 Eclipse 控制台中的第 3 方 jar 收到大量信息日志消息 打开 jar 我发现它使用 java util logging 我想将其 jar 的输出级别设置为 警告 我尝试使用 Djava util logging confi
  • JavaFX 会完全取代 Swing 吗?

    我有一个 Java 桌面应用程序 其中图形用户界面是在 swing 中设计的 当我们知道之后JavaFX replacing Swing我们已将图形用户界面替换为 JavaFX 6 JavaFX 是否会取代 Swing 成为 Java 的新
  • 如何在 Nest.js 中提供静态 HTML 文件?

    我想提供静态 HTML 文件 这些文件位于 distNest 项目外部的文件夹 index html加载成功但无法加载任何 JS 文件 404 error 我有一个 Node Express js 项目 它使用 app use expres
  • 在java中获取下一个更高的整数值[重复]

    这个问题在这里已经有答案了 我知道我可以使用 Math java 函数来获取 double 或 float 的下限 上限或舍入值 但我的问题是 如果小数点出现在我的值中 是否可以始终获得更高的整数值 例如 int chunkSize 91
  • silverstripe Sitetree onAfterWrite - renderWith 错误:找不到模板

    为了从页面内容自动生成 pdf 我想在页面类的 onAfterWrite 中使用 renderWith 函数 稍后使用 DOMPDF 将从返回的 HTML 生成 PDF public function onAfterWrite parent
  • 将 UISearchBar 锁定到 UITableView(如 Game Center)的顶部

    Game Center 的 UITableViews 及其顶部的搜索栏有一个很酷的功能 与搜索栏放置在表格标题视图中的应用程序不同 因此它算作标准表格单元格 相反 它似乎固定在其上方的父导航栏上 因此 当滚动表格时 搜索栏确实会移动 但如果
  • 简单堆栈溢出的 Shellcode:带有 shell 的被利用程序在 execve("/bin/sh") 之后直接终止

    我在 Linux amd64 上尝试了缓冲区溢出并尝试利用一个简单的程序 但失败了 我禁用了安全功能 使用 sysctl w kernel randomize va space 0 和 BIOS 中的 nx 位进行地址空间布局随机化 它跳转
  • 带有过滤器参数的 django 自定义管理器

    我想添加一个自定义管理器 它可以从模板调用 但不会影响整个模型 例如管理视图 并且侦听请求中设置的参数 user profile 以下是我到目前为止所拥有的 模型 py class CurrentQuerySet models query
  • 与 crond 不同的 ssh 行为

    我已经在这件事上抓狂了好几个小时了 我欢迎任何有关下一步发展的新想法 目标是通过 SSH 登录到自定义应用程序 CLI 然后使用自定义 CLI 命令之一在远端设备上下拉调试 shell 在客户端 我使用 CentOS mini 并运行 ss
  • 单选按钮的按钮组未使用 Bootstrap 3 设置任何活动按钮

    我正在尝试使用 MVC 和 Bootstrap 3 创建一组漂亮的单选按钮 选择一个选项后 我将值存储在数据库中 但是当我再次呈现视图时 没有选择任何内容 模型是 Table QuotePiecePrinting public partia
  • Mercurial - 如何禁用推送

    我正在尝试寻找是否有一种简单的方法可以使 Mercurial 存储库变为只读 用户应该能够克隆 但不允许推送 我需要对超过 100 个的所有存储库执行此操作 你可以在 hg hgrc 中这样做 hooks prechangegroup fa
  • 默认将没有扩展名的文件分配给 VS Code 上的语言

    在 VS Code 中 我通常打开没有扩展名的文件filename 我知道我可以更改语言语法更改语言模式 gt 我想要的语言但我不想每次打开这样的文件时都手动执行此操作 每次打开没有扩展名的文件时是否可以默认使用该语言 我知道我可以这样做
  • 如何使用curl从pod内访问Kubernetes API?

    我在 Google Kubernetes Engine 上使用 Kubernetes 1 8 6 并有一个运行 Alpine 的 Pod 作为StatefulSet 我已使用以下方式登录我的 podkubectl exec it my po
  • C++ 有非模板元语言吗?

    我正在阅读 boost MPL 作者的 c 模板元编程 一书 我是 Spirit phoenix 库的忠实粉丝 不过我想知道 使用模板进行 C 元编程很麻烦 它不是为这种用途而设计的 模板和宏都不支持循环 在模板中 您基本上必须经历递归 据
  • Spring中的自动装配是如何工作的?

    我有点困惑如何控制反转 http en wikipedia org wiki Inversion of control IoC 工作于Spring 假设我有一个名为的服务类UserServiceImpl实现UserService界面 这会怎