初学Spring时,对于SpringIOC的作用大为感叹,但是一直不清楚SpringIOC为什么可以起到解耦合的作用?我直接new出来跟它用@Autowired注解与Resource注解DI注入感觉似乎也差不太多
在看网上资料说假如我们修改一处代码,往往要修改很多出相关联的代码。当我要注入的对象发生改变,例如之前我需要的是cat,而现在我需要的是dog,这样我new的代码需要改变,可是我用@Autowired注解与Resource注解也要发生改变,那怎么就起到了解耦合的作用了呢?为此也困惑了我很久,也可能是我理解不够。
假设有一个订单类Order和一个工厂类OrderFactory,工厂类使用new创建订单类的实例:
public class Order {
private String orderId;
private int amount;
public Order(String orderId, int amount) {
this.orderId = orderId;
this.amount = amount;
}
}
public class OrderFactory {
public Order createOrder(String orderId, int amount) {
return new Order(orderId, amount);
}
}
现在,又有一个前端界面类A依赖于OrderFactory创建订单。那么,在本例中,如果Order类的构造函数的参数发生变化,比如增加一个address属性:
public class Order {
private String orderId;
private int amount;
private String address;
public Order(String orderId, int amount, String address) {
this.orderId = orderId;
this.amount = amount;
this.address = address;
}
}
那么OrderFactory和A类的方法中都需要相应的修改,否则编译阶段会报错。
public class OrderFactory {
public Order createOrder(String orderId, int amount, String address) {
return new Order(orderId, amount, address);
}
}
public class A {
private OrderFactory orderFactory;
public A(OrderFactory orderFactory) {
this.orderFactory = orderFactory;
}
public void createOrder(String orderId, int amount, String address) {
Order order = orderFactory.createOrder(orderId, amount, address);
// do something
}
}
显然,这种手动创建对象的方式将类与类之间紧密耦合,且代码难以维护。而使用Spring IOC容器进行依赖注入,则不会出现上述问题
我们可以通过IOC容器自动实例化OrderFactory并将其注入到A类中。这样,我们就不需要手动实例化OrderFactory,也不需要把它的实例传递给A类的构造函数或方法
总之,通过使用Spring IOC容器进行依赖注入,我们可以实现高度解耦、低耦合度的依赖管理,同时大大提高了程序的可维护性、扩展性和灵活性。