spring中依赖注入的原理

 我来答
她是我的小太阳
高粉答主

推荐于2017-09-04 · 醉心答题,欢迎关注
知道顶级答主
回答量:5.1万
采纳率:83%
帮助的人:8819万
展开全部
  1. Spring 从核心而言,是一个DI 容器,其设计哲学是提供一种无侵入式的高扩展性框架。即无需代码中涉及Spring专有类,即可将其纳入Spring容器进行管理。 

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

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

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

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

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

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

yaoboxiang
2011-12-08
知道答主
回答量:9
采纳率:0%
帮助的人:1.4万
展开全部
应该是在服务器启动的时候,将对象实例加载到容器中去,其实也就是加载到Map中,然后需要用到的时候,直接去Map容器中取值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
疏然69
2011-12-08 · TA获得超过250个赞
知道答主
回答量:240
采纳率:0%
帮助的人:125万
展开全部
spring帮你new好需要的对象,不用你手动new,这就是精髓,理解这句话,你IoC就掌握了~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wong71
2011-12-08 · TA获得超过162个赞
知道答主
回答量:141
采纳率:0%
帮助的人:65.4万
展开全部
反射,java.reflect.*,这个包,好好用用 ,它可以根据字符串来创建对象实例,调用对象方法以及修改对象属性
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pkbisi_159
2011-12-08 · TA获得超过746个赞
知道小有建树答主
回答量:464
采纳率:0%
帮助的人:451万
展开全部
用反射,给你举个简单的例子吧
为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;
}
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式