spring中依赖注入的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中依赖注入的原理相关的知识,希望对你有一定的参考价值。

    Spring 从核心而言,是一个DI 容器,其设计哲学是提供一种无侵入式的高扩展性框架。即无需代码中涉及Spring专有类,即可将其纳入Spring容器进行管理。 

    作为对比,EJB则是一种高度侵入性的框架规范,它制定了众多的接口和编码规范,要求实现者必须 遵从。侵入性的后果就是,一旦系统基于侵入性框架设计开发,那么之后任何脱离这个框架的企图都将付 出极大的代价。

    为了避免这种情况,实现无侵入性的目标。Spring 大量引入了Java 的Reflection机制,通过动态 调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入机制的实现基础。

    org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper 和BeanFactory类。这两个类从技术角度而言并不复杂,但对于Spring 框架而言,却是关键所在。

    InputStream is = new FileInputStream("bean.xml"); XmlBeanFactory factory = new XmlBeanFactory(is); Action action = (Action) factory.getBean("TheAction");

    此时获得的Action实例,由BeanFactory进行加载,并根据配置文件进行了初始化和属性设定。

    联合上面关于BeanWrapper的内容,可以看到,BeanWrapper实现了针对单个Bean的属性设 定操作。而BeanFactory则是针对多个Bean的管理容器,根据给定的配置文件,BeanFactory从中读取 类名、属性名/值,然后通过Reflection机制进行Bean加载和属性设定。

参考技术A 应该是在服务器启动的时候,将对象实例加载到容器中去,其实也就是加载到Map中,然后需要用到的时候,直接去Map容器中取值 参考技术B spring帮你new好需要的对象,不用你手动new,这就是精髓,理解这句话,你IoC就掌握了~ 参考技术C 反射,java.reflect.*,这个包,好好用用 ,它可以根据字符串来创建对象实例,调用对象方法以及修改对象属性 参考技术D 用反射,给你举个简单的例子吧
为student实例,注入nameString
public class reflect

public static void main(String[] args)

student s = new student();
Class cl = s.getClass();
try

java.lang.reflect.Method m = cl.getMethod("setNameString", new Class[]String.class);
m.invoke(s, "zhangsan");
System.out.println(s.getNameString());
catch (IllegalArgumentException e)
e.printStackTrace();
catch (IllegalAccessException e)
e.printStackTrace();
catch (InvocationTargetException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (NoSuchMethodException e)
// TODO Auto-generated catch block
e.printStackTrace();



class student

private String nameString;

public String getNameString()
return nameString;


public void setNameString(String nameString)
this.nameString = nameString;

以上是关于spring中依赖注入的原理的主要内容,如果未能解决你的问题,请参考以下文章

编码剖析Spring依赖注入的原理

Spring中依赖注入底层原理与源码分析

串线篇spring泛型依赖注入原理

Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理

spring中的依赖注入有啥用?

Spring 依赖注入