Spring学习笔记(三):IOC基于XML配置文件方式操作Bean管理

本文详细介绍了Spring框架中基于XML配置文件的IOC(控制反转)操作,包括Bean管理的概念、XML配置文件创建对象及属性注入的三种方式(set方法、构造器、p名称空间)。此外,还讲解了注入空值、特殊符号、外部Bean、内部Bean、级联赋值、集合属性等特性的实现方法,并探讨了FactoryBean、Bean的作用域、生命周期以及XML自动装配和外部属性文件的应用。

1>IOC操作Bean管理

1.Bean管理概念

  ⑴Bean管理指的是两个操作

      ①Spring创建对象

      ②Spring注入属性:给对象的属性赋值

  ⑵Bean管理操作有两种方式

      ①基于XML配置文件方式实现

      ②基于注解方式实现

2.IOC 操作 Bean 管理:基于XML配置文件方式操作Bean管理

  ⑴XML文件配置Bean文件管理

      ①<bean id="user" class="com.company.spring5.User"></bean>

  ⑵基于XML方式DI(Dependency Injection)依赖注入属性

  ⑶注入方式一:使用set方法进行属性注入

      ①创建Bean类,定义属性和对应的set方法

      ②在Spring XML配置文件配置对象创建的方式,配置属性注入的值

<!--bean标签配置Bean文件地址-->
<bean id="user" class="com.company.spring5.User">
    <!--使用set方法注入属性,name属性:类中的属性的名称,
     value属性:注入属性的值-->
    <property name="name" value="王霏霏"></property>
</bean>

  ⑷ 注入方式二:使用有参构造方法进行属性注入

      ①创建Bean类,定义属性,创建属性对应的有参数的构造方法

      ②在Spring XML配置文件配置有参构造器的调用方式

<bean id="user" class="com.company.spring5.User">
    <constructor-arg name="name" value="王自健"></constructor-arg>
</bean>

  ⑸注入方式三:p名称空间注入
      ①在Spring XML配置文件的标签配置中配置p空间的使用

      ②属性注入

<!--p空间注入使用无参构造器-->
<bean id="user" class="com.company.spring5.User" p:name="章子怡"></bean>

2>基于XML配置文件方式实现IOC:注入属性类型介绍

  ⑴注入空值和特殊符号
      ①使用标签null赋空值

<property name="name"><null/></property>

      ②使用CDATA来赋特殊值,标识CDATA内的内容是值不是特殊符号

<property name="name"><value><![CDATA[<<北京>>]]]></value></property>

  ⑵注入属性—外部Bean
      ①注入外部Bean类的意思是,该Bean类有一个属性指向另一个Bean类,在注入时调用XML文件中此Bean类外部配置好的Bean类

      ②依赖Set方法注入或者依赖有参构造器注入

<!--3.注入外部Bean-->
<bean name="DaoService" class="com.company.spring5.DaoService">
    <!--name:标识Service类中该属性的名称-->
    <!--ref:标识外部Bean的name值,XML文件依赖这个属性注入外部Bean-->
    <property name="dao" ref="Dao"></property>
</bean>
<bean name="Dao" class="com.company.spring5.DaoImpl"></bean>

  ⑶注入属性—内部Bean
      ①注入内部Bean类的意思是,该Bean类有一个属性指向另一个Bean类,在注入时直接在该Bean类的该属性处配置调用的Bean类,依赖该Bean类的注入方式内部注入

<bean id="student" class="com.company.spring5.Student">
    <property name="sname" value="lucy"></property>
    <property name="age" value="17"></property>
    <!--注入内部Bean-->
    <property name="teacher">
        <bean id="teacher" class="com.company.spring5.Teacher">
            <property name="tname" value="Jenny"></property>
        </bean>
    </property>
</bean>

  ⑷注入属性—级联赋值
      ①级联赋值,可以理解成数据库中的级联赋值

      ②方式一:利用外部Bean赋值

