SpringDI依赖注入和SpringIOC容器对Bean的管理

目录

1、SpringDI(依赖注入)

[(1)Spring DI的理解](#(1)Spring DI的理解)

(2)SpringDI的作用

(3)什么是Spring的bean

(4)DI实现方式

set注入:

构造注入:

2、SpringIOC容器对Bean管理

(1)bean实例化

(2)bean作用域

(3)bean生命周期


1、SpringDI(依赖注入)

(1)Spring DI的理解

DI(Dependecy Inject,中文释义:依赖注入)是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象。(例如在MyBatis整合Spring时,SqlSessionFactoryBean依赖IOC容器注入一个Datasource数据源bean );

(2)SpringDI的作用

将SpringIOC容器所创建的各个组件,使用DI的语法进行关联,耦合(胶水)减少耦合。

(3)什么是Spring的bean

<bean>标签是Spring XML配置文件中最基本的构建块,用于定义Spring容器中的Bean。

简单来说,Bean代表被IOC容器管理的对象,我们通过配置文件或注解,告诉IOC容器帮助我们管理哪些对象。

XML 复制代码
<bean id="..." class="...">
    <constructor-arg value="..."/>
</bean>
(4)DI实现方式

Spring2.5版本:在resources中添加.xml工具类在里面实现注入。

set注入:

关键词<proprety>

XML 复制代码
<bean id="controllerImp" class="com.apesource.controller.UserControllerImp">
    <property name="service" ref="serviceImp"></property>
</bean>

id代表的是这个Bean的唯一标识符,在Spring容器中,你可以通过这个ID来引用和获取这个Bean。相当于可以通过这个id名来获取相应的bean。

class代表的是指定的Bean的实现类,用这个实现类来完成里面的相对应的逻辑。

<property>标签:

name属性指定了要注入的Bean的属性名。比如在这个UserControllerImp有一个名为service的属性,这个属性将被注入依赖例如下面的代码,其中的service就被注入依赖了。

java 复制代码
public UserControllerImp(IUserService service) {
    this.service = service;
}

ref属性指定了要注入的Bean的ID,在这种情况下,serviceImp是另一个serviceImp实现类的ID,Spring会将ID为serviceImp的Bean注入到controllerImp的service属性中。也就是通过一个类去注入自己的属性。

set注入基本类型与String:

XML 复制代码
<bean id="student" class="com.apesource.pojo.Student">
    <property name="stuName" value="张文英"></property>
    <property name="stuAge" value="18"></property>
    <property name="stuHobby" value="学习"></property>
</bean>

其中的value为对这个name中的属性所附的值,注入进去。

set注入基本类型与复杂类型:

(单列):

与list列表的注入:

XML 复制代码
        <property name="myList">
            <list>
                <value>老米家泡馍</value>
                <value>红红炒米</value>
                <value>马昆砂锅</value>
                <value>石家包子</value>
            </list>
        </property>

与array数组的注入:

XML 复制代码
        <property name="array">
            <array>
                <value>游戏</value>
                <value>跑步</value>
                <value>谈恋爱</value>
                <value>学习</value>
            </array>
        </property>

与set集合的注入:

XML 复制代码
        <property name="mySet">
            <set>
                <value>茶话弄</value>
                <value>茶百道</value>
                <value>蜜雪冰城</value>
                <value>霸王茶姬</value>
                <value>茉莉奶绿</value>
            </set>
        </property>

(多列):

与map集合的注入:

XML 复制代码
        <property name="myMap">
            <map>
                <entry key="杨文琦" value="心动"></entry>
                <entry key="贺佳瑶" value="小贺"></entry>
                <entry key="张甜甜" value="小猪佩奇"></entry>
                <entry key="林航宇" value="林"></entry>
            </map>
        </property>

与property的注入:

XML 复制代码
        <property name="myProp">
            <props>
                <prop key="法国">巴黎</prop>
                <prop key="英国">伦敦</prop>
                <prop key="日本">东京</prop>
                <prop key="美国">华盛顿</prop>
                <prop key="俄罗斯">乌克兰</prop>
            </props>
        </property>
构造注入:

关键词:<constructor-arg> 这是Spring配置文件中的一个标签,用于指定一个构造函数的参数。name:这个对应的是属性名称,value是注入的值。

注入控制器:

XML 复制代码
    <bean id="controllerImp2" class="com.apesource.controller.UserControllerImp">
        <constructor-arg name="service" ref="serviceImp2"></constructor-arg>
    </bean>

ref对应的是从哪个bean中来注入该属性的对象。

2、SpringIOC容器对Bean管理

(1)bean实例化

<1> 通过构造方法(默认)

XML 复制代码
<bean id="student" class="com.apesource.pojo.Student">

id指的是该bean实例的标识符,class指的是bean对应的java类,实例化哪个类。

<2> 通过普通工厂方法

XML 复制代码
<bean id="student" class="com.apesource.pojo.Student" factory-bean="factory" factory-method="createStu"></bean>
<bean id="factory" class="com.apesource.factory.BeansFactory"></bean>

factory工具包下的BeansFactory类:

java 复制代码
public class BeansFactory {
    public Student createStu(){
        System.out.println("===>执行普通工厂");
        return new Student();
    }
}

factory-bean:指定一个 Spring 容器中已经定义的 bean,这个 bean 用作工厂来创建其他 bean 实例。

factory-method:指定工厂 bean 中的方法,这个方法用于创建目标 bean 实例。

<3> 通过静态工厂方法

XML 复制代码
<bean id="student" class="com.apesource.factory.StaticBeansFactory" factory-method="createStu"></bean>

factory工具包下的StaticBeansFactory类:

java 复制代码
public class StaticBeansFactory {
    public static Student createStu(){
        System.out.println("===> 执行static工厂");
        return new Student();
    }
}
(2)bean作用域

含义:spring对于创建javaBean实例的方式。

语法:<bean scope="属性值"></bean>

属性值:

|-----------|----------|
| singleton | 单例(默认) |
| prototype | 多例 |
| request | 一个请求创建一个 |
| session | 一个会话创建一个 |

Spring提供了几种常用的作用域:

  • Singleton(默认作用域):每个 Spring IoC 容器中只有一个 bean 实例。所有对这个 bean 的请求都会返回同一个实例。
  • Prototype:每次请求都会创建一个新的 bean 实例。
  • Request:在 Web 应用中,每个 HTTP 请求都会创建一个新的 bean 实例。这个作用域仅在 web 环境中有效。
  • Session:在 Web 应用中,每个 HTTP 会话(Session)都会创建一个新的 bean 实例。这个作用域仅在 web 环境中有效。
  • GlobalSession:在多个 HTTP 会话共享的情况下,每个全局 HTTP 会话都会创建一个新的 bean 实例。这个作用域仅在 Portlet 环境中有效。

示例代码:

XML 复制代码
<bean id="teacher" class="com.apesource.pojo.Teacher" scope="prototype"></bean>

scope 属性定义了 bean 的作用域,也就是 bean 实例的生命周期和创建方式。

java 复制代码
        ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("applicationContext.xml");
        // 在单例情况下,teacher1 和 teacher2 是同一个实例,所以 teacher1 == teacher2 返回 true。
        // 在多例情况下,teacher1 和 teacher2 是不同的实例,所以 teacher1 == teacher2 返回 false。
        Teacher teacher1 = (Teacher) applicationContext.getBean("teacher");
        Teacher teacher2 = (Teacher) applicationContext.getBean("teacher");
        System.out.println(teacher1==teacher2);
(3)bean生命周期
  • 实例化
  • 属性赋值(DI)
  • 初始化 接口 InitializingBean / 属性 init-method=""
  • 操作使用
  • 销毁了 接口 DisposableBean / 属性 destory-method=""
XML 复制代码
    <bean id="user" class="com.apesource.pojo.User" init-method="doinit" destroy-method="doDestory">
        <property name="uname" value="杨文琦"></property>
    </bean>

init-method:指定 bean 在初始化要调用的方法。

destroy-method:指定 bean 在销毁时要调用的方法。

相关推荐
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟1 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity2 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天2 小时前
java的threadlocal为何内存泄漏
java
caridle3 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx