Hor*_*ice 4 java oop spring dependency-injection
我正在学习 Java 的 Spring 框架。这一切都与依赖注入有关。是否有博客或一些资源或示例可以用来理解 RAW 依赖注入?换句话说,没有注释或 xml 或任何容器。纯java代码中的依赖注入是什么样的?
先感谢您!
它看起来像这样(假设所有 bean 都是原型范围):
class BeanToBeInjected {
}
class BeanThatNeedsInjection {
BeanToBeInjected beanToBeInjected;
public void setBeanToBeInjected(BeanToBeInjected beanToBeInjected) {
this.beanToBeInjected = beanToBeInjected;
}
}
class BeanFactory {
public Object createBean(String id) {
if("beanThatNeedsInjection".equals(id) {
BeanThatNeedsInjection beanThatNeedsInjection = new BeanThatNeedsInjection();
beanThatNeedsInjection.setBeanToBeInjected(new BeanToBeInjected());
return beanThatNeedsInjection;
}
return null;
}
}
class MyService {
public void service() {
BeanThatNeedsInjection beanThatNeedsInjection =
new BeanFactory().createBean("beanThatNeedsInjection");
}
}
Run Code Online (Sandbox Code Playgroud)
当然,可以通过反射和 cglib 等其他库来增强,以动态创建代理类。
纯Java 中的依赖注入是一个非常简单的概念。假设您有一个类A
,B
如下所示:
public class A{
private B instanceOfB = new B();
public method doSomething(){
// does something involving B
}
}
Run Code Online (Sandbox Code Playgroud)
类A
在内部实例化类B
,因此B
成为A
类的依赖项。如果你想孤立地测试A
,你无法做到(因为它依赖于B
)。如果您想提供A
的不同实现B
,则必须编辑 的源代码A
,这并不总是可能的,或者只是不是最好的主意。
相反,请考虑通过构造函数注入依赖项(这是您可以使用 Spring 选择的方法之一)。您为 创建一个公共构造函数A
,它接受 aB
作为参数:
class A{
private B instanceOfB;
public A(B instanceOfB){
this.instanceOfB = instanceOfB;
}
public method doSomething(){
// does something involving B
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您不再在类内部构造对象,而是在外部代码中为其提供(注入)一个参数。这样做的优点是您可以传递 的不同实现B
或模拟来进行测试:
class B{ // whatever }
class B2 extends B{ // whatever }
A anInstanceOfA = new A(new B()); // this is ok, A will internally use B
A anotherInstanceOfA = new A(new B2()); // and this instance will use B2 instead
Run Code Online (Sandbox Code Playgroud)
如果B
和B2
实现相同的接口或B2
扩展B
,您可以根据您的需要互换使用它们。这提供了很大的灵活性。这基本上就是没有 DI 容器的依赖注入的工作原理。Spring 对于小型应用程序来说可能有点大材小用,但基本思想非常简单,它是一个很好的实践,你绝对应该使用它。
Java Brains是学习 Spring(和其他东西)基础知识的一个很好的资源。