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>
 ​
复制代码
 控制台输出
 李四,王丽丽,<南京>
相关推荐
古月居GYH7 分钟前
在C++上实现反射用法
java·开发语言·c++
一元咖啡1 小时前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol1 小时前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-13141 小时前
jdk各个版本介绍
java
天天扭码2 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶2 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺2 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端