目前在一家电商公司担任java后台的开发,在工作中spring是常用的技术,因此学好spring是很有必要的,从现在开始将利用空余的时间在学习公司的框架技术之外,慢慢地复习和学习spring的相关的内容,深入源码进行学习,体会spring的设计模式。
今天主要研究spring的IOC(DI)的相关的知识,spring为对象的生成提供了一种全新的模式。以前需要bean的时候都是通过直接new的对象来产生的或者利用类的静态方法来产生这样的bean,但是这样的弊端在于耦合性太大了。
java中强调组合大于继承,主要在于组合的模式可以把不同的对象组合在一起,从而实现功能的调用,丰富类的功能,而且耦合性很小,因为利用接口类型,可以组合不同的实现类实现功能的扩展,但是如果利用继承的话,由于java单继承的局限性,功能扩展单一,很不灵活,而实现接口实现功能的扩展的话。实际上是在本类中实现的功能,假如其他的类要使用这样的功能的话就会遇到局限性,而通常在编程中大部分的情况下是把一组的功能定义为接口,然后生成不同的实现类。这个时候使用组合依赖的话会非常的方便。下面举一个例子:
组合了两个接口类型的变量,每个接口都有两个实现类,利用spring可以很容易的管理这些组合之间的依赖关系。
public class FunctionComponent { //组合接口一的类型 private FunctionInterface functionInterface; //组合接口二的类型 private FunctionInterfaces functionInterfaces; } 关于spring的bean: 一般来说,java中的类,除了抽象类之外都可以在容器中进行管理,但是前提条件是必须要有无参数的构造器吗,否则会报错: 例如: java类:@Component("person") public class Person { private Integer age; private String name; private Date birthDay; public Person(Integer age, String name, Date birthDay) { this.age = age; this.name = name; this.birthDay = birthDay; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + '\'' + ", birthDay=" + birthDay + '}'; } } 上面的这个类中是没有空参数构造器的,结果报错如下: Error creating bean with name 'person' defined in file [D:\jd-study\jd-study-common\target\classes\com\jd\study\common\spring_study\spring_annotation\Person.class]: I nstantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.jd.study.common.spring_study.spring_annotation.Person]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.jd.study.common.spring_study.spring_annotation.Person.<init>() 显示没有空参数构造器,这显示了在java中bean的创建需要依赖于空参数的构造器。 抽象类是不能通过反射获得对象的。