控制反转:把对象的创建和对象之间的调用过程都交给Spring进行管理,目的是为了降低耦合度;
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
建议放到容器中的对象:dao类,service类,controller类,工具类,spring容器中的对象都是单例,容器中每个对象只存在一个;
不建议放到容器中的对象:
- 实体类对象,实体类对象的数据来自数据库,应该是在程序运行过程中创建
- servlet,filter,listener,这些类应该由tomcat负责创建与调用
将对象放到容器中有两种方式
- 在xml配置中添加bean标签
- 使用注解
通过容器使用对象:
- 在resources目录下配置mybeans.xml
- 创建spring容器,通过容器获取对象
//从类路径target/classes下加载xml文件,创建容器,ApplicationContext就是spring容器
//在创建完spring容器后,spring会创建配置文件中的所有对象,默认调用的是类的无参构造
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
//从容器中获取某个类
WarMovieInterImpl warMovie =context.getBean("WarMovie",WarMovieInterImpl.class);
warMovie.seeMovie();
//获取非自定义类
Date date=(Date)context.getBean("myDate");
3.依赖注入(Dependency Injection)DI
bean实例在调用无参数构造方法创建对象后,就要对bean对象的属性进行初始化,初始化是由容器完成的,称为依赖注入,根据注入的方式分为set注入,构造注入;
set注入(设值注入):spring调用类的set方法,在set方法可以实现属性的赋值,实际开发中80%都是使用该方式;
//简单类型//引用类型,property里面用ref="beanid"
构造注入:spring调用类的有参构造方法,创建对象,在构造方法中完成属性的赋值;
public Player(String pName, int age, boolean sex,Company com) {
this.pName = pName;
this.age = age;
this.sex = sex;
this.com= com;
}
用构造注入获取file对象
4.引用类型的自动注入
实际开发中可能会碰到一个类里面有多个引用属性,如果逐个配置标签会导致代码冗余,所以spring提供了一种自动注入引用类型的功能,该功能只能为引用属性自动赋值;
-
byName(按名称)方式:如果java类中引用类型的属性名与bean中的类的id一致,且数据类型一致,那么spring就能对该属性进行自动注入
public class WarMovieInterImpl implements MovieInter { private Player player; private Director director; ... } -
byType(按类型)方式:如果java类中引用类型的属性类型与bean中的类的class是同源的,那么spring就能对该属性进行自动注入
这里的同源指的是:
- java类中引用类型的属性类型与bean中的类的class同一个类;
- java类中引用类型的属性类型是bean中的类的class的父类;
- java类中引用类型的属性类型与bean中的类的class是接口与实现类的关系;
public class WarMovieInterImpl implements MovieInter {
private Player player;
...
}
public class PlayerSon extends Player{
public PlayerSon(String pName, int age, boolean sex, Company com) {
super(pName, age, sex, com);
System.out.println("player子类");
}
}
5.多配置文件
如果项目较为庞大,可以使用多个配置文件
- 可以按功能模块,一个模块一个配置文件
- 按类的功能,数据库相关一个配置文件,事物功能一个配置文件,service功能一个配置文件…
6.注解方式的依赖注入


