welcome to my blog
作为刚入门的新手, 今天突然想到一个问题, 使用@autowired注解注入一个类, 哪里体现了低耦合? 不还是得输入类的名字吗? 这不就跟new差不多嘛
使用@autowired注解怎样体现解耦和?
@autowired注入一个对象时, 使用该类实现的接口名即可, 但是如果使用new创建一个实例的话, 必须指明具体的实现类, 例子如下
比如有个访问数据库的接口AlphaDao
public interface AlphaDao {
String select();
}
AlphaDao对应的具体实现类
import org.springframework.stereotype.Repository;
@Repository
public class AlphaDaoMyBatisImpl implements AlphaDao {
@Override
public String select() {
return "MyBatis";
}
}
当我们在业务层访问数据库时, 可以注入AlphaDao, 并不用指明具体的实现类的类名, 这就体现了低耦合. 另一个好处就是改用其它的实现类的话, 也不用修改源代码, 很好地体现了开闭原则
@Autowired
private AlphaDao alphaDao;
如果使用new创建一个实例, 那么必须指明具体的实现类. 日后要是改用其它的实现类的话, 就得修改源代码, 这破坏了"开闭原则"中的"对修改封闭". 更不幸的是, 如果源代码中有100处new, 那么就得手动修改100个地方…
private AlphaDao alphaDao = new AlphaDaoMyBatisImpl();
使用@autowired的另外一个优势: 避免重复创建实例
@autowired注入一个对象, 可以重复使用. 打个比方, 如果业务层有两个类都用到了用一个类, 此时使用new的话得创建两个对象实例, 但是使用@autowired注入的对象可以在不同的类之间使用, 这就避免创建重复的对象, 也就减轻了垃圾回收(GC)的压力
参考