Spring 依赖注入

Posted lemon-le

tags:

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

       白天看了一天的电视;一是因为太热,心浮气躁的看不进书;二是因为这个电视还挺好看,祖峰梅婷侯勇..演的《面具》。电视好看归好看,自己努力赚钱努力学习才是现实;晚上又吵架了,真的是一天一小吵,两天一大吵;有点受不了了!!!读书、学习、升值、加薪才是王道!!!       

       依赖注入也感觉很难理解的样子,其实现在觉得还好,不要给自己暗示说这个难,那个难;其实有些东西只是看起来难,等你真的静下心来去看他,一遍看不懂,看两遍,两遍不懂三遍的时候,总会有点感觉的。还有一点是,学习一个新的知识点时,你先接受他,不要一开始就怀疑他,这样很难把这个东西弄明白,也很容易陷入泥潭!!!

 

学习地址:https://www.w3cschool.cn/wkspring/t7n41mm7.html 

 

两种依赖注入的方法:

1)基于构造函数的依赖注入

2)基于Setter方法的依赖注入

 

基于构造函数的依赖注入

 

技术分享图片

 

使用的实例就是有一个文本编辑器,需要调用拼写检查这个类的拼写检查方法;

 

SpellChecker.java:拼写检查类里有一个拼写检查的方法

package com.lee.instructor;

public class SpellChecker {

    public SpellChecker() {
        System.out.println("Inside SpellChecker constructor");
    }

    public void checkSpelling() {
        System.out.println("Inside checkSpelling.");
    }

}

 

TextEditor.java:这个是编辑类,在构造函数里完成与SpellChecker的依赖;

package com.lee.instructor;

public class TextEditor {
    private SpellChecker spellChecker;

    public TextEditor(SpellChecker spellChecker) {
System.out.println("Inside TextEditor constructor.");
this.spellChecker = spellChecker; } public void spellCheck() { spellChecker.checkSpelling(); } }

当容器调用带有一组参数的类构造器时,基于构造函数的DI就完成了,其中每个参数代表一个对其他类的依赖。我的理解:

public TextEditor(SpellChecker spellChecker)  此处就是TextEditor与SpellChecker类建立联系。

 

Beans.xml:基于构造函数注入的配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="textEditor" class="com.lee.instructor.TextEditor">
        <constructor-arg ref="spellChecker"></constructor-arg>
    </bean>

    <bean id="spellChecker" class="com.lee.instructor.SpellChecker">
    </bean>

</beans>

 

技术分享图片

 

基于设置函数的依赖注入

 技术分享图片

 

SpellChecker.java: 

package com.lee.another;

public class SpellChecker {
    public SpellChecker() {
        System.out.println("Inside SpellChecker constructor.");
    }
    
    public void checkSpelling() {
        System.out.println("Inside checkSpelling.");
    }

}

 

TextEditor.java:

package com.lee.another;

public class TextEditor {
    private SpellChecker spellChecker;

    public SpellChecker getSpellChecker() {
        return spellChecker;
    }

    public void setSpellChecker(SpellChecker spellChecker) {
        System.out.println("Inside setSpellChecker");
        this.spellChecker = spellChecker;
    }

    public void spellCheck() {
        spellChecker.checkSpelling();
    }

}

 

当容器调用一个无参的构造函数或一个无参的静态factory方法来初始化bean后;通过容器在bean上调用设置函数,基于设置函数的DI就完成了。

 

MainApp.java:

package com.lee.another;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans2.xml");
        TextEditor tx = (TextEditor) context.getBean("textEditor");
        tx.spellCheck();
    }

}

 

Beans2.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="textEditor" class="com.lee.another.TextEditor">
        <property name="spellChecker" ref="Spell"></property>
    </bean>

    <bean id="Spell" class="com.lee.another.SpellChecker">
    </bean>

</beans>

 

bean里的property属性:

name:表示的是TextEditor类中的spellChecker参数;

ref:引用一个已经存在的对象,可以引用其他的bean对象:

value:创建一个新的对象;可以赋值一些简单类型的值 

 

技术分享图片

 

注入内部Beans:

这个是Beans.xml文件的一种写法,其余的不变,把一个bean内嵌到另一个bean里,如:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="textEditor" class="com.lee.third.TextEditor">
        <property name="spellChecker" >
            <bean id="Spell" class="com.lee.third.SpellChecker"> </bean>
        </property>
    </bean>

</beans>

 

码云:https://gitee.com/lemon_le/w3-Spring/tree/master/DI

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

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Android 片段和依赖注入

Android片段和依赖注入

Spring依赖注入的方式

spring依赖注入,和控制反转。用自己的话说是怎么说的。最好能够用代码来解释

Spring设置注入和构造注入的区别