spring容器中的依赖注入和ioc那些事
来源:互联网 发布:沙钢收购大数据公司 编辑:程序博客网 时间:2024/05/12 15:44
spring容器中的依赖注入和ioc那些事
1.依赖注入的概念
当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
DI其实就是给属性赋值的过程
2.依赖注入的方法
2.1使用XML注入
第一步:创建一个类Person.javapackagecom.xp.spring.di.xml.setter; importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.Properties;importjava.util.Set; publicclass Person { private Long pid; private String name; private Student student; private List lists; private Set sets; private Map map; private Object[] objects; private Properties properties; public Person(){ System.out.println("person"); } public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } public List getLists() { return lists; } public void setLists(List lists) { this.lists = lists; } public Set getSets() { return sets; } public void setSets(Set sets) { this.sets = sets; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public Object[] getObjects() { return objects; } public void setObjects(Object[] objects) { this.objects = objects; } public Properties getProperties() { return properties; } public void setProperties(Propertiesproperties) { this.properties = properties; } @Override public String toString() { return "Person [pid=" + pid +", name=" + name + ", student=" + student + ", lists=" + lists +", sets=" + sets + ", map=" + map + ", objects=" +Arrays.toString(objects) + ", properties=" + properties + "]"; }}Student.javapackagecom.xp.spring.di.xml.setter; public class Student { public Student(){ System.out.println("student"); } public void say(){ System.out.println("student"); }}
第二步将类放入spring容器中
<bean id="person"class="com.xp.spring.di.xml.setter.Person"> <!-- property描述的就是bean中的属性 name属性就是描述属性的名称 value就是值 如果是基本属性(String),就用value赋值 ref 如果是引用类型,用ref赋值 --> <property name="pid"value="1"></property> <property name="name" value="王二麻子"></property> <property name="student"ref="student"></property> <property name="lists"> <list> <value>list1</value> <value>list2</value> <!-- list中存放一个student对象 --> <ref bean="student"/> </list> </property> <property name="objects"> <list> <value>obj1</value> <ref bean="student"/> </list> </property> <property name="sets"> <set> <value>set1</value> <ref bean="student"/> </set> </property> <property name="map"> <map> <entry key="m1"> <value>m1</value> </entry> <entry key="m2"> <ref bean="student"/> </entry> </map> </property> <property name="properties"> <props> <prop key="p1">p1</prop> <prop key="p2">p2</prop> </props> </property> </bean> <bean id="student"class="com.xp.spring.di.xml.setter.Student" scope="prototype"></bean>
第三步:测试XML注入,创建一个类DIXMLSetterTest.java
packagecom.xp.spring.di.xml.setter.test;import org.junit.Test;importorg.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;importcom.xp.spring.di.xml.setter.Person;public classDIXMLSetterTest { /** * 1、启动spring容器 * 2、给person创建对象 * 3、给student创建对象 * 4、调用person的各个属性的setter方法赋值 * 5、context.getBean * 6、对象调用方法 */ @Test public void testDI_XML_Setter_Default(){ ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)context.getBean("person"); System.out.println(person.toString()); }运行结果:Person[pid=1, name=王二麻子,student=com.xp.spring.di.xml.setter.Student@79a2d512, lists=[list1, list2,com.xp.spring.di.xml.setter.Student@3152cf21], sets=[set1,com.xp.spring.di.xml.setter.Student@21a777b0], map={m1=m1,m2=com.xp.spring.di.xml.setter.Student@339c98d3}, objects=[obj1,com.xp.spring.di.xml.setter.Student@6df55f1d], properties={p2=p2, p1=p1}] @Test public voidtestDI_XML_Setter_Person_Default_Student_Lazyinit_TRUE(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)context.getBean("person"); System.out.println(person.toString()); }运行结果:personstudentstudentstudentstudentstudentPerson [pid=1, name=王二麻子,student=com.xp.spring.di.xml.setter.Student@3f8eae0f, lists=[list1, list2,com.xp.spring.di.xml.setter.Student@30457b62], sets=[set1,com.xp.spring.di.xml.setter.Student@7fd61352], map={m1=m1,m2=com.xp.spring.di.xml.setter.Student@21a777b0}, objects=[obj1,com.xp.spring.di.xml.setter.Student@79a2d512], properties={p2=p2, p1=p1}] /** * 1、启动spring容器 * 2、创建Student对象 * 3、context.getBean * 4、创建person对象 * 5、调用setter方法赋值 * 6、对象调用方法 */ @Testpublic voidtestDI_XML_Setter_Person_Lazyinit_TRUE_Student_Lazyinit_Default(){ApplicationContext context =newClassPathXmlApplicationContext("applicationContext.xml");Person person =(Person)context.getBean("person");System.out.println(person.toString());}/** * 1、启动spring容器 * 2、创建Student对象 * 3、context.getBean * 4、创建person对象 * 5、调用setter方法赋值 * 6、对象调用方法 */ @Test public voidtestDI_XML_Setter_Person_Scope_Prototype_Student_Scope_Default(){ ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)context.getBean("person"); System.out.println(person.toString()); } /** * 1、启动spring容器 * 2、创建person对象 * 3、创建student对象 student的scope为"prototype",但是创建对象在spring容器启动的时候 * 因为Person中的很多属性都依赖于student,而这些属性的赋值发生在spring容器启动的时候 * 4、调用setter方法赋值 * 5、 context.getBean * 6、对象调用方法 */ @Test public voidtestDI_XML_Setter_Person_Scope_Default_Student_Scope_Prototype(){ ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person)context.getBean("person"); System.out.println(person.toString()); }}
spring容器-di-xml-setter与init执行的顺序
在spring容器中添加 <bean id="person"class="com.xp.spring.di.xml.setter.initdestroy.Person" init-method="init">packagecom.xp.spring.di.xml.setter.initdestroy.test; import org.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.xp.spring.di.xml.setter.initdestroy.Person;public class DIXMLSetterInitDestroyTest { /** * 1、启动spring容器 * 2、实例化person,student * 3、调用person的setter方法进行装配 * 4、调用person的init方法 * 5、context.getBean * 6、person调用方法完成任务 */ @Test publicvoid testDI_XML_Setter_InitDestroy(){ ApplicationContextcontext = newClassPathXmlApplicationContext("applicationContext.xml"); Personperson = (Person)context.getBean("person"); System.out.println(person.toString()); }}
spring容器-di-xml-constrcutor与setter
第一步:创建两个类Person,student类package com.xp.spring.di.xml.constructor; import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set; public class Person { privateLong pid; privateString name; privateStudent student; privateList lists; privateSet sets; privateMap map; privateObject[] objects; privateProperties properties; publicPerson(Long pid,String name){ this.pid= pid; this.name= name; } publicPerson(String name,Student student){ this.name = name; this.student= student; } publicvoid init(){ System.out.println("init"); } @Override publicString toString() { return"Person [pid=" + pid + ", name=" + name + ",student=" + student +", lists=" + lists + ", sets=" + sets + ", map="+ map +", objects=" + Arrays.toString(objects) + ", properties=" +properties + "]"; }}packagecom.xp.spring.di.xml.constructor; public class Student { public Student(){ System.out.println("student"); } public void say(){ System.out.println("student"); }}第二步:向spring容器中写入Person,student类<bean id="person"class="com.xp.spring.di.xml.constructor.Person"> <!-- constructor-arg 代表某一个构造器的参数 index 构造器参数的下标 value ref type 类型 --> <constructor-argindex="0" value="1"type="java.lang.String"></constructor-arg> <constructor-argindex="1" ref="student"></constructor-arg> </bean> <beanid="student"class="com.xp.spring.di.xml.constructor.Student"></bean>第三步:创建一个测试类DIXMLSetterConstructorTest.javapublic class DIXMLSetterConstructorTest { @Test publicvoid testDI_XML_Constructor(){ ApplicationContextcontext = newClassPathXmlApplicationContext("applicationContext.xml"); Personperson = (Person)context.getBean("person"); System.out.println(person.toString()); }}运行结果:Person [pid=null, name=1, student=com.xp.spring.di.xml.constructor.Student@27faefe0,lists=null, sets=null, map=null, objects=null, properties=null]而Setter注入 <beanid="person"class="com.xp.spring.di.xml.constructor.setter.Person"> <constructor-argindex="0" value="aaa"></constructor-arg> <constructor-argindex="1" ref="student"></constructor-arg> </bean>spring容器-ioc和di的意义-documentpackagecom.xp.spring.di.xml.constructor.setter.test; public interface Document { publicvoid read(); publicvoid write();}package com.xp.spring.di.xml.constructor.setter.test; public class DocumentManager { /** * 接口 */ privateDocument document; publicDocumentManager(){} publicDocument getDocument() { returndocument; } publicvoid setDocument(Document document) { this.document= document; } publicDocumentManager(Document document){ this.document= document; } publicvoid read(){ //接口调用方法 this.document.read(); } publicvoid write(){ this.document.write(); }}package com.xp.spring.di.xml.constructor.setter.test; public class ExcelDocument implements Document{ publicvoid read() { System.out.println("excelread"); } publicvoid write() { System.out.println("excelwrite"); } }packagecom.xp.spring.di.xml.constructor.setter.test;public class PDFDocument implements Document{ publicvoid read() { System.out.println("pdfread"); } publicvoid write() { System.out.println("pdfwrite"); } }packagecom.xp.spring.di.xml.constructor.setter.test;public class WordDocument implements Document{ publicvoid read() { System.out.println("wordread"); } publicvoid write() { System.out.println("wordwrite"); }}<?xml version="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/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 把documentManager,wordDocument,excelDocument,pdfDocument放入到spring容器中 --> <bean id="documentManager"class="com.xp.spring.di.xml.constructor.setter.test.DocumentManager"> <!-- 该属性是一个接口 --> <propertyname="document"> <refbean="excelDocument"/> </property> </bean> <bean id="wordDocument"class="com.xp.spring.di.xml.constructor.setter.test.WordDocument"> </bean> <bean id="excelDocument"class="com.xp.spring.di.xml.constructor.setter.test.ExcelDocument"> </bean> <beanid="pdfDocument"class="com.xp.spring.di.xml.constructor.setter.test.PDFDocument"> </bean></beans>DocumentTest.javapackage com.itheima11.spring.di.xml.iocdi.test; import org.junit.Test;importorg.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.transaction.annotation.Transactional; importcom.itheima11.spring.di.xml.iocdi.setter.Document;importcom.itheima11.spring.di.xml.iocdi.setter.DocumentManager;import com.itheima11.spring.di.xml.iocdi.setter.WordDocument; public class DocumentTest { @Test publicvoid testDocument_NO_Spring(){ /** * 等号的左边是接口,等号的右边是实现类 */ DocumentwordDocument = new WordDocument(); DocumentManagerdocumentManager = new DocumentManager(wordDocument); documentManager.read(); documentManager.write(); } /** * 在客户端做到了完全的面向接口编程,程序员再也不用在客户端关心document是由谁来实现的 */ @Test publicvoid testDocument_Spring(){ ApplicationContextcontext = newClassPathXmlApplicationContext("applicationContext.xml"); DocumentManagerdocumentManager =(DocumentManager)context.getBean("documentManager"); documentManager.read(); documentManager.write(); }}
spring容器-ioc和di的意义-mvc
PersonDao.javapackage com.xp.spring.di.xml.iocdi.setter.mvc; public interface PersonDao { publicvoid savePerson();}PersonDaoImpl.javapackage com.xp.spring.di.xml.iocdi.setter.mvc; public class PersonDaoImpl implements PersonDao{ publicvoid savePerson() { System.out.println("saveperson"); }}PersonService.javapackage com.xp.spring.di.xml.iocdi.setter.mvc; public interface PersonService { publicvoid savePerson();}package com.xp.spring.di.xml.iocdi.setter.mvc; public class PersonServiceImpl implementsPersonService{ privatePersonDao personDao; publicPersonDao getPersonDao() { returnpersonDao; } publicvoid setPersonDao(PersonDao personDao) { this.personDao= personDao; } publicvoid savePerson() { this.personDao.savePerson(); }}PersonAction.javapackage com.xp.spring.di.xml.iocdi.setter.mvc; public class PersonAction { privatePersonService personService; publicPersonService getPersonService() { returnpersonService; } publicvoid setPersonService(PersonService personService) { this.personService= personService; } publicvoid savePerson(){ this.personService.savePerson(); }}将上述类添加到spring容器中<beanid="personDao"class="com.xp.spring.di.xml.iocdi.setter.mvc.PersonDaoImpl"></bean> <bean id="personService"class="com.xp.spring.di.xml.iocdi.setter.mvc.PersonServiceImpl"> <property name="personDao"> <ref bean="personDao"/> </property> </bean> <bean id="personAction"class="com.xp.spring.di.xml.iocdi.setter.mvc.PersonAction"> <property name="personService"> <ref bean="personService"/> </property> </bean> <bean id="pdfDocument"class="com.xp.spring.di.xml.constructor.setter.test.PDFDocument"> </bean>编写一个测试类packagecom.xp.spring.di.xml.iocdi.setter.mvc.test;import org.junit.Test;import org.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext; importcom.xp.spring.di.xml.iocdi.setter.mvc.PersonAction; public class MVCTest { @Test publicvoid testMVC(){ ApplicationContextcontext = newClassPathXmlApplicationContext("applicationContext.xml"); PersonActionpersonAction = (PersonAction)context.getBean("personAction"); personAction.savePerson(); }}
1 0
- spring容器中的依赖注入和ioc那些事
- AspectCore中的IoC容器和依赖注入
- AspectCore中的IoC容器和依赖注入
- Spring依赖注入(IOC)那些事
- Spring Ioc容器依赖注入
- Spring容器的控制反转(IOC)和依赖注入(DI)
- spring IOC容器的初始化和依赖注入
- Spring框架学习【IoC容器依赖注入】
- Spring的IOC容器—依赖注入
- IOC容器注入依赖
- IoC容器和依赖注入模式
- 初识依赖注入和Ioc容器
- Spring源码学习IOC(5):IOC容器的依赖注入
- spring ioc依赖注入
- spring IOC依赖注入
- spring ioc 依赖注入
- Spring IOC 依赖注入
- Spring IoC依赖注入
- Java中的i=i++
- 指向指针的指针
- phpstorm、pycharm、intellij的多行编辑
- (转载)正确理解cookie和session机制原理
- Python 第三方包的安装
- spring容器中的依赖注入和ioc那些事
- MySQL损坏修复
- Swift 3.0中的函数签名与函数引用
- Java SSO的实现
- 各种文件路径
- 二分查找及其扩展
- 存储直接删除磁盘,导致Linux 因找不到udev的磁盘进不了系统
- 佛说爱情二:前生500次的回眸才换得今生的一次擦肩而过
- 百度的两道笔试编程题