1.1 Spring IoC概述
控制反转IoC是一种通过描述(在Java中可以是XML或者注解)并通过第三方(Spring提供的IoC容器)去产生或获取特定对象的方式。
在Spring中实现IoC(控制反转)的是IoC容器,其实现方式是依赖注入(Dependency Injection, DI).
控制反转最大的好处在于降低对象之间的耦合,当需要使用一个对象的时候,关于如何创造这个对象我们并不关心(创造对象由IoC容器来实现),我们只需要给出这个对象的描述信息,即可通过IoC容器获取这个对象。
1.2.1 Spring IoC容器的设计
Spring IoC容器的设计主要是基于 BeanFactory和 ApplicationContext两个接口,其中ApplicationContext是BeanFactory的子接口之一, 其中BeanFactory是Spirng IoC容器所定义的最顶层的接口,而ApplicationContext是其子接口之一,并且对BeanFactory功能做了许多有用的扩展,所以在绝大部分工作场景下,都会使用ApplicationContext作为Spring IoC容器。
ClassPathXmlApplicationContext是ApplicationContext接口的实现类,我们可以用它去实例化ApplicationContext接口
示例:
Bean的描述信息(XML方式,存储在applicationContext.xml文件中,这个文件是Spring的配置文件)
通过ClassPathXmlApplicationContext实例化ApplicationContext并获取Bean
String config="applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
Student student = (Student) ctx.getBean("myStudent");
System.out.println("student="+student);
Date date = (Date) ctx.getBean("mydate");
System.out.println("date==="+date);
1.2.2 Spring IoC容器的初始化和依赖注入
1.2.3 Spring Bean的生命周期
2. 装配Spring Bean
2.1依赖注入的三种方式
注意依赖注入不等于XML配置,下面用XML方式只是举例注入类型,例如注解也能用setter注入,依赖注入的三种方式只是设计原理,装配Bean的时候用的不同的方法都是基于这三种依赖注入方式的
-
构造器注入
Spring采用反射的方式通过使用类的构造方法来完成注入,这就是构造器注入的原理
package com.ssm.chapter10.pojo;
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****/
}<bean id="role1" class="com.ssm.chapter10.pojo.Role">
<constructor-arg index="0" value="总经理"/>
<constructor-arg index="1" value="公司管理者"/>
</bean>constructor-arg元素用于定义类构造方法的参数,index用于 定义参数的位置,value则是设置值
参数比较多的时候,构造器注入的可读性比较差,这时候应该考虑使用setter注入
-
setter注入
setter注入的原理是通过反射调用类的无参构造方法得到一个对象(因此这个类必须有一个无参的构造方法),然后再通过set方法往对象中注入值。
package com.ssm.chapter10.pojo;
public class Role {
private Long id;
private String roleName;
private String note;
public Role() {
}
public Role(String roleName, String note) {
this.roleName = roleName;
this.note = note;
}
/****setter and getter****/
}<bean id="role2" class="com.ssm.chapter10.pojo.Role">
<property name="roleName" value="高级工程师"/>
<property name="note" value="重要人员"/>
</bean> -
接口注入
有时候有些资源并非来源于自身系统,而是来源于外界,这个时候使用接口注入(留个坑,详细信息请google)
2.2 装配Bean
Spring中提供了3种方法进行配置Bean,在实际开发中,这三种配置方式都会用到,并且常常混用,因此必须有一个优先级,其优先级从上到下一次递增
-
在XML中显示配置
-
在Java的接口和类中实现配置
-
隐式Bean的发现机制和自动装配原则
第二种和第三种方式对应的就是注解的方式
2.2.1 在XML中显示配置
public class ComplexAssembly{
private Long id;
private List<String> list;
private Map<String,String> map;
private Properties props;
private Set<String> set;
private String[] array;
/****setter and getter****/
}