自动装配在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等注释。
  • Spring-MVC应用程序的入口点是DispatcherServlet,但它对您来说是隐藏的,因此应用程序上下文的直接交互和引导发生在场景后面。
  • 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?