刚看到spring的IOC和依赖注入不能很好地理解,为什么这样做就解耦了呢?
后来发现,重点在于使用方式上。通过接口与实现类分离,可以保证对象的灵活性。
例如:
public class Student { }
---------------------------------
<bean id="stu" class="com.demo.Student"/>
---------------------------------
@Test
public void estStudent() {
ApplicationContext context = new ClassPathXmlApplicationContext("beanXML.xml");
Student student = context.getBean("stu", Student.class);
}
如果这样使用,并不能做到最大限度的解耦。因为Student student = context.getBean("stu", Student.class);
这句仍然明确指定了Student
类,虽然使用了IOC,但并没有达到预期效果。下面我们修改下。
public interface StudentInt { }
---------------------------------
public class StudentImpl implements StudentInt { }
---------------------------------
<bean id="stu" class="com.demo.StudentImpl"/>
---------------------------------
@Test
public void estStudent() {
ApplicationContext context = new ClassPathXmlApplicationContext("beanXML.xml");
StudentInt student = context.getBean("stu", StudentInt.class);
}
注意这里我们分开了StudentInt
和StudentImpl
,分别为接口与其实现类。
我们先看下使用处,StudentInt student = context.getBean("stu", StudentInt.class);
这里只提到了StudentInt
,并没有提到具体实现类,这正是利用多态的特性,完成了解耦。这段代码不再需要因为具体实现类的改动而改动。只要bean是实现了StudentInt
的实习类就可以。
具体指定实现类,我们只需要修改xml中的bean即可。
依赖注入也是同样的道理,只不过主动关系改为了被动关系
网友评论