自动装配和对象创建有什么区别?

时间:2015-11-12 07:47:08

标签: java spring-mvc autowired

有什么区别,如果我自动化一个类并提供值并实例化一个类的对象并提供一些值? 例如 -

@Autowired
private UserService userService;
userService.findUser(userName, password);

User user = new user();
userService.findUser(user.getuserName(),user.getpassword());

自动装配和发送数据以及实例化对象和将数据发送到某个服务类有什么区别?

我试图在春天澄清这些概念。

4 个答案:

答案 0 :(得分:1)

你的榜样没有多大意义;这个User类看起来像一些普通数据对象,不会向第二个片段添加任何内容。

" autowiring"是某些类,如可能是Web控制器,需要UserService才能完成其工作。当Spring自动装配UserService时,它进入上下文并找到匹配的对象并将其提供给需要它的类。这在技术上与创建对象是分开的。

尽管如此,最佳做法是使用构造函数注入 - 只需将所需的其他对象声明为构造函数参数,并使用@Autowired(或@Inject注释构造函数)。 Spring将知道查找所需的所有依赖项并使用它们调用构造函数。这意味着提供这些对象的模拟以进行测试或开发也非常简单。

答案 1 :(得分:1)

当您使用@Autowired时,您将其留给Spring框架来查找并实例化userService。这通常通过一些配置文件或其他配置来控制,这允许您在不更改代码本身的情况下更改应用程序的行为。

另一方面,当您自己实例化对象时,您将指定您所关注的对象以及所需的类类型。由于知道正在初始化什么类型的对象,因此 可以为您留下不那么模糊的代码,但是为了更改应用程序的行为,您需要更改代码。

本质上,第一个选项是 less coupled 而不是第二个选项,通常推荐的构建方式。

答案 2 :(得分:0)

嗯,主要区别在于,如果您使用@Autowired,也会创建对象,但是,它是由容器和容器创建的,决定何时执行此操作。 我想给你一个简单的例子: 你有四个1,2,3和4类。其中三个(1,2,3)使用第四个。因此,如果你使用new(),很难决定在第4类创建对象的位置(在1级,2级或3级,甚至每种类型中)。此外,稍后您可以删除具有对象初始化的类,而其他2个类将无法工作(如果您创建了一个对象)。自动注释会注入对象但不会在类中初始化对象,因此不会出现任何问题 这就像最简单的答案。

答案 3 :(得分:0)

上面的答案很好,我想说出它们之间的一个主要区别。自动装配的目的是避免类之间的依赖关系 如果您使用new创建对象,则对一个类进行更改将影响所有类。