Spring @自动连线vs新钥匙?

Spring @自动连线vs新钥匙?,spring,Spring,使用@Autowired注释和new键有什么区别? 让我们在一个类中了解以下内容之间的区别: @Autowired private UserDao userdao; 及 对性能有影响吗?在运行时,在这两种情况下,userdao属性中都会指定一个UserDaoImpl实例 但第一种方法意味着模式的使用,与第二种方法相比有一些优势: 您的类现在依赖于一个接口,因此它可以与任何UserDao实现一起工作(可能是使用和RDBMS的实现,也可能是使用XML文件作为存储库的实现) 由于您现在依赖于接口,

使用
@Autowired
注释和
new
键有什么区别? 让我们在一个类中了解以下内容之间的区别:

@Autowired private UserDao userdao;


对性能有影响吗?

在运行时,在这两种情况下,
userdao
属性中都会指定一个
UserDaoImpl
实例

但第一种方法意味着模式的使用,与第二种方法相比有一些优势:

  • 您的类现在依赖于一个接口,因此它可以与任何UserDao实现一起工作(可能是使用和RDBMS的实现,也可能是使用XML文件作为存储库的实现)
  • 由于您现在依赖于接口,单元测试和模拟非常简单和直接
  • 这是代码中最好的属性

因此,与第一种方法相比,您应该更喜欢第二种方法,特别是如果您已经在使用Spring(这是容器背后的想法)

以上的评论是正确的,但这里我将添加一些对您有帮助的示例

看,我们有100个类使用
UserDao
class,您得到的dao实例如下:
private UserDao UserDao=new UserDaoImpl()在100个位置

几周后,需求发生了变化,我们需要使用
LdapUserDao
或类似的工具

class LdapUserDao implements UserDao{

}
它实现了
UserDao
。你是做什么的?你如何处理你的
新的
关键字,你将impl类绑定到使用中

如果您在100个位置使用@Autowired,然后从一个位置(如果您使用基于xml的配置,那么只需转到xml并从xml切换到另一个UserDao,如果注释转到该组件并将Spring注释切换到正确的UserDao)管理它,这样它就会在100个位置出现。这就是所谓的
DI
模式。这就是我们的全部目的

另一件重要的事情是使用spring注释,即使您可以管理对象范围,但使用new关键字也不行(除非您使用dumb singleton或类似的方法), 我敢肯定,新的关键字,你不能有

  Prototype
  Request
  Single
作用域对象


就性能而言,这很难说,除非看到您的代码。但我确信在最坏的情况下,它们可能具有相同的性能,否则SpringWay是快速的,因为我知道dao类应该是单例的,而不是原型,所以整个项目都将以spring的方式在userdao对象上运行,使用
new
的方式,这取决于您在哪里失去对dao对象的引用。但是离开表演。不要考虑性能优于良好的设计。一直以来,首先用良好的设计以良好的方式(而不是快速的方式)制造它,然后查看它的性能。

除了其他人已经提到的低耦合之外,一个主要的区别是,使用
新的
方法,无论你愿意与否,每次都会得到一个新对象。即使
UserDaoImpl
是可重用的、无状态的和线程安全的(DAO类应该努力做到这一点),您仍然会在每个需要它们的地方创建它们的新实例

这可能不是一个大问题一开始,但是考虑到对象图的增长——<代码> UserDaoImpl <代码>可能需要一个Hibernate会话,它需要一个数据源,它需要一个JDBC连接——它很快变成许多必须被创建和重新初始化的对象。当您依赖于代码中的

new
时,您还将初始化逻辑分散到一大堆地方。如本例中所示,您需要在UserDaoImpl中包含代码,以使用适当的参数打开JDBC连接,但所有其他DAO类都必须执行相同的操作

这就是控制反转(IoC)的作用。它旨在通过将对象创建和生命周期与对象绑定和使用分离来解决这些问题。IoC最基本的应用程序是一个简单的工厂类。一种更复杂的方法是依赖注入,比如Spring

对性能有影响吗?

是的,但它很可能不会很重要。使用Springs依赖项注入在启动时会花费更多的时间,因为必须初始化容器并设置所有托管对象。但是,由于您不会创建托管对象的新实例(假设这就是您设计它们的方式),因此您将从较少的GC负载和较少的对象创建中获得一些运行时性能


然而,您的最大收获是应用程序的可维护性和健壮性。

如果您使用

private UserDao userDao = new UserDaoImpl();

因为它没有设置在*context.xml中声明的会话引用。

谢谢,我遇到了这个问题,花了一天时间来解决它。。,
private UserDao userDao = new UserDaoImpl();