spring IOC从入门到手写

1什么叫spring IOC(控制反转)和DI(依赖注入)?

IOC(Inversion of Control)就是控制反转,它是一种设计思想。
当你在程序中需要一个对象时,可能经常会如下操作:
Student s =new Student();
而IOC这种设计思想就是希望你不要使用new关键字去创建对象,而是去找IOC框架拿。
IOC ioc =new IOC();
ioc.get(s);//你需要的所有对象都这样获取。
Spring IOC就是IOC设计思想的一种实现方法,它负责管理(增删改查)你在程序中需要使用的对象。

DI(Dependency Injection)也叫依赖注入,它的功能是从IOC容器中获得一个对象,赋值给你的变量。
比如你需要一个学生对象,你可以这样做,s1就自动被赋值了。
@Autowired
Student s1;

Spring IOC的入门案例

纯xml配置方式

纯xml方式
第一步:导入spring依赖包;
第二步:创建一个java类,把这个类放入IOC容器中并拿出进行spring IOC测试
class Student{

}
第三步:编写配置文件bean.xml,重要配置如下

第四步:获取这个Student对象
public static void main(String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“bean.xml”);
Student s = applicationContext.getBean(“student”);
}

xml和注解结合方式

第一步:导入spring依赖包;
第二步:编写配置文件,开启注解功能,指定要扫描哪个包来创建IOC容器;
Spring.xml中重要配置
context:annotation-config/ //开启注解功能
//指定创建IOC容器要扫描的包
第三步:使用注解注解程序中的bean;
第四步:获取IOC容器。
public static void main(String[] args){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“spring.xml”);
Student s = (Main) applicationContext.getBean(“student”);
}

纯注解方式

第一步:导入spring依赖包;
第二步:使用注解指定配置类和要扫描哪个包来创建IOC容器;
@Configuration //指定当前类是个配置类;
@ComponentScan(“com.xxx”) //指定创建容器时要扫描的包
public class SpringConfing{
@Bean(“dataSource”)//将当前方法的返回值作为bean对象存入ioc容器
public DataSource ceratDataSource() {…}
}
第三步:使用注解注解程序中的bean;
@Component
class Student{

}
第四步:获取IOC容器。
public static void main(String[] args){
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfing.class);
//2.得到业务层方法
IDemoService service = ac.getBean(“demoService”, IDemoService.class);
}

Spring IOC的原理

其实Spring IOC的原理在它的名字上有很大的体现,IOC 容器,之所以叫IOC容器,是因为Spring框架提供了一个map类型的数据结构,用来存储那些bean对象。
map中存储的数据是key:value型的,key就是你配置的bean对象的id值,value就是这个类的一个实例化对象。所以通过IOC容器.getBean(bean对象的id)就可以获得你想要的对象了。

手写Spring IOC的思路

在手写spring ioc之前,你必须先具备以下知识。
1servlet的基本知识
javaee三大组件之一,我们可以在web.xml配置一个tomcat一运行就初始化的servlet,servlet初始化时会调用它的init()。
2java反射机制
在这里插入图片描述
我们可以发现,只要用户提供类的全路径名,我们就可以得到该类的class对象和实例化对象。为什么要拿到class对象,因为class对象可以获得以下的信息:
spring IOC从入门到手写_第1张图片
有了上面的基础知识后我们就可以按下面的思想手写自己的spring框架了。
public myspring extends httpservet{
@overwrited
init(){
//1读取配置文件bean.xml
//2初始化IOC容器
map IOC=new hashmap;
//3解析配置文件,把bean.xml中配置的对象一一放入IOC容器。
IOC容器需要key:value型数据。
key可以使用标签中的id;
value则需要一个实例化对象,这里的实例化对象就需要使用到反射机制来创建了。我们拥有的是类的全路径名,可以通过它先获得class对象,再获得实例化对象。
//4处理依赖注入
使用class对象实例化的对象各属性都是默认值,如果一个bean对象A的属性是另外的一个bean对象B,我们就需要扫描整个IOC容器,获得对象B再赋值给对象A的属性。
}}
上面只是xml配置时的springIOC的一种实现思路,注解配置时需要对java注解类有一定的了解,但是其大体思想是不变的。
总结:spring IOC就是使用一个map来存储所有的bean对象,一个String id对应一个实例化对象,实例化bean对象时需要用到java反射机制,从类的全路径名出发,先获得class对象,再获得实例化对象。

你可能感兴趣的:(spring,ioc)