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>
 ​
复制代码
 控制台输出
 李四,王丽丽,<南京>
相关推荐
zjw_rp6 分钟前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob18 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder27 分钟前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it35 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行37 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富2 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想2 小时前
JMeter 使用详解
java·jmeter
言、雲2 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇2 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表