自动装配在Spring中如何工作?
关于控制反转( IoC
)在Spring
如何工作,我有点困惑。
假设我有一个名为UserServiceImpl
的服务类实现了UserService
接口。
这将是@Autowired
?
在我的Controllers
操作中,我将如何instantiate
此服务的一个instance
?
我会做下面的事吗?
UserService userService = new UserServiceImpl();
首先,也是最重要的 - 所有Spring bean都被管理 - 它们“活在”一个容器内,称为“应用程序上下文”。
其次,每个应用程序都有一个进入该上下文的入口点。 Web应用程序有一个Servlet,JSF使用el解析器等。此外,还有一个应用程序上下文被引导的位置,所有的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>
以便<context:component-scan>
类的@Controller
, @Service
@Controller
等注释。 UserServiceImpl
也应该定义为bean - 使用<bean id=".." class="..">
或使用@Service
注释。 由于它将是UserService
的唯一实现者,因此它将被注入。 @Autowired
注释之外,Spring还可以使用XML配置的自动装配。 在这种情况下,具有与现有bean相匹配的名称或类型的所有字段自动获取注入的bean。 实际上,这是自动装配的最初想法 - 使用没有任何配置的依赖注入字段。 其他注释(如@ @Inject
, @Resource
也可以使用。 取决于您是去注释路线还是bean XML定义路线。
假设你的applicationContext.xml
定义了bean:
<beans ...>
<bean id="userService" class="com.foo.UserServiceImpl"/>
<bean id="fooController" class="com.foo.FooController"/>
</beans>
自动装配在应用程序启动时发生。 因此,在fooController
,为了参数的fooController
,它想要使用UserServiceImpl
类,您可以按照以下方式对其进行注释:
public class FooController {
// You could also annotate the setUserService method instead of this
@Autowired
private UserService userService;
// rest of class goes here
}
当它看到@Autowired
,Spring将查找与applicationContext中的属性相匹配的类,并自动注入它。 如果您拥有多个UserService bean,那么您必须限定它应该使用哪一个。
如果您执行以下操作:
UserService service = new UserServiceImpl();
除非您自己设置,否则它不会接收@Autowired。
@Autowired
是Spring 2.5中引入的一个注释,它仅用于注入。
例如:
class A {
private int id;
// With setter and getter method
}
class B {
private String name;
@Autowired // Here we are injecting instance of Class A into class B so that you can use 'a' for accessing A's instance variables and methods.
A a;
// With setter and getter method
public void showDetail() {
System.out.println("Value of id form A class" + a.getId(););
}
}
链接地址: http://www.djcxy.com/p/62809.html
上一篇: How does autowiring work in Spring?
下一篇: How does Spring 3 expression language interact with property placeholders?