Spring的自动布线如何工作?
我对control(IoC)
的反转如何在Spring。
假设我有一个称为服务的类UserServiceImpl
,它实现了UserService
接口。
怎么会这样@Autowired
?
而在我Controllers
,我怎么会instantiate
在instance
这个服务的?
我会做以下事情吗?
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的自动布线如何工作? 的全部内容, 来源链接: utcz.com/qa/419149.html