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注入(代码片段