Spring-IOC-xml方式

简介

**控制反转**(Inversion of Control,缩写为**IoC**),是[面向对象编程]中的一种设计原则,可以用来减低计算机[代码]之间的[耦合度]。其中最常见的方式叫做[依赖注入]Dependency Injection,简称DI),还有一种方式叫"依赖查找"(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

控制反转IOC: 把对象创建和对象之间的调用过程,交给spring进行管理

使用IOC目的: 为了降低耦合度

上面的入门案例 就是IOC实现

底层原理

使用xml 解析,工厂模式,反射
IOC接口 (BeanFactory)

IOC思想基于IOC容器完成,IOC容器底层就是工厂对象

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

(1)BeanFactory: IOC 容器基本实现,是spring内部的使用接口,不提供开发人员进行使用

加载配置文件时,不会创建对象,在获取(使用)对象时,才去创建对象

(2)ApplicationContext:ApplicationContext是BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,

加载配置文件时候就会把 配置文件中配置的对象进行创建

IOC操作Bean管理

  1. 什么是bean管理

bean管理指的是两个操作:

a. spring 创建对象

b. spring 注入属性

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

a 基于xml方式

b.基于注解方式

基于xml方式创建对象

(1)在spring配置文件种,使用bean标签,标签里面添加对应的属性,就可以实现对象创建

(2)bean标签常用属性

id属性: 唯一标识

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

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

<!--配置User对象创建-->

<bean id="user" class="com.ly.User">

基于xml方式注入属性

(1)DI: 依赖注入, 就是注入属性

第一种子 注入方式: 使用set方法进行注入

(a) 创建类,定义属性和setter

java 复制代码
 package com.ly;
 ​
 public class Book {
 ​
    //创建属性
     private String bName;
     private String author;
 ​
     public void setbName(String bName) {
         this.bName = bName;
     }
     public void setAuthor(String author) {
         this.author = author;
     }
     public void print(){
         System.out.println(bName+","+author);
     }
 }
复制代码
 ​

(b) 在spring配置文件中 ,配置对象及属性

XML 复制代码
<!--使用set 方法注入属性-->
    <bean id="book" class="com.ly.Book">
        <!--使用property完成属性注入
           name:类里面属性名称
           value:向属性注入的值
        -->
        <property name="author" value="王丽丽"></property>
        <property name="bName" value="李四"></property>
    </bean>

(c)测试

复制代码
  
java 复制代码
@Test
     public void tesBook(){
         //1. 加载spring配置文件
         ApplicationContext context = new ClassPathXmlApplicationContext("demo1.xml");
         //2.获取 配置创建的对象
         Book book = context.getBean("book", Book.class);
         book.print();
     }
 ​
复制代码
 控制台输出:
 李四,王丽丽

有参构造方法进行注入

(a) 创建类,定义属性,生成带参构造方法

复制代码
 
java 复制代码
package com.ly;
 // 使用 有参构造注入
 public class Order {
     private String oName;
     private String address;
 ​
    
     public Order(String oName, String address) {
         this.oName = oName;
         this.address = address;
     }
       //为了测试 结果 添加的
      public void print(){
         System.out.println(oName+"::"+address);
     }
 }

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

XML 复制代码
 <!--使用 带参构造方式注入-->
     <bean id="order" class="com.ly.Order">
         <constructor-arg name="address" value="天津市"></constructor-arg>
         <constructor-arg name="oName" value="玩具车"></constructor-arg>
     </bean>

(c) 测试

复制代码
 
java 复制代码
 @Test
     public void tesOrder(){
         //1. 加载spring配置文件
         ApplicationContext context = new ClassPathXmlApplicationContext("demo1.xml");
         //2.获取 配置创建的对象
         Order order = context.getBean("order", Order.class);
         order.print();
     }
复制代码
 ​
 ​
 控制台输出 :
 玩具车::天津市

p命名空间注入

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

a. 添加p命名空间 xmlns:p="http://www.springframework.org/schema/p"

XML 复制代码
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"     
        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">
复制代码
 ​

b.进行属性注入,在bean标签里面进行操作

XML 复制代码
 <bean id="book" class="com.ly.Book" p:author="李四" p:bName="html"></bean>

基于xml注入其他类型属性

1.字面量(固定值)

a. null值 ---<null/> 标签

XML 复制代码
<bean id="book" class="com.ly.Book">
 ​
         <property name="author" value="王丽丽"></property>
         <property name="bName" value="李四"></property>
         <!--address 值为 null 空值-->
         <property name="address">
             <null/>
         </property>
     </bean>
复制代码
b.属性值包含特殊符号
复制代码
 使用转义 
XML 复制代码
<property name="address" value="&lt;南京&gt;"></property>
复制代码
 或者cdata
 
XML 复制代码
 <property name="address">
        <value><![CDATA[<南京>]]></value>
  </property>
 ​
复制代码
 控制台输出
 李四,王丽丽,<南京>
相关推荐
Yeats_Liao4 分钟前
Spring 框架:配置缓存管理器、注解参数与过期时间
java·spring·缓存
Yeats_Liao4 分钟前
Spring 定时任务:@Scheduled 注解四大参数解析
android·java·spring
码明4 分钟前
SpringBoot整合ssm——图书管理系统
java·spring boot·spring
某风吾起8 分钟前
Linux 消息队列的使用方法
java·linux·运维
xiao-xiang11 分钟前
jenkins-k8s pod方式动态生成slave节点
java·kubernetes·jenkins
取址执行23 分钟前
Redis发布订阅
java·redis·bootstrap
S-X-S36 分钟前
集成Sleuth实现链路追踪
java·开发语言·链路追踪
快乐就好ya1 小时前
xxl-job分布式定时任务
java·分布式·spring cloud·springboot
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
Aqua Cheng.1 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法