spring相关知识理解之IOC

本文介绍了Spring5框架的核心组成部分——IOC,包括其概念、目的、底层原理和实现方式。详细阐述了IOC容器的BeanFactory和ApplicationContext接口,以及IOC的三种注入方式:set方法注入、构造器注入和p名称空间注入。此外,还讨论了Bean的作用域、生命周期、BeanPostProcessor以及XML和注解方式的自动装配。文章通过实例展示了如何使用注解实现对象创建和属性注入。
摘要由CSDN通过智能技术生成

1,Spring5 框架

1,Spring5 框架概述

  1. Spring 是轻量级的开源的 JavaEE 框架
  2. Spring 可以解决企业应用开发的复杂性
  3. Spring 有两个核心部分:IOC 和 Aop
    • IOC:控制反转,把创建对象过程交给 Spring 进行管理
    • Aop:面向切面,不修改源代码进行功能增强
  4. Spring 特点
    • 方便解耦,简化开发
    • Aop 编程支持
    • 方便程序测试
    • 方便和其他框架进行整合
    • 方便进行事务操作
    • 降低 API 开发难度

2,测试通过spring创建一个类

  1. 导入spring需要的基础包

  2. 创建spring配置的xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           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">
    
        <bean id="user" class="com.hanlin.User"></bean>
    </beans>
    
  3. 测试从xml配置文件中获取到配置的对象进行输出

        @Test
        public void testAdd(){
            //1,加载spring配置文件
            ApplicationContext context = new ClassPathXmlApplicationContext("beandem1.xml");
            //2,获取配置文件中创建的对象
            User user = context.getBean("user", User.class);
            System.out.println(user);
            user.add();
        }
    

#2,IOC容器

1,什么是IOC

  1. 控制反转:把对象的创建和对象之间的调用过程,交给spring容器进行管理
  2. 使用IOC的目的:降低代码的耦合度

###2,IOC容器底层原理

  1. 涉及到的技术:xml文件解析,工厂模式,反射技术
  2. IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

###3,IOC容器接口(BeanFactory,ApplicationContext)

  1. BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
  2. ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人 员进行使用

4,IOC三种注入方式

####1,第一种注入方式:使用 set 方法进行注入

//第一步,先创建一个需要注入到IOC容器中的对象
/**
 * Bean 管理操作基于 xml 配置文件方式实现
 * 1、基于 xml 方式创建对象
 * (1)在 spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
 * (2)在 bean 标签有很多属性,介绍常用的属性
 *  id 属性:唯一标识
 *  class 属性:类全路径(包类路径)
 * (3)创建对象时候,默认也是执行无参数构造方法完成对象创建
 * 2、基于 xml 方式注入属性
 *   第一种注入方式:使用 set 方法进行注入
 */
public class Person {
    private String id;
    private String name;

    public void setId(String id){
        this.id=id;
    }

    public void setName(String name){
        this.name=name;
    }

    public void testPerson(){
        System.out.println(id+":"+name);
    }
}

//第二步:在xml配置文件中配置对象和对象属性的信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <bean id="user" class="com.hanlin.java.User"></bean>

    <bean id="person" class="com.hanlin.java.Person">
        <property name="id" value="中国人"></property>
        <property name="name" value="牛逼"></property>
    </bean>
</beans>
        
//第三步:测试将注入到IOC容器的中对象和对象的属性获取打印
@Test
    public void testPerson(){
        //1,加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("beandem1.xml");
        //2,获取配置文件中创建的对象
        Person p1 = context.getBean("person", Person.class);
        System.out.println(p1);
        p1.testPerson();
    }        

####2,第二种注入方式:使用有参数构造进行注入

//第一步,先创建一个需要注入到IOC容器中的对象
/**
 * 第二种注入方式:使用有参数构造进行注入
 */
public class Order {

    private String id;
    private String name;

    public Order(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public void testOrder(){
        System.out.println(id+"::"+name);
    }
}
//第二步:在xml配置文件中配置对象和对象属性的信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <bean id="user" class="com.hanlin.java.User"></bean>

    <!--set方法注入-->
    <bean id="person" class="com.hanlin.java.Person">
        <property name="id" value="中国人"></property>
        <property name="name" value="牛逼"></property>
    </bean>

    <!--有参构造方法注入-->
    <bean id="order" class="com.hanlin.java.Order">
        <constructor-arg name="id" value="11"></constructor-arg>
        <constructor-arg name="name" value="222"></constructor-arg>
    </bean>
</beans>
//第三步:测试将注入到IOC容器的中对象和对象的属性获取打印
  @Test
    public void testOrder(){
        //1,加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("beandem1.xml");
        //2,获取配置文件中创建的对象
        Order order = context.getBean("order", Order.class);
        System.out.println(order);
        order.testOrder();
    }        

####3,p 名称空间注入(了解)

  • 使用 p 名称空间注入,可以简化基于 xml 配置方式 第一步 添加 p 名称空间在配置文件中

在这里插入图片描述

###5,IOC 操作 Bean 管理

####1,普通 bean:在配置文件中定义 bean 类型就是返回类型

####2,工厂* bean:在配置文件定义 bean 类型可以和返回类型不一样

  • 第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean

  • 第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型

    package com.hanlin.java;
    
    import org.springframework.beans.factory.FactoryBean;
    
    /**
     * 自定义工厂Bean
     * 工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样
     * 1,第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean
     * 2,第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
     */
    public class MyFactoryBean implements FactoryBean {
         
        /**
         * 定义返回bean对象的类型
         * @return
         * @throws Exception
         */
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值