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>
 ​
复制代码
 控制台输出
 李四,王丽丽,<南京>
相关推荐
陈大爷(有低保)20 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
kinlon.liu34 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
哈喽,树先生40 分钟前
1.Seata 1.5.2 seata-server搭建
spring·springcloud
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言