SpringIoc实现机制——简析

原创
小哥 3年前 (2022-10-27) 阅读数 8 #大杂烩

需要明确的是,任何项目都已经消失了。Spring,还能做什么,那为什么Spring天气还会这么热吗?答案是Spring两个特点IoC与AOP,这里需要注意的是,它并不是Spring提出的AOP这个概念只能说是Spring非常好的实现。AOP特点。所以,这一次我们先来讨论一下。Spring IoC实施机制。

  • IoC那是什么?
  • IoC具体的实施机制是什么?
  • 模拟Spring IoC的实现
  • Spring源码中的IoC
  • 参考资料

一、IoC那是什么?

IoC的e文叫做Inversion of Control,翻译为控制反转,然后 IoC你到底交了什么? 在面向对象的世界下思考,如果我们想要在对象中。A在中,操作对象B,那么A一定会坚持下去B引用(对象关系),然后才能操作。这样做的问题是 代码不够干净,代码维护成本高,耦合度高。

那么,Spring IoC为这个问题带来了解决方案,Spring对象之间的依赖关系在配置文件中管理,也就是说。Spring的DI——Dependency Injection(依赖注入),同时,任何对象都应该有一个地方来保存他,也就是。IoC容器,IoC集装箱里装着所有的Bean对象,则此Bean对象是真实的Object。Spring通过IoC容器,这些容器反过来操作这些Bean从而达到管理这些对象和对列的一些附加操作的目的。

然后回答前面的问题:

Q:IoC是什么?

A:IoC是控制反向器。

Q:IoC推翻了什么?

A:IoC反转对象的创建和依赖关系,Spring对象的创建和对象之间的依赖关系被移交。IoC集装箱要管理,管理的标准,就是轮廓。

二、IoC具体的实施机制是什么?

思考下,Spring由于对象的依赖关系是通过配置文件管理的,并且IoC这种关系是实现的。那么,这是否意味着我们要做以下两件事:

1.解析配置文件,获取对象信息

2.创建它们是合理的

所以,现在试着按照这个想法

三、模拟Spring IoC的实现

第一步,解析配置文件,获取对象信息;因为Spring配置文件为*.xml档案,就是,XML文件的分辨率。




    

    
        
    

对XML该解析使用JDOM,jdom下载地址: http://www.jdom.org/downloads/index.html

在第二步中,它们将根据解析的关系被实例化。这里使用的技术是:反射机制

public class ClassPathXmlApplicationContext implements BeanFactory
{
    private Map beans = new HashMap();  //IoC容器

    public ClassPathXmlApplicationContext() throws Exception
    {
        SAXBuilder builder = new SAXBuilder();
        Document document = builder.build( this.getClass().getClassLoader().getResource( "resource/beans.xml" ) );

        Element root = document.getRootElement();

        List list = root.getChildren( "bean" );                // 包揽所有bean的Element

        for( int i = 0; i < list.size(); i++ )
        {
            Element element = (Element)list.get( i );

            String  id    = element.getAttributeValue( "id" );          
            String  clazz = element.getAttributeValue( "class" );

            System.out.println( id + " : " + clazz );
            Object obj = Class.forName( clazz ).newInstance();          // 1th.实例化Bean对象
            beans.put( id, obj );

            /**
             *  

                
                    
                
             */
            // 2th.注入依赖
            // 获得所有property属性
            for( Element propertyElement : (List)element.getChildren( "property" ) )
            {
                String name       = propertyElement.getAttributeValue( "name" );    // userDAO
                String injectBean = propertyElement.getAttributeValue( "bean" );    // u;
                Object propertyObj = beans.get( injectBean );

                // 3th.拼接userService中 userDAO属性 的 setter方法
                // name.substring( 0, 1 ).toUpperCase() 将 u 变成大写
                String methodName = "set" + name.substring( 0, 1).toUpperCase() + name.substring( 1 );

                System.out.println( "method name = " + methodName );

                /**
                 * getMethod 返回对象的方法。..此方法来自对象的公共方法或接口。     反射机制
                 * Returns a Method object that reflects the specified 
                 * public member method of the class or interface represented by this Class object. 
                 */
                Method m = obj.getClass().getMethod( methodName, propertyObj.getClass().getInterfaces() );
                // 4th.注入
                m.invoke( obj, propertyObj );
            }
        }
    }

    @Override
    public Object getBean( String name ) 
    {
        return beans.get( name );
    }
}

完整项目的样例代码位于: Spring Ioc模拟源码 ,运行com.hzy.test中的UserServiceTest.java即可。

四、Spring中IoC实现(源代码)

首先,如上图所示,Spring的核心组件Core、Context、Bean这三个;这三个创造了Spring基础,它决定了上面的水平,IoC、AOP、Transaction....这些功能功能。

4.1 这三个核心组件协同工作。

所以看看这三个组件负责什么,把Spring想象一部大型舞台剧,然后:

Context:这部舞台剧的场景和硬件设施

Core    这部舞台剧的工作人员负责协调和调动资源。

Bean   :这个舞台不是戏剧演员。

那么每个组件的实际工作是,Bean包装了Object,Object包含数据;Context为Bean在维护的同时提供生活环境Bean与此之间的关系Context对应的Bean这组关系称为IoC容器;而Core就是发现、建立和维护每个Bean两者之间的关系提供了相应的工具类。

下面就以ClassPathXmlApplicationContext来解释这些概念。

查看Api文档,查找ClassPathXmlApplicationContext继承了BeanFactory,BeanFactory是Bean组件的顶级接口,BeanFactory提供了对Bean定义、创造、解决。Bean组件在org.springframework.beans在包裹下面。在同一时间Bean Factory最直接的实现类是。DefaultListableBeanFactory,则在此类中定义一个集合来保存类对象。

Context组件,为了实现资源的调度,ResourceLoader接口,以及Context的ApplicationContext接口继承BeanFactory,这样Context通过ApplicationContext您可以保证访问任何外部资源。

那么我们就实现了Spring IoC这个想法很简单:

1th.解析XML,获取相应的Bean定义

2th.实例化Bean

3th.按注射方式注射 (例如property)

4th.带反射的注入

五、小结

Spring它是一个优秀的开源框架,很多内容都值得学习。

下一节将讨论AOP的实现,AOP是对传统OOP一份增刊,AOP与OOP令人担忧的是:

OOP:

将需求函数划分为不同的、相对独立的、封装良好的类,并让它们拥有自己的行为,依赖于集成和多态来定义它们的关系。

AOP:

将公共需求功能从不相关的类中分离出来,使许多类能够共享单个行为。

6.参考资料

马士兵 《Spring视频》

徐凌波的深入分析。 Java Web 科技内幕

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除