一、IoC简介
控制反转(loC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。
loC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式是依赖注入。应用广泛。
依赖:classA 类中含有classB 的实例,在classA 中调用classB 的方法完成功能,即classA 对classB 有依赖。
loc的实现:
依赖注入:Dl(Dependency Injection),程序代码不做定位查询,这些工作由容器自行完成。只需要在程序中提供要使用的对象名称就可以,至于对象如何在容器中创建、赋值、查找都由容器内部实现。
依赖注入DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring的依赖注入对调用者与被调用者几乎没有任何要求,完全支持对象之间依赖关系的管理。
Spring框架使用依赖注入(DI)实现IoC。使用的 DI 实现了 IoC 的功能,spring底层创建对象,使用的是反射机制。
Spring容器是一个超级大工厂,负责创建、管理所有的 Java对象,这些 Java对象被称为Bean。Spring容器管理着容器中Bean之间的依赖关系,Spring使用 “依赖注入” 的方式来管理Bean之间的依赖关系。使用 loC 实现对象之间的解耦和。
二、Spring的第一个程序
1、创建maven项目
2、引入maven依赖pom
3、定义接口与实体类
package cn.edu.huat.service;public interface SomeService {
void doSome();}
SomeServiceImpl(实现类):
package cn.edu.huat.service.impl;import cn.edu.huat.service.SomeService;public class SomeServiceImpl implements SomeService {
@Override public void doSome() {
System.out.println("执行了SomeServiceImpl的doSome方法"); }}
4、创建Spring配置文件
声明bean,就是告诉spring要创建某个类的对象
id:对象的自定义名称,唯一值。spring通过这个名称找到对象
class:类的全限定名称(不能是接口,因为spring是反射机制创建对象, 必须使用类)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="someService" class="cn.edu.huat.service.impl.SomeServiceImpl" />beans>
spring配置文件解析:
(1)beans
根标签,spring把 java对象成为bean
(2)spring.beans.xsd
约束文件,和mybatis指定dtd是一样的
(3)bean
spring相当于就完成如下程序:
//springMap.put(id的值,对象);springMap.put("someService",new SomeServiceImpl());
spring是把创建好的对象放入到map中,spring框架有一个map存放对象
//springMap.put(id的值,对象);springMap.put("someService",new SomeServiceImpl());
注意:一个bean标签声明一个对象
5、定义测试类
spring默认创建对象的时间:在创建spring的容器时,会创建配置文件中的所有的对象。
spring创建对象:默认调用的是无参数构造方法
package cn.edu.huat;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {
@Test public void test02(){
//使用spring容器创建的对象 //1、指定spring配置文件的名字 String config = "beans.xml"; //2、创建表示spring容器的对象,ApplicationContext // ApplicationContext:表示Spring容器,通过容器获取对象 // ClassPathXmlApplicationContext:表示从类路径中加载spring配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext(config); //从容器中获取某个值,你要调用对象的方法 //getBean("配置文件中的bean的id值") SomeService someService = (SomeService) ac.getBean("someService"); //使用spring创建好的对象 someService.doSome(); }}
注意:类路径如下图所示
6、使用spring创建非自定对象
(1)创建一个存在的某个类的对象
"myDate" class="java.util.Date" />
(2)测试类
package cn.edu.huat;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Date;public class MyTest {
@Test public void test03(){
String config = "beans.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); Date myDate = (Date) ac.getBean("myDate"); System.out.println("Date:" + myDate); }}
三、基于XML的DI
1、注入分类
bean实例在调用无参构造器创建对象后,就要对bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入(即赋值)。
根据注入方式的不同,常用的有两类:set注入、构造注入
(1)set 注入(掌握)
set注入也叫设值注入。是指,通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入中大量使用。
简单类型
applicationContext.xml(Spring配置文件)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=