<!--5.1级联赋值方式一:利用外部Bean赋值-->
<bean id="student2" class="com.company.spring5.Student">
    <property name="sname" value="Bob"></property>
    <property name="age" value="17"></property>
    <property name="teacher" ref="teacher2"></property>
</bean>
<bean id="teacher2"  class="com.company.spring5.Teacher">
    <property name="tname" value="王五"></property>
</bean>

      ③方式二:利用外部Bean赋值,调用外部Bean的属性进行赋值

      ④方式二要求调用其他Bean类的类中有其他Bean类的get方法
比如说Student类中有一个属性的类型时Teacher类,则应该有该属性的public Teacher getTeacher() {return teacher;}

<bean id="student3" class="com.company.spring5.Student">
    <property name="sname" value="Bob"></property>
    <property name="age" value="17"></property>
    <property name="teacher" ref="teacher3"></property>
    <property name="teacher.tname" value="李四"></property>
</bean>
<bean id="teacher3"  class="com.company.spring5.Teacher"></bean>

  ⑸注入属性—集合属性
      ①注入数组类型数据

<property name="array">
    <array>
        <value>数据库</value>
        <value>Java基础</value>
    </array>
</property>

      ②注入List类型数据

<property name="list">
    <list>
        <value>14</value>
        <value>25</value>
    </list>
</property>

      ③注入Map类型数据

<property name="map">
    <map>
        <entry key="Java" value="基础"></entry>
        <entry key="Spring" value="框架"></entry>
    </map>
</property>

      ④注入Set类型数据

<property name="set">
    <set>
        <value>柳词</value>
        <value>元曲</value>
    </set>
</property>

      ⑤List类型数据注入对象
            ⅰ利用ref标签注入外部设置好的Bean对象

<bean id="course1" class="com.company.spring5.list.Course">
    <property name="cname" value="数学"></property>
</bean>
<bean id="course2" class="com.company.spring5.list.Course">
    <property name="cname" value="语文"></property>
</bean>

<property name="course">
    <list>
        <ref bean="course1"></ref>
        <ref bean="course2"></ref>
    </list>
</property>

      ⑥提取注入集合数据的通用注入部分
            ⅰ头文件要引用名称空间util
在这里插入图片描述

            ⅱ使用util标签完成list集合注入数据

<util:list id="book">
    <value>数学</value>
    <value>语文</value>
    <value>英语</value>
</util:list>
<bean id="bookobject" class="com.company.spring5.list.Book">
	//books属性是List类型数据,ref依赖于id为book的对象
    <property name="books" ref="book"></property>
</bean>

3>基于XML配置文件方式实现IOC:FactoryBean介绍
  ⑴Spring有两种Bean形式
      ①普通bean:class属性为bean类即为该bean实例

      ②工厂bean:该bean类返回的类型为bean类内定义的返回类型
            ⅰ创建FactoryBean类,即该类实现FactoryBean接口

            ⅱ实现接口中的getObject()等方法,在getObject方法内返回想要返回的数据类型

public class MyBean implements FactoryBean<Course> {
    @Override
    public Course getObject() throws Exception {
        Course course=new Course();
        course.setCname("xxxx");
        return course;
    }

            ⅲXML文件配置FactoryBean

<!--7.FactoryBean实例-->
    <bean id="mybean" class="com.company.spring5.factorybean.MyBean"></bean>

            ⅳ测试,FactoryBean类实际返回的是getObject()方法中返回的Course类

public void test8(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
        Course mybean = context.getBean("mybean", Course.class);
        System.out.println(mybean);
    }

4>基于XML配置文件方式实现IOC:Bean作用域介绍
  ⑴Spring中,Bean的作用域有
在这里插入图片描述

  ⑵默认Bean是单实例对象,作用域为singleton

  ⑶设置Bean作用域的方法
   ①Bean标签内scope属性定义作用域

