spring中的IOC说明

  1. 什么是IOC?

    • 控制反转,把对象创建和对象之间的调用过程交给spring进行管理,为了降低耦合度
  2. 两种IOC接口

    • BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
    • ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建。常用。
  3. 创建ApplicationContext接口实例通常采用ClassPathXmlApplicationContext创建

    //初始化Spring容器,加载配置文件
    ApplicationContext applicationContext =
             new ClassPathXmlApplicationContext("bean.xml");
    //2、通过容器获取userDao实例
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    
  4. spring配置文件的编写

    // Spring文件创建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.xsd">
    
        <!--让指定类配置给Spring,让Spring创建其对象的实例-->
        <bean id = "userDao" class="com.test.springTest.UserDaoImpl"/>
    </beans>
    
  5. 依赖注入

  • DI(依赖注入)与控制反转(IOC)的具体实现,实现IOC思想需要DI做支持,就是在spring这个容器中,你需要将一些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件。依赖:bean对像的创建依赖与容器,注入:bean对象的所有属性,由容器来注入。
  1. 依赖注入的两种方式:set注入,构造方法注入

    参考:https://blog.csdn.net/cold___play/article/details/100059134

    • 构造函数注入

      • user的有参构造
    package com.test.bean;
    
    public class User {
    	
    	private String name;
    	private Integer age;
    	private Car car;
    	
    	public User(String name, Car car) {
    		System.out.println("User(String name, Car car)!!");
    		this.name = name;
    		this.car = car;
    	}
    	
    	public User(Car car,String name) {
    		System.out.println("User(Car car,String name)!!");
    		this.name = name;
    		this.car = car;
    	}
    	
    	public User(Integer name, Car car) {
    		System.out.println("User(Integer name, Car car)!!");
    		this.name = name+"";
    		this.car = car;
    	}
    	
    	public Car getCar() {
    		return car;
    	}
    	public void setCar(Car car) {
    		this.car = car;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    	}
    }
    
    • applicationContext.xml配置:index:用于确定参数的位置,type:用于确定参数的类型,这两个属性可以完全确定一个构造函数。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- 将car对象配置到容器中 -->
    	<bean name="car" class="com.test.bean.Car" >
    		<property name="name" value="保时捷" ></property>
    		<property name="color" value="红色" ></property>
    	</bean>
    
    	<!-- 构造函数注入 -->
       <bean name="user2" class="com.test.bean.User" >
    	<!-- name属性: 构造函数的参数名
    		index属性: 构造函数的参数索引
    		type属性: 构造函数的参数类型  -->
    	  <constructor-arg name="name" value="24" index="0" type="java.lang.Integer"></constructor-arg>
    	  <constructor-arg name="car" ref="car" index="1" ></constructor-arg>
      </bean> 
    </beans>
    
    • set方法注入

      • 每一个实体类为其属性写上相应的set,get方法

      • applicationContext.xml中进行配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- set方式注入: -->
    	<bean  name="user" class="com.test.bean.User" >
    		<!--值类型注入: 为User对象中名为name的属性注入tom作为值 -->
    		<property name="name" value="tom" ></property>
    		<property name="age"  value="18" ></property>
    		<!-- 引用类型注入: 为car属性注入下方配置的car对象 -->
    		<property name="car"  ref="car" ></property>
    	</bean>
    	
    	<!-- 将car对象配置到容器中 -->
    	<bean name="car" class="pers.zhang.bean.Car" >
    		<property name="name" value="保时捷" ></property>
    		<property name="color" value="红色" ></property>
    	</bean>
    </beans>
    
    • 复杂类型的注入

      • 创建一个CollectionBean类:
    package com.test.bean;
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    
    public class CollectionBean {
    	private Object[] arr;//数组类型注入
    	private List list;//list/set 类型注入
    	private Map map;//map类型注入
    	private Properties prop;//properties类型注入
    	
    	public Object[] getArr() {
    		return arr;
    	}
    	public void setArr(Object[] arr) {
    		this.arr = arr;
    	}
    	public List getList() {
    		return list;
    	}
    	public void setList(List list) {
    		this.list = list;
    	}
    	public Map getMap() {
    		return map;
    	}
    	public void setMap(Map map) {
    		this.map = map;
    	}
    	public Properties getProp() {
    		return prop;
    	}
    	public void setProp(Properties prop) {
    		this.prop = prop;
    	}
    	@Override
    	public String toString() {
    		return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop
    				+ "]";
    	}
    }
    
    • applicationContext.xml中进行配置:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
        <!-- set方式注入: -->
    	<bean  name="user" class="com.test.bean.User" >
    		<!--值类型注入: 为User对象中名为name的属性注入tom作为值 -->
    		<property name="name" value="tom" ></property>
    		<property name="age"  value="18" ></property>
    		<!-- 引用类型注入: 为car属性注入下方配置的car对象 -->
    		<property name="car"  ref="car" ></property>
    	</bean>
    
        <bean name="car" class="pers.zhang.bean.Car" >
    		<property name="name" value="保时捷" ></property>
    		<property name="color" value="红色" ></property>
    	</bean>
    
        <!-- 复杂类型注入 -->
        <bean name="cb" class="com.test.CollectionBean" >
            <!-- 数组类型注入 -->
            <property name="arr">
                <!-- 元素顺序与注入顺序一致 -->
    		    <array>
    			    <value>tom</value>
    			    <value>jerry</value>
    			    <ref bean="user" />
    		    </array>
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
            <!-- list类型注入 -->
            <property name="list"  >
    		    <list>
    			    <value>jack</value>
    			    <value>rose</value>
    			    <ref bean="user" />
    		    </list>
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
           <!-- map类型注入 -->
    	    <property name="map"  >
    		    <map>
    			    <!-- 键为字符串,值为字符串 -->
    			    <entry key="url" value="jdbc:mysql ></entry>
    			    <!-- 键为字符串,值为对象 -->
    			    <entry key="user" value-ref="user"  ></entry>
    			    <!-- 键为对象,值为对象 -->
    			    <entry key-ref="user2" value-ref="user2"  ></entry>
    		    </map> 
    	    </property>
        </bean>
        <bean name="cb" class="com.test.CollectionBean" >
      		  <!-- prperties 类型注入 -->
    			<property name="prop"  >
    				<props>
    					<prop key="driverClass">com.jdbc.mysql.Driver</prop>
    					<prop key="userName">root</prop>
    					<prop key="password">1234</prop>
    				</props>
    			</property>
    	</bean>
    </beans>
    
    • 扩展注入方式

      • p命名空间注入:走set方法
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    		xmlns="http://www.springframework.org/schema/beans"
    		xmlns:p="http://www.springframework.org/schema/p"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    
    	<!-- 将car对象配置到容器中 -->
    	<bean name="car" class="com.test.bean.Car" >
    		<property name="name" value="保时捷" ></property>
    		<property name="color" value="红色" ></property>
    	</bean>
    
    <!-- p名称空间注入, 走set方法
    	1.导入P名称空间  xmlns:p="http://www.springframework.org/schema/p"
    	2.使用p:属性完成注入
    		|-值类型: p:属性名="值"
    		|-对象类型: p:属性名-ref="bean名称"
     -->
    	<bean  name="user" class="com.test.bean.User" p:name="Jack" p:age="20" p:car-ref="car"  ></bean>
    </beans>
    
    • c命名空间注入:走构造器方法

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      		xmlns="http://www.springframework.org/schema/beans"
      		xmlns:c="http://www.springframework.org/schema/c"
      		 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
      
      	<!-- 将car对象配置到容器中 -->
      	<bean name="car" class="com.test.bean.Car" >
      		<property name="name" value="保时捷" ></property>
      		<property name="color" value="红色" ></property>
      	</bean>
      
      <!-- c名称空间注入, 走构造方法,要给定有参和无参的构造方法
      	导入c名称空间  xmlns:c="http://www.springframework.org/schema/c"
       -->
      	<bean  name="user" class="com.test.bean.User" c:name="Jack" c:age="20" ></bean>
      </beans>
      
        
    
posted @ 2024-05-12 16:52  Hanyta  阅读(6)  评论(0编辑  收藏  举报