使用@Autowired注释和new键有什么区别?让我们在一个班级之间的区别是:
@Autowired private UserDao userdao;
Run Code Online (Sandbox Code Playgroud)
和
private UserDao userDao = new UserDaoImpl();
Run Code Online (Sandbox Code Playgroud)
对性能有影响吗?
pap*_*pap 11
除了低耦合,其他人都已经谈到了,一个主要区别是与new方法,你每次得到一个新的对象,无论你愿不愿意.即使UserDaoImpl可重用,无状态和线程安全(DAO类应该努力),您仍将在需要的每个位置创建它们的新实例.
这一开始可能不是一个大问题,但考虑到对象图增长 - UserDaoImpl可能需要Hibernate会话,它需要一个需要JDBC连接的DataSource - 它很快就会成为很多必须创建和初始化的对象一遍又一遍地.当你依赖new代码时,你也会在很多地方展开初始化逻辑.与此示例中一样,您需要在UserDaoImpl中使用代码来打开具有适当参数的JDBC连接,但所有其他DAO类必须执行相同的操作.
这里是Inversion-of-Control(IoC)的用武之地.它旨在通过将对象创建和生命周期与对象绑定和使用分离来解决这些问题.IoC最基本的应用是一个简单的Factory类.更复杂的方法是依赖注入,例如Spring.
对性能有影响吗?
是的,但它很可能不会非常重要.在启动时使用Springs依赖注入会花费更多,因为必须初始化容器并设置所有托管对象.但是,由于您不会创建托管对象的新实例(假设您设计它们的方式),因此您将从较少的GC加载和较少的对象创建中获得一些运行时性能.
然而,您的巨大收益将在于应用程序的可维护性和稳健性.
上面的评论是正确的,但是在这里我要添加一些对您有帮助的示例。
看,我们有100个使用UserDaoclass的Class,然后得到dao实例,例如:
private UserDao userDao = new UserDaoImpl();在100个地方,
几周后,需求发生了变化,我们需要使用LdapUserDao或类似的方法
class LdapUserDao implements UserDao{
}
Run Code Online (Sandbox Code Playgroud)
实现UserDao。你是做什么?您如何处理new关键字,将impl类与用法绑定在一起。
如果您在100个地方使用@Autowired,则从一个地方开始使用(如果您使用基于xml的配置,则只需转到xml并从xml切换到另一个UserDao,如果将注释添加到该组件并将Spring注释切换到适当的位置)即可进行管理,所以它出现在100个地方 这就是所谓的DI模式。这是DI的全部目的
另一个重要的事情是,即使您可以管理对象范围,也可以使用spring注释,但是使用new关键字是不可能的(除非您做笨拙的单例操作或类似的操作),我敢肯定使用new关键字不能
Prototype
Request
Single
Run Code Online (Sandbox Code Playgroud)
范围对象
在性能方面,除非看到您的代码,否则很难说。但是我敢肯定,在最坏的情况下它们可能具有相同的性能,否则springs方式会很快,因为据我所知dao类应该是单例的,而不是原型,因此整个项目将以spring方式在userdao对象上使用,具体new方式取决于您正在丢失对dao对象的引用。但是离开表演。不要考虑性能超过良好的设计。第一时间一直以良好的方式(不是快速的方式)和良好的设计来制作它,然后看它的性能。
| 归档时间: |
|
| 查看次数: |
6624 次 |
| 最近记录: |