Dependency pull Via JNDI Lookup
package com.apress.prospring5.ch3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DependencyPull {
public static void main(String... args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/app-context.xml");
MessageRenderer mr = ctx.getBean("renderer", MessageRenderer.class);
mr.render();
}
}
Spring 。ApplicationContext注入bean和获取Bean。
package com.apress.prospring5.ch3;
public interface ManagedComponent {
void performLookup(Container container);
}
public interface Container {
Object getDependency(String key);
}
public class ContextualizedDependencyLookup
implements ManagedComponent {
private Dependency dependency;
@Override
public void performLookup(Container container) {
this.dependency = (Dependency) container.getDependency("myDependency");
}
@Override
public String toString() {
return dependency.toString();
}
}
容器获取Bean(Contextualized Dependency Lookup)
package com.apress.prospring5.ch3;
public class ConstructorInjection {
private Dependency dependency;
public ConstructorInjection(Dependency dependency) {
this.dependency = dependency;
}
@Override
public String toString() {
return dependency.toString();
}
}
通过构造器注入
package com.apress.prospring5.ch3;
public class SetterInjection {
private Dependency dependency;
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
@Override
public String toString() {
return dependency.toString();
}
}
通过setter注入
Injection 和 Lookup
Spring使用的注入,而EJB使用的是Lookup
public void performLookup(Container container) {
this.dependency = (Dependency) container.getDependency("myDependency");
}
这种lookup的方式,container可能为null,key可能或改变,以及bean的类型可能不对。
Spring可以依赖注入EJB
Injection绝对比Lookup是更好的选择,更简洁。Injection不会和Bean的容器耦合
SETTER INJECTION AND CONSTRUCTOR INJECTION
Constructor Injection 优点:
1.不可变类
Setter Injection 优点:
1.可以把Setter放到接口里,让实现类知道需要依赖哪些组件(最好不这样做)