我有点困惑如何控制反转 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(使用前将#替换为@)