返回信息流看着书上的解释有点雾霾的感觉,大神们能帮忙解释一下么
这是一条镜像帖。来源:北邮人论坛 / java / #46577同步于 2015/12/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
怎么理解依赖注入
fengzhiya
2015/12/21镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 fengzhiya 的大作中提到: 】
: 看着书上的解释有点雾霾的感觉,大神们能帮忙解释一下么
依赖查询:
class Foo {
void hello() { System.out.println("Hello"); }
}
class Registry { ... }
class Bar {
Foo foo;
pubic Bar() {
this.foo = Registry.get("foo"); // Bar依赖Registry
}
void run() {
foo.hello();
}
}
class Main {
public static void main(String[] args) {
Foo foo = new Foo();
Registry.set("foo", foo);
Bar bar = new Bar();
bar.run();
}
}
依赖注入
class Foo {
void hello() { System.out.println("Hello"); }
}
class Bar {
Foo foo;
pubic Bar(Foo foo) { // Bar不依赖任何registry。
this.foo = foo
}
void run() {
foo.hello();
}
}
class Main {
public static void main(String[] args) {
Foo foo = new Foo();
Bar bar = new Bar(foo);
bar.run();
}
}
一个对象(Bean)所依赖的对象,只能通过以下三种方式来定义:
1. 构造函数的参数
2. 工厂方法的参数
3. 实例化或者从工厂方法返回该对象之后,调用的若干setter方法
对象由容器(Container)负责创建,容器读取配置元信息(Configuration Metadata),知道一个对象依赖哪些对象;容器将被依赖的对象创建好之后再注入到要创建的对象当中(可能是调用工厂方法,可能是调用构造函数,可能是调用构造函数之后调若干setter,可能是反射)从而完成对象的创建
我个人的理解是这样的。可以理解成你提前按照spring的规则在配置文件里写了一些bean的定位信息,相当于弄了一些实例并托管给bean工厂,等你写的代码中引用一些"特定动作"的时候,spring会知道你需要寻找某一个你托管给它的实例,于是它找到这个实例(是使用单例还是新生成对象是依据配置文件来的)并将它安置在你的程序里,这个写指定动作->spring解析动作 ->查找托管的实例 ->安置在你的程序里的动作叫依赖注入。
一个类假如叫做UserService,在上面标上@service注解,在任何需要实例化这个类的地方,只需要声明这个类UserService userService,然后@AutoWired或者@Resource,就直接可以调用它的方法了,不用手动实例化,这就是spring依赖注入或者IOC最流行的用法。(这个只是讲的注解注入,注解注入只是依赖注入的一种方式,还有set注入,构造方法注入等,楼主可以看一下)