手写spring源码系列_SpringIOC 分析

学习笔记

手写spring源码系列:

之前已经搭建好了spring源码环境,但是不直接开始阅读spring源码,按照spring的思想自己猜想着先写。分为三个模块,

分别为手写spring IOC,Spring DI ,spring AOP, spring配置。 完成之后,再进行源码的解读。

手写IOC

        分析 ioc是个啥?inversion of control 控制反转,也称依赖倒置(反转)简单的讲就是依赖的对象被反转了,由自己创建对象,

反转为从ioc容器中获取(自动注入),再简单讲就是之前自己new的对象,现在直接向spring 容器要。

ioc的特点:1. 使代码更简洁,不需要去new对象了。

                   2.面向接口编码,使用者和具体类解耦,易替换实现者。

 ioc本质:    就是创建,管理我们在整个应用程序中使用到的bean。他是一个工厂,负责对外提供bean实例.

       

问题1:他应该具备什么行为?

答:对外提供bean实例,getBean() 方法

问题2:getBean()方法需要参数吗?需要几个参数,什么类型的参数。

简单工厂模式中,当工厂能创建很多产品的时候,要创建某类产品,需要告诉工厂。所以需要传入名字,或者类型

问题3: 这个getbean()方法的返回值应该是什么类型的。

Object

BeanFactory接口:

public interface BeanFactory {

	Object getBean(String name) throws BeansException;
}

问题4:Bean工厂怎么知道该如何创建bean?

我们需要告诉bean工厂。

bean定义————>BeanFactory——>bean instance;

 

问题5:怎么告诉Beanfacory呢?

使用注册方式,定义一个注册接口

Bean定义——注册——>BeanDefinitionRegistry

问题6:BeanDefinitionRegistry 应该有什么行为?

1.应该有注册,获取Bean定义

  1.1.注册的bean定义信息如何区分?

  使用唯一的名称

 

 BeanDefinitionRegistry接口 
public interface BeanDefinitionRegistry {

   /**
	 * 注册一个beanDefinition,beanName区分唯一的
	 * 
	 */
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;
   /**
	 * 根据BeanName获取BeanDefinition
	 */
  
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;


	/**
	 * 检测是否已经注册一个Bean
	 */

	boolean containsBeanDefinition(String beanName);

}

 

 问题7:BeanDefinition定义的用途

告诉bean工厂如何创建某个Bean

问题8:获取某个类的实例化方式是啥?

 构造方式   反射。

工厂方法:静态工厂,实例工厂      

Student student = new Student();

public class StudentFacory{
        private static Student student;
       public static Student getStudent(){
          student = new Student();
          return student;
     }
}

public class StudentFactory{

       public Student getStudent(){

         return  new Student();
    }

}

        

问题9:Bean工厂帮我创建Bean的时候,需要知道那些信息。

new 构造的---类名

静态工厂方法:工厂类名,工厂方法名

动态的工厂方法:工厂bean名称  工厂方法名。

问题10:每次从bean工厂获取bean实例,是否创建一个新的对象。

单例不需要,非单例需要

问题11:beanDefinition 是给bean工厂创建bean使用的,beanDefinition 接口应向Bean 工厂提供那些方法。

获取bean的类名  :getBeanClass();

获取工厂方法名:

获取工厂bean的名称:

是否是单例的方法。

问题12:类对象交给IOC容器来管理,类对象的生命周期中还可能要做什么?

比如创建对象后进行一些初始化

对象销毁后,进行一些特定销毁逻辑

beanDefinition 对Bean工厂提供 初始化的方法和销毁的方法



public interface BeanDefinition {

	/*
	 *获取bean类名
	 */
	Class<T> getBeanClass();

	/**
	 * 作用域
	 */
	String getScope();

	
	/**
	 * 工厂bean名称
	 */
	String getFactoryBeanName();



	/**
	 * 工厂方法名称
	 */
	String getFactoryMethodName();

	/**
	 *是否是单例的
	 */
	boolean isSingleton();
	/**
	 *是否是原型的
	 */
	boolean isPrototype();

    /**
	 * 初始化
	 */
   String getInitMethodName();

	/**
	 * 销毁
	 */
	String getDestroyMethodName();
}

定义一个BeanDefinition接口的实现类GenericBeanDefinition

定义个DefaultBeanFactory 类实现BeanFactory 和 BeanDefinitionRegistry

总结:经过上述问题分析后,我们已经有了下面的类图。初步可以完成IOC容器

 

===================今天到这里,具体代码实现到下节类容=================

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值