Spring MVC autowiring和object creation有什么区别?

72qzrwbm  于 2023-10-24  发布在  Spring
关注(0)|答案(5)|浏览(126)

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

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

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

自动装配和发送数据与示例化对象并将数据发送到某个服务类有什么区别?
我想在Spring里澄清概念。

sbtkgmzw

sbtkgmzw1#

当您使用@Autowired时,您将由Spring框架来查找和示例化userService。这通常通过一些配置文件或其他配置来控制,这允许您更改应用程序的行为,而无需更改代码本身。
另一方面,当你自己示例化一个对象时,你指定了你想要的对象和你想要的类的类型。这可能会让你的代码变得不那么模糊,因为你知道初始化的对象是什么类型的,但是要改变你的应用程序的行为,你需要改变你的代码。
从本质上讲,第一种选择比第二种选择耦合性更低,而第二种选择通常是推荐的构建方式。

92vpleto

92vpleto2#

您的示例没有太大意义;这个User类看起来像一些普通的数据对象,它没有向第二个代码片段添加任何内容。
“autowiring”的想法是,一些类,比如Web控制器,将需要一个UserService来完成其工作。当Spring autowire UserService时,它进入上下文并找到匹配的对象并将其提供给需要它的类。这在技术上与创建对象是分开的。
也就是说,最好的做法是使用 constructor injection--简单地声明你需要的其他对象作为构造函数参数,并用@Autowired(或@Inject)注解构造函数。Spring会知道查找你需要的所有依赖项,并用它们调用构造函数。这意味着提供这些对象的mock用于测试或开发也非常简单。

7lrncoxx

7lrncoxx3#

好吧,主要的区别是,如果你使用@Autowired,对象也会被创建,但是,它是由容器创建的,容器决定何时这样做。我想给予你一个简单的例子:你有四个类1,2,3,4。其中三个(1,2,3)使用第4个。所以,如果你使用new(),很难决定在哪里创建对象(在类1,或2,或3,甚至在每一个)的第四类。此外,以后你可以删除类与对象初始化和其他2类将无法工作(如果你创建一个对象)。Autowired注解注入对象,但你不初始化类中的对象,所以没有问题出现这是最简单的答案。

zaqlnxep

zaqlnxep4#

上面的答案是好的,我想告诉他们之间的主要区别。自动装配的目的是避免类之间的依赖性,如果你正在创建对象,对一个类进行更改将影响所有的类。

vlf7wbxs

vlf7wbxs5#

@Autowire的典型用法是在初始化bean时自动填充一个属性,使用单例依赖项。无论它是你的代码还是第三方类。你需要考虑它是否是程序逻辑的一部分,或者它是否真的是一个应该初始化一次并重用的依赖项。
如果你的RestTemplate在每次交换之前都需要有相同的初始化,那么你可以考虑使用@Autowire并在Spring的configuration中初始化bean。从这个意义上说,它类似于DataSource,但是如果你把它看作是一个实用程序类,它是程序逻辑的一部分,(比如一个连接或者一个文件),那么就不要把它考虑到@Autowire中。它会让你的程序变得更复杂,而不会有明显的好处。

相关问题