Spring学习——IOC容器(一)

2.IOC容器

1.IOC容器

1.什么是IOC(控制反转)

​(1) 把对象创建和对象之间的调用过程,交给Spring进行管理
​(2) 使用IOC目的:为了降低耦合度
(3)人们案例就是IOC实现
在这里插入图片描述

2.IOC底层原理

xml解析、工厂模式、反射

(1) .xml解析

xml配置文件,配置创建的对象

<bean id=" " class=" "></bean>
(2).工厂模式

定义一个中间静态函数,降低其耦合度

(3).反射

通过反射创建对象

Class xx=Class.forName(classValue);
xx.newInstance();
3.画图讲解IOC底层原理

在这里插入图片描述

4.IOC接口
1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
2.Spring提供的IOC容器实现的两种方式(两个接口)

(1)BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)

(2)ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!

3.ApplicationContext接口的实现类

在这里插入图片描述

2.IOC容器-Bean管理

1.什么是Bean管理

(0)Bean管理就是两个操作:
(1)Spring创建对象;
(2)Spring注入属性;

2.Bean管理操作有两种方式

(1)基于XML配置文件配置方式实现
(2)基于注解方式实现

3.IOC操作Bean管理
1.基于XML配置文件创建对象
<!--配置User对象创建-->
<bean id="user" class="com.lhl.Spring5.User"></bean>

(1)在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
(2)在bean标签里有很多属性,介绍常用属性

*id属性:唯一属性

*class属性:类的全路径(包类路径)

(3)创建对象的时候,默认也是执行无参构造方法

2.基于XML方式注入属性

1.DI:依赖注入(注入属性)
set方式注入

(1)传统方式:
1)创建类,定义属性和对应的set方法

public class Book {

  //创建属性
  private String bname;

  private String bauthor;
  //创建属性对应的set方法
  public void setBname(String bname) {
    this.bname = bname;
  }

  public void setBauthor(String bauthor) {
    this.bauthor = bauthor;
  }

2)在spring配置文件配置对象创建,配置属性注入

<!--set方法注入属性-->
<bean id="book" class="com.lhl.Spring5.Book">
  <!-- 使用property完成属性注入
   name:类里面属性的名称
   value:向属性里注入的值
   -->
  <property name="bname" value="sun"></property>
  <property name="bauthor" value="moon"></property>
</bean>

3)测试

  @Test
  public void testBook() {
//1.加载spring配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
    Book book = context.getBean("book", Book.class);

//2.或其配置创建的对象
    System.out.println(book);
    book.testDemo();
  }

(2)有参构造函数注入

1)创建类,定义属性,创建属性对应有参构造方法

public class Orders {

  private String oname;
  private String address;

  public Orders(String oname,String address) {
    this.oname = oname;
    this.address = address;
  }

2)在spring配置文件中进行配置

<!--3.有参构造注入属性-->
<bean id="orders" class="com.lhl.Spring5.Orders">
  <constructor-arg name="oname" value="stayreal"></constructor-arg>
  <constructor-arg name="address" value="China"></constructor-arg>
</bean>

3)测试

 @Test
  public void testOrders() {
//1.加载spring配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
    Orders orders = context.getBean("orders", Orders.class);

//2.或其配置创建的对象
    System.out.println(orders);
    orders.ordersTest();

  }

(3)p名称空间注入(了解)

1)使用p名称空间注入,可以简化基于xml配置方式

<!--1、添加p名称空间在配置文件头部-->
<?xml version="1.0" encoding="UTF-8"?>
<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" 
 <!--在这里添加一行p-->

<!--2、在bean标签进行属性注入(算是set方式注入的简化操作)-->
<bean id="book" class="com.atguigu.spring5.Book" p:bname="very" p:bauthor="good">
</bean>
3.xml注入其他类型属性

(1)字面量
1)null值

<!-- null值  -->>
<property name="address" >
  <null/>
</property>

2)属性包含特殊符号

<!-- 属性值中包含特殊符号
     a 把<>进行转义 &lt; &gt;
     b 把带特殊符号内容写到CDATA
     -->
  <property name="address">
    <value> <![CDATA[<<南京>>]]></value>
  </property>

</bean>
4.注入属性-外部bean

(1)创建两个类service和dao类
(2)在service调用dao里面的方法

public class UserService {

//  创建UserDao类型属性,生成set方法
  private UserDao userDao;

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

  public void add(){
    System.out.println("service add.");

//  原始方式  创建UserDao的对象
//    UserDao userDao = new UserDaoImpl();
    userDao.update();

  }

(3)在spring配置文件中进行配置

<!--1.service和dao队形创建-->
<bean id="userService" class="com.lhl.Spring5.service.UserService">

