@autowired vs新密钥?

时间:2012-10-11 22:30:13

标签: spring

使用@Autowired注释和new键有什么区别? 让我们在一个类中的区别是:

@Autowired private UserDao userdao;

private UserDao userDao = new UserDaoImpl();

对性能有影响吗?

4 个答案:

答案 0 :(得分:7)

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

这一开始可能不是一个大问题,但考虑到对象图增长 - UserDaoImpl可能需要一个Hibernate会话,它需要一个需要JDBC连接的DataSource - 它很快会变成很多必须一次又一次地创建和初始化的对象。当你依赖代码中的new时,你也会在很多地方展开初始化逻辑。与此示例中一样,您需要在UserDaoImpl中使用代码来打开具有适当参数的JDBC连接,但所有其他DAO类必须执行相同的操作。

这里是Inversion-of-Control(IoC)的用武之地。它旨在通过将对象创建和生命周期与对象绑定和使用分离来解决这些问题。 IoC最基本的应用是一个简单的Factory类。更复杂的方法是依赖注入,例如Spring。

是否会对效果产生影响?

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

然而,您的巨大收益将来自于应用程序的可维护性和稳健性。

答案 1 :(得分:3)

以上评论是正确的,但在这里我将添加一些对你有帮助的例子。

看看我们有100个使用UserDao类的类,你得到这样的dao实例: 在100个地方private UserDao userDao = new UserDaoImpl();

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

class LdapUserDao implements UserDao{

}

实现UserDao。你是做什么?你如何处理你的new关键字,你将impl class绑定到使用中。

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

的全部目的

另一个重要的事情是使用spring注释,即使你可以管理对象范围,但是使用new关键字没有办法(unles你做哑单身或类似的东西), 我确信你可以使用新关键字

  Prototype
  Request
  Single

Scoped objects

就性能而言,除非看到你的代码,否则很难说。但我确信在最坏的情况下它们可能具有相同的性能,否则spring方式很快,因为我知道dao类应该是单例,而不是原型,所以整个项目你将在springdao对象上以{{1}方式这取决于你丢失对dao对象的引用。但离开表演。不要考虑性能而不是好的设计。所有的时间都是以良好的方式(不是快速的方式)以良好的设计,然后看它的性能。

答案 2 :(得分:2)

如果使用

,您将收到NullPointerException
private UserDao userDao = new UserDaoImpl();

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

答案 3 :(得分:0)

在运行时,在两种情况下,您都会在UserDaoImpl属性中获得userdao个实例。

但第一种方法意味着Dependency Injection模式的消息,这比第二种方法有一些优势:

  • 您的类现在依赖于接口,因此它可以与UserDao的任何实现一起使用(可能是使用和RDBMS,其他使用XML文件作为存储库)
  • 当您依赖于界面时,单元测试和模拟非常简单明了。
  • Low-coupling是您的代码中的一个很好的属性。

所以你应该比第一种方法更喜欢第二种方法,特别是如果你已经使用了Spring(这是Inversion-Of-Control容器背后的想法)