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
原创粉丝点击