  <!--  注入userDao对象
  name属性值:类里面的属性名称
  ref属性值:创建userDao对象bean对象标签id值
  -->
  <property name="userDao" ref="userDaoImpl"></property>


</bean>
<bean id="userDaoImpl" class="com.lhl.Spring5.dao.UserDaoImpl"></bean>
5.注入属性-nebulabean和级联赋值

(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门(部门是一,员工是多)
(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

//部门类
public class Dept {
  private String dname;
  public void setDname(String dname) {
    this.dname = dname;
  }


//员工类
public class Emp {
  private String eName;
  private String gender;
//员工属于某一部门,使用对象形式表示
  private Dept dept;

  public void setDept(Dept dept) {
    this.dept = dept;
  }

  public void seteName(String eName) {
    this.eName = eName;
  }

  public void setGender(String gender) {
    this.gender = gender;
  }

(3)在spring配置文件中进行配置

<!-- 内部bean -->
<bean id="emp" class="com.lhl.Spring5.bean.Emp">
  <!--  设置两个普通属性  -->
  <property name="eName" value="lhl"></property>
  <property name="gender" value=""></property>
  <!--设置对象类型属性-->
  <property name="dept">
    <bean id="dept" class="com.lhl.Spring5.bean.Dept">
      <property name="dname" value="baidu"></property>

    </bean>
  </property>

</bean>
6. 注入属性-级联赋值

(1)第一种写法

<!-- 级联赋值 -->
<bean id="emp" class="com.lhl.Spring5.bean.Emp">
  <!--  设置两个普通属性  -->
  <property name="eName" value="lhl"></property>
  <property name="gender" value=""></property>
  <!--级联赋值-->
  <property name="dept" ref="dept"></property>

</bean>
<bean id="dept" class="com.lhl.Spring5.bean.Dept">
  <property name="dname" value="huawei"></property>
</bean>

(2)第二种写法

 private Dept dept;
//  生成dept的get方法


  public Dept getDept() {
    return dept;
  }
<!-- 级联赋值 -->
<bean id="emp" class="com.lhl.Spring5.bean.Emp">
  <!--  设置两个普通属性  -->
  <property name="eName" value="lhl"></property>
  <property name="gender" value=""></property>
  <!--级联赋值-->
  <property name="dept" ref="dept"></property>
  <property name="dept.dname" value="jindong"></property>

</bean>
<bean id="dept" class="com.lhl.Spring5.bean.Dept">
  <property name="dname" value="huawei"></property>
</bean>
7.IOC 操作 Bean 管理——xml 注入集合属性

1.注入数组类型的属性
2.注入List集合类型属性
3.注入Map集合类型
(1)创建类,定义数组、list、map、set类型属性生成对应的set方法

public class Stu {
  //1.创建数组类型属性
  private String[] courses;
  //2.创建List集合类型属性
  private List<String> list;
  //3.创建Map集合类型的属性
  private Map<String, String> maps;
  //4.创建Set集合类型的属性
  private Set<String> sets;
  

  public void setSets(Set<String> sets) {
    this.sets = sets;
  }


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

  public void setMaps(Map<String, String> maps) {
    this.maps = maps;
  }


  public void setCourses(String[] courses) {
    this.courses = courses;
  }


}

(2)在spring配置文件中进行配置

<!-- 1.集合类型属性注入 -->
<bean id="stu" class="com.lhl.Spring5.CollectionType.Stu">
  <!-- 数组类型属性注入 -->
  <property name="courses">
    <array>
      <value>java</value>
      <value>c++</value>
    </array>
  </property>
  <!-- list类型属性注入 -->
  <property name="list">
    <list>
      <value>lhl</value>
      <value>lll</value>
    </list>
  </property>
  <!-- maps类型属性注入 -->
  <property name="maps">
    <map>
      <entry key="JAVA" value="java"></entry>
      <entry key="C++" value="c++"></entry>
    </map>
  </property>
  <!-- sets类型属性注入 -->
  <property name="sets">
    <set>
      <value>MySql</value>
      <value>Redis</value>
    </set>
  </property>


</bean>
8.在集合里面设置对象类型值
<!--  创建多个course对象-->
  <bean id="course1" class="com.lhl.spring5.collectiontype.Course">
    <property name="cname" value="Spring框架"></property>

  </bean>
  <bean id="course2" class="com.lhl.spring5.collectiontype.Course">
    <property name="cname" value="Django框架"></property>

  </bean>








<!--  注入List集合对象,值是对象  -->

    <property name="courseList">

      <list>

        <ref bean="course1"></ref>
        <ref bean="course2"></ref>

      </list>

    </property>
9.把集合注入部分提取出来

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

<?xml version="1.0" encoding="UTF-8"?>
<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">


</beans>

(2)使用 util 标签完成 list 集合注入提取

<!--1 提取list集合类型属性注入-->
<util:list id="bookList">
  <value>易筋经</value>
  <value>九阴真经</value>
  <value>九阳神功</value>
</util:list>
<!--2 提取list集合类型属性注入使用-->
<bean id="book" class="com.lhl.spring5.collectiontype.Book" scope="prototype">
  <property name="list" ref="bookList"></property>
</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十三幺Shisanyao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值