在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来;另一类则是依赖注入,而Spring主要使用的是依赖注入。一般而言,依赖注入可以分为3种方式。
•构造器注入。
•setter注入。
•接口注入。
构造器注入和setter注入是主要的方式,而接口注入是从别的地方注入的方式,比如在Web工程中,配置的数据源往往是通过服务器(比如Tomcat)去配置的,这个时候可以用JNDI的形式通过接口将它注入Spring IoC容器中来。下面对它们进行详细讲解。
构造器注入
构造器注入依赖于构造方法实现,而构造方法可以是有参数的或者是无参数的。在大部分的情况下,我们都是通过类的构造方法来创建类对象,Spring也可以采用反射的方式,通过使用构造方法来完成注入,这就是构造器注入的原理。
public class Role { private Long id; private String roleName; private String note; public Role(String roleName, String note) { this.roleName = roleName; this.note = note; } /******** setter and getter *******/ }
这个时候是没有办法利用无参数的构造方法去创建对象的,为了使Spring能够正确创建这个对象,可以像代码清单那样去做。
<bean id="role1" class="com.ssm.chapter9.pojo.Role"> <constructor-arg index="0" value="总经理"/> <constructor-arg index="1" value="公司管理者"/> </bean>
constructorarg元素用于定义类构造方法的参数,其中index用于定义参数的位置,而value则是设置值,通过这样的定义Spring便知道使用Role(String,String)这样的构造方法去创建对象了。这样注入还是比较简单的,但是缺点也很明显,由于这里的参数比较少,所以可读性还是不错的,但是如果参数很多,那么这种构造方法就比较复杂了,这个时候应该考虑setter注入。
使用setter注入
setter注入是Spring中最主流的注入方式,它利用JavaBean规范所定义的setter方法来完成注入,灵活且可读性高。它消除了使用构造器注入时出现多个参数的可能性,首先可以把构造方法声明为无参数的,然后使用setter注入为其设置对应的值,其实也是通过Java反射技术得以现实的。这里假设先在代码清单中为Role类加入一个没有参数的构造方法,然后做代码清单的配置。
<bean id="role2" class="com.ssm.chapter9.pojo.Role"> <property name="roleName" value="高级工程师"/> <property name="note" value="重要人员"/> </bean
这样Spring就会通过反射调用没有参数的构造方法生成对象,同时通过反射对应的setter注入配置的值了。这种方式是Spring最为主要的方式,在实际工作中使用广泛。
接口注入
有些时候资源并非来自于自身系统,而是来自于外界,比如数据库连接资源完全可以在Tomcat下配置,然后通过JNDI的形式去获取它,这样数据库连接资源是属于开发工程外的资源,这个时候我们可以采用接口注入的形式来获取它