首页>>后端>>Spring->Spring——依赖注入的方式

Spring——依赖注入的方式

时间:2023-11-29 本站 点击:0

依赖注入(DI)

依赖注入(DI)是一个过程,通过该过程,对象只能通过构造函数参数,工厂方法的参数或在构造或创建对象实例后在对象实例上设置的属性来定义其依赖关系(即,与它们一起工作的其他对象)。从工厂方法返回。然后,容器在创建 bean 时注入那些依赖项。从根本上讲,此过程是通过使用类的直接构造或服务定位器模式来自己控制其依赖关系的实例化或位置的 Bean 本身的逆过程(因此称为 Control Inversion)。

使用 DI 原理,代码更简洁,当为对象提供依赖项时,去耦会更有效。该对象不查找其依赖项,也不知道依赖项的位置或类。结果,您的类变得更易于测试,尤其是当依赖项依赖于接口或抽象 Base Class 时,它们允许在单元测试中使用存根或模拟实现。

DI 存在两个主要变体:基于构造函数的依赖注入和基于 Setter 的依赖注入。

1、构造器注入

1.使用无参构造创建对象(默认使用)

publicUser(){}

2.使用有参构造创建对象

publicUser(Stringname,intage){this.name=name;this.age=age;}

1.构造函数参数下标索引(从0开始)

您可以使用index属性来显式指定构造函数参数的索引

<beanid="user"class="com.cheng.pojo.User"><constructor-argindex="0"value="spring"></constructor-arg><constructor-argindex="1"value="3"></constructor-arg></bean>

2.构造函数参数类型匹配

使用type属性显式指定了构造函数参数的类型,则容器可以使用简单类型的类型匹配。当有两个同类型参数时,不建议使用。

<beanid="user"class="com.cheng.pojo.User"><constructor-argtype="java.lang.String"value="spring"></constructor-arg><constructor-argtype="int"value="3"></constructor-arg></bean>

3.构造函数参数名称

可以使用构造函数参数名称来消除歧义:

<beanid="user"class="com.cheng.pojo.User"><constructor-argname="name"value="spring"/><constructor-argname="age"value="3"/></bean>

2、Set注入方式(常用)

依赖注入:Set注入

依赖:bean对象的创建依赖于容器

注入:bean对象中的所有属性,由容器来注入

环境搭建

1.复杂类型

packagecom.cheng.pojo;publicclassAddress{privateStringaddress;publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}@OverridepublicStringtoString(){return"Address{"+"address='"+address+'\''+'}';}}
packagecom.cheng.pojo;importjava.util.*;publicclassStudent{privateStringname;privateAddressaddress;privateString[]books;privateList<String>hobbys;privateMap<String,String>card;privateSet<String>games;privateStringwife;privatePropertiesinfo;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicAddressgetAddress(){returnaddress;}publicvoidsetAddress(Addressaddress){this.address=address;}publicString[]getBooks(){returnbooks;}publicvoidsetBooks(String[]books){this.books=books;}publicList<String>getHobbys(){returnhobbys;}publicvoidsetHobbys(List<String>hobbys){this.hobbys=hobbys;}publicMap<String,String>getCard(){returncard;}publicvoidsetCard(Map<String,String>card){this.card=card;}publicSet<String>getGames(){returngames;}publicvoidsetGames(Set<String>games){this.games=games;}publicStringgetWife(){returnwife;}publicvoidsetWife(Stringwife){this.wife=wife;}publicPropertiesgetInfo(){returninfo;}publicvoidsetInfo(Propertiesinfo){this.info=info;}@OverridepublicStringtoString(){return"Student{"+"name='"+name+'\''+",address="+address.toString()+",books="+Arrays.toString(books)+",hobbys="+hobbys+",card="+card+",games="+games+",wife='"+wife+'\''+",info="+info+'}';}}

2.真实测试对象

//实现下面所有属性的注入privateStringname;privateAddressaddress;privateString[]books;privateList<String>hobbys;privateMap<String,String>card;privateSet<String>games;privateStringwife;privatePropertiesinfo;

3.applicationContext.xml

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><beanid="address"class="com.cheng.pojo.Address"></bean><beanid="student"class="com.cheng.pojo.Student"><!--第一种:普通值的注入,用value--><propertyname="name"value="万里"/><!--第二种:bean的注入,ref--><propertyname="address"ref="address"/><!--第三种:数组注入--><propertyname="books"><array><value>西游记</value><value>红楼梦</value><value>水浒传</value><value>三国演义</value></array></property><!--第四种:List注入--><propertyname="hobbys"><list><value>打游戏</value><value>看电影</value><value>敲代码</value></list></property><!--第五种:Map注入--><propertyname="card"><map><entrykey="姓名"value="万里"/><entrykey="系别"value="信息工程系"/><entrykey="年级"value="18级"/><entrykey="专业"value="计算机科学与技术"/></map></property><!--第六种:Set注入--><propertyname="games"><set><value>LOL</value><value>COC</value><value>BOB</value></set></property><!--第七种:Null注入--><propertyname="wife"><null/><!--等价于student.setWife(null);--></property><!--<propertyname="wife"value="">等价于student.setWife("");将wife属性设置为空的字符串值--><!--第八种:properties注入--><propertyname="info"><props><propkey="学号">08090335615</prop><propkey="姓名">万里</prop></props></property></bean></beans>

4.测试类

importcom.cheng.pojo.Student;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassMyTest{publicstaticvoidmain(String[]args){ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");Studentstudent=(Student)context.getBean("student");System.out.println(student.toString());}}

测试结果:

publicUser(Stringname,intage){this.name=name;this.age=age;}0

3、拓展方式注入

p命名空间注入和c命名空间注入,不能直接使用,需要导入约束

p命名空间注入 xmlns:p="http://www.springframework.org/schema/p"

c命名空间注入 xmlns:c="http://www.springframework.org/schema/c"

1.环境搭建

packagecom.cheng.pojo;publicclassUser{privateStringname;privateintage;privateAddressaddress;publicUser(){}publicStringgetName(){returnname;}publicUser(Stringname,intage,Addressaddress){this.name=name;this.age=age;this.address=address;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicAddressgetAddress(){returnaddress;}publicvoidsetAddress(Addressaddress){this.address=address;}@OverridepublicStringtoString(){return"User{"+"name='"+name+'\''+",age="+age+",address="+address+'}';}}

2.userbeans.xml

p命名空间注入

publicUser(Stringname,intage){this.name=name;this.age=age;}2

c命名空间注入

publicUser(Stringname,intage){this.name=name;this.age=age;}3

测试类

publicUser(Stringname,intage){this.name=name;this.age=age;}4


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/334.html