   <!--8.Bean设置作用域为多实例-->
    <bean id="courses1" class="com.company.spring5.list.Course"></bean>
    <bean id="courses2" class="com.company.spring5.list.Course" scope="prototype"></bean>

在这里插入图片描述
4>基于XML配置文件方式实现IOC:Bean生命周期介绍
  ⑴生命周期:从对象创建到对象销毁的过程

  ⑵Bean的生命周期历程
      ①XML文件配置Bean文件,通过无参构造器创建Bean实例

      ②依赖Set方法注入该Bean文件的属性

      ③如果有配置Bean后置处理器)调用后置处理器的postProcessBeforeInitialization方法

      ④配置Bean文件的初始化方法,调用初始化方法

      ⑤(如果有配置Bean后置处理器)调用后置处理器的postProcessAfterInitialization方法

      ⑥获取Bean对象

      ⑦容器关闭时,调用Bean文件配置的销毁方法

Bean生命周期测试XML配置如下

<bean id="beanlife" class="com.company.spring5.life.BeanLife" init-method="init" destroy-method="delete">
        <property name="name" value="xxx"></property>
    </bean>

Bean类配置如下
在这里插入图片描述
实际效果如下
在这里插入图片描述

      ⑧注意事项:配置初始化方法和销毁方法,需要在XML中Bean标签配置时,加上属性init-method,delete-method,属性值写初始化方法和销毁方法的名字

      ⑨如果配置了Bean类的后置处理器,Bean实例会在调用初始化方法之前,调用后置处理器的postProcessBeforeInitialization方法,调用初始化方法之后会调用后置处理器的postProcessAfterInitialization方法

      ⑩设置后置处理器只需要创建一个类,实现BeanPostProcessor接口,即为后置处理器,XML中按照普通Bean方法配置该类,XML解析时自动识别为后置处理器
在这里插入图片描述
后置处理器的配置效果如下
在这里插入图片描述
5>基于XML配置文件方式实现IOC:XML自动装配介绍
  ⑴自动装配:根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入,也就是说Spring在XML配置文件上下文按照指定装配规则查询,查询到就注入到匹配的属性

  ⑵实现自动装配方法:Bean标签设置属性autowire自动装配的方式,不设置默认为不自动装配。
      ①autowire=“no”,标识默认情况下,不自动装配,通过ref属性手动设定

      ②autowire=“byName”,根据该Bean类的属性名(Property标签的name值)和set方法(set属性名)和其他Bean标签id值相同的进行匹配注入

      ③autowire=“byType”,根据该Bean类的属性的类型和Spring会寻找其他Bean类的类型进行匹配注入,使用byType首先需要保证同一类型的对象,在spring容器中唯一,若不唯一会报不唯一的异常。

      ④autowire=“constructor”,使用构造方法完成对象注入,根据构造方法的参数类型进行对象查找,相当于采用byType的方式。即Spring会寻找与参数数据类型相同的bean,通过构造函数将其注入。

      ⑤autowire=“default”,表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。

	<bean id="emp" class="com.company.spring5.autowire.Emp" autowire="byType"></bean>
    <bean id="depdd" class="com.company.spring5.autowire.Dept"></bean>

6>基于XML配置文件方式实现IOC:外部属性文件介绍
以引入数据库连接配置为例
  ⑴直接在XML文件配置数据库信息
      ①引入druid连接池依赖jar包

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/bookserver"></property>
        <property name="username" value="SHY"></property>
        <property name="password" value="123456"></property>
     </bean>

  ⑵引入外部属性文件配置数据库连接池
      ①配置properties配置文件
在这里插入图片描述

      ②XML文件配置名称空间context
在这里插入图片描述

      ③XML配置文件context标签引入外部属性文件

<context:property-placeholder location="jdbc.properties"/>

      ④配置连接池

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${prop.driverClass}"></property>
        <property name="url" value="${prop.url}"></property>
        <property name="username" value="${prop.username}"></property>
        <property name="password" value="${prop.password}"></property>
    </bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值