Spring 5--IOC容器管理(一)

 一、IOC容器

 1、什么是IOC--控制反转

  •  把对象创建和对象之间的调用过程,交给Spring进行管理
  • 使用IOC目的:为了降低耦合度

 2、IOC底层

  • xml解析、工厂模式、反射

 3、Spring提供的IOC容器实现的两种方式(两个接口)

  • ​BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。
  • ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用。

 二、IOC操作Brean管理

1、什么是Bean管理(Bean管理的两个操作)

  • Spring创建对象
  • Spring注入属性

2、Bean管理操作的两种方式

  • 基于xml配置文件方式实现
  • 基于注解方式实现

3、基于xml方式

      a) 基于xml方式创建对象

 <!--创建对象  id:唯一标识 class:类的全路径-->
 <bean id="user" class="com.spring.User"></bean>
 //实体类 
public class User {
    public void add(){
        System.out.println("add++++++++++++");
    }
 }
 //通过类加载xml创建对象
 @Test
 public void testAdd(){
    ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//获取xml文件,默认获取无参构造方法创建对象
    User user=context.getBean("user", User.class);
    user.add();
 }

      b)基于xml对象注入属性(DI:依赖注入)

   方式一:通过set方式注入

public class User {

    private String name;
    
    public void setName(String name) {
        this.name = name;
    }
}

 xml配置:property中 name对于属性名  value对应属性值

<!--set注入-->
     <bean id="user" class="com.spring.User">
        <property name="name" value="李四"></property>
     </bean>

  方式二:有参构造方式注入

public class User {

    private String name;
    //有参构造方法
    public User(String name) {
        this.name = name;
    }
}
 <!--通过有参构造注入-->
    <bean id="user" class="com.spring.User">
        <constructor-arg name="name" value="王二麻子"></constructor-arg>
    </bean>

 方式三:p名称空间注入(了解即可)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" <!--在这里加入一行-->
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!--p空间注入-->
  <bean id="user" name="com.spring.User" p:bname="小名">
  </bean>

注入空值和特殊符号

<!--设置空值-->
  <bean id="course" class="com.spring.bean.Course">
      <property name="cname">
        <null/>
      </property>
  </bean>
  <!--设置特殊符号 
    1、通过转义
    2、使用<![CDATA[值]]>
  -->
  <bean id="course" class="com.spring.bean.Course">
    <property name="cname">
      <value><![CDATA[<<南京>>]]]></value>
    </property>
  </bean>

 注入属性--外部bean

public class UserService {

    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        System.out.println("service ++++++++++");
        userDao.update();
    }
}

public interface UserDao {
    public abstract void update();
}

public class UserDaoImpl implements UserDao {
    @Override
    public void update() {
        System.out.println("hana");
    }
}
 <!--外部bean注入-->
     <bean id="userService" class="com.spring.service.UserService" >
      <property name="userDao" ref="userDaoImpl"></property>
     </bean>
  
     <bean id="userDaoImpl" class="com.spring.dao.UserDaoImpl" ></bean>

注入属性--内部bean和级联赋值

a)内部bean赋值

public class Emp {

    private String Ename;
    private String gender;
    private dept dept;
    public void setEname(String ename) {
        Ename = ename;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setDept(dept dept) {
        this.dept = dept;
    }
    public void add(){
        System.out.println("ename="+Ename+"gender="+gender+"dept="+dept);
    }
}

public class dept {

    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }
    @Override
    public String toString() {
        return "dept{" +"dname='" + dname + '\'' +'}';
    }
}
  <!--内部bean注入-->
    <bean id="emp" class="com.spring.bean.Emp" >
      <property name="ename" value="小明"></property>
      <property name="gender" value="男"></property>
      <property name="dept">
          <bean id="dept" class="com.spring.bean.dept" >
            <property name="dname" value="技术部"></property>
          </bean>
      </property>
    </bean>

b)级联赋值

<!--级联赋值 方式一-->
    <bean id="emp" class="com.spring.bean.Emp">
        <property name="ename" value="小花"></property>
        <property name="gender" value="女"></property>
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="com.spring.bean.dept">
        <property name="dname" value="财务部"></property>
    </bean>
    <!--级联赋值 方式二(需给dept属性设置get方法)-->
    <bean id="emp" class="com.spring.bean.Emp" >
        <property name="ename" value="小花"></property>
        <property name="gender" value="女"></property>
        <property name="dept" ref="dept"></property>
        <property name="dept.dname" value="人事部"></property>
    </bean>
    <bean id="dept" class="com.spring.bean.dept"></bean>

xml注入集合属性

public class Stu {

    private String[] cour;
    private List<String> list;
    private Map<String,String> map;
    private Set<String> set;
    private List<Course> listcour;
    //设置数组属性
    public void setCour(String[] cour) {
        this.cour = cour;
    }
    //设置list集合属性
    public void setList(List<String> list) {
        this.list = list;
    }
   //设置map集合属性
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
  //设置set集合属性
    public void setSet(Set<String> set) {
        this.set = set;
    }
    //设置list实体类属性
    public void setListcour(List<Course> listcour) {
        this.listcour = listcour;
    }

    public void add() {
        System.out.println("Stu{" +
                "cour=" + Arrays.toString(cour) +
                ", list=" + list +
                ", map=" + map +
                ", set=" + set +
                ", listcour=" + listcour +
                '}');
    }
}
<!--集合属性注入-->
    <bean id="stu" class="com.spring.bean.Stu">
        <!--数组注入-->
        <property name="cour" >
            <array>
            <value>java</value>
            <value>数据库</value>
            </array>
        </property>
        <!--list注入-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>小三</value>
            </list>
        </property>
        <!--map注入-->
        <property name="map">
            <map>
                <entry key="神仙" value="天上"></entry>
                <entry key="阎王" value="地下"></entry>
            </map>
        </property>
        <!--set注入-->
        <property name="set">
            <set>
                <value>ORACLE</value>
                <value>MYSQL</value>
            </set>
        </property>
        <!--list实体类注入-->
        <property name="listcour">
            <list>
                <ref bean="cusor1"></ref>
                <ref bean="cusor2"></ref>
            </list>
        </property>
    </bean>
    <bean id="cusor1" class="com.spring.bean.Course">
        <property name="cname" value="Spring5"></property>
    </bean>
    <bean id="cusor2" class="com.spring.bean.Course">
        <property name="cname" value="Spring6"></property>
    </bean>

把集合注入部分提取出来

public class Book {

    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void add(){
        System.out.println(list);
    }
}

1、在spring配置文件中引入空间名称util

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util" <!--加入一行-->
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"><!--加入一行-->
    <!--提取集合属性注入-->
    <util:list id="listbook">
        <value>小花</value>
        <value>小明</value>
        <value>小红</value>
    </util:list>
    <bean id="book" class="com.spring.bean.Book">
        <property name="list" ref="listbook"/>
    </bean>
</beans>
posted @ 2021-01-09 16:32  学习的过程就是成长  阅读(89)  评论(0)    收藏  举报