当前位置: 首页 > 面试题库 >

Spring的自动布线如何工作?

王涵育
2023-03-14
问题内容

我对control(IoC)的反转如何在Spring。

假设我有一个称为服务的类UserServiceImpl,它实现了UserService接口。

怎么会这样@Autowired

而在我Controllers,我怎么会instantiateinstance这个服务的?

我会做以下事情吗?

UserService userService = new UserServiceImpl();


问题答案:

首先,也是最重要的一点-所有Spring Bean都受到管理-它们“实时”存在于称为“应用程序上下文”的容器中。

其次,每个应用程序都有一个指向该上下文的入口。Web应用程序具有Servlet,JSF使用el-resolver等。此外,在某个地方可以引导应用程序上下文,并且所有bean都可以自动连接。在Web应用程序中,它可以是启动侦听器。

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

应用程序上下文中的“生存”是什么?这意味着上下文会实例化对象,而不是你。即-你永远不会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也可以使用。


 类似资料:
  • 在使用Spring AOP之前,我有一个这样的工作代码: 在哪里 在哪里 我的城市财产编辑自动接线工作正常。但是在为所有方法添加Spring AOP切入点之后: 城市地产编辑器的自动连接崩溃。事实上,bean不再属于CityProperty tyEditor类,而是简单地属性编辑器: 因此,我不得不将类从CityPropertyEditor更改为PropertyEditor,作为一种解决方法。有趣

  • 我使用spring已经有一段时间了,但是今天早上我遇到了一些意想不到的行为。由于我自己无法决定这是一个理想的功能还是一个bug,所以我在这里展示它,希望我能得到一些关于为什么会发生这种情况的好解释。 简而言之,我在一个应用程序上下文中定义了多个bean,并且我使用utils创建了两个map bean:map name space,只将我的bean的一部分添加到这些map中。这两个地图有完全相同的条

  • 我有一个 xml 豆文件 我有像这样使用构造函数自动装配 自动布线工作正常。 现在我想把我的beans移到配置类中。但是如何移动代码以使自动布线工作呢? 我已经试过了,但是不起作用

  • 与属性自动装配相比,构造函数自动装配有什么特殊的优势吗……或者普通的优势。?优于迫使团队在Spring启动中使用构造函数自动装配……它有什么特殊的优势吗?两种类型的自动装配的优缺点

  • 问题内容: 我有一个通过调用构造函数实例化的类(Class ABC)。ABC类又具有通过自动接线注入的辅助类(XYZ类)。 我们的是基于Spring MVC的应用程序,在服务器启动时我看不到任何异常。 但是我仍然看到XYZ类为空。是否是因为Spring Container没有实例化ABC类? 在这种情况下,如何使用自动接线? 谢谢。 问题答案: 你可以使用这种方式在非spring bean类中使用

  • 我有个小问题。这可能微不足道,但我以前从未面对过。 我有一个通用接口和它的通用实现。我想自动连线,但发生了错误。以下是详细情况: 接口 实施 自动布线尝试 错误 我想让它尽可能简单。我已经检查了网络,但是我只发现了在配置中定义我的确切bean。如果可能的话,我更喜欢避免它。