【Spring篇】IOC相关内容

Spring IoC源码学习:总览 前言 Spring 作为现在最优秀的框架之一,被广泛的应用于 Java 项目中,但是大多数人都只知道如何使用,而不知其中的原理。对大多数人来说可能知道如何使用已经足够了,但是对于想提升自己的人来说,学习 Spring 的源码是一个不错的选择。在过去的几个月里,我利用空闲时间将 IoC 的相关源码学习了一下,按照老习惯准备整理成笔记,以博文的形式记录下来,供自己以后使用,也供其他网友参考。由于涉及... 阅读详情

🍓系列专栏:Spring系列专栏

🍉个人主页:个人主页

通过前面两个案例,我们已经学习了 bean 如何定义配置 , DI 如何定义配置 以及 容器对象如何获取 的内容,接下来主要是把这三块内容展开进行详细的讲解,深入的学习下这三部分的内容,首先是bean 基础配置。

一、bean基础配置

对于 bean 的配置中,主要会讲解 bean 基础配置 , bean 的别名配置 , bean的作用范围配置(重点) , 这三部分内容:

1.bean基础配置(id与class)

对于 bean 的基础配置,在前面的案例中已经使用过 :
 <bean id="" class=""/>
其中, bean 标签的功能、使用方式以及 id 和 class 属性的作用,我们通过一张图来描述下

 这其中需要大家重点掌握的是:bean标签的id和class属性的使用。

思考:

class属性能不能写接口如BookDao的类全名呢?

  • 答案肯定是不行,因为接口是没办法创建对象的。

2.bean的name属性

首先来看下别名的配置说

 步骤1:配置别名

打开 spring 的配置文件 applicationContext.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">

    <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
    <bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

    <!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
    <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
</beans>
说明 :Ebi 全称 Enterprise Business Interface ,翻译为企业业务接口
步骤 2: 根据名称容器中获取 bean 对象
public class AppForName {
    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookService bookService = (BookService) ctx.getBean("service4");

        bookService.save();
    }
}

运行:

 注意事项:

 如果不存在,则会报错,如下:

 获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常 NoSuchBeanDefinitionException

3.bean作用范围scope配置

关于bean的作用范围是bean属性配置的一个重点内容。

看到这个作用范围,我们就得思考bean的作用范围是来控制bean哪块内容的? 我们先来看下bean作用范围的配置属性:

 验证IOC容器中对象是否为单例

验证思路
同一个 bean 获取两次,将对象打印到控制台,看打印出的地址值是否一致。
具体实现
创建一个 AppForScope 的类,在其 main 方法中来验证

结论:默认情况下,Spring创建的bean对象都是单例的

配置bean为非单例

在Spring配置文件中,配置scope属性来实现bean的非单例创建

  • 在Spring的配置文件中,修改<bean>的scope属性
将 scope 设置为 singleton
<?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">

    <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
    <bean id="bookService" name="service service2 bookEbi" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

    <!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
    <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl"  scope="singleton"/>
</beans>

运行AppForScope,打印看结果:

 将scope设置为prototype :

结论,使用bean的scope属性可以控制bean的创建是否为单例:
  • singleton默认为单例
  • prototype为非单例

scope 使用后续思考
为什么 bean 默认为单例 ?
  • bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
  • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
bean 在容器中是单例的,会不会产生线程安全问题 ?
  • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
  • 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
  • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
  • 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
哪些 bean 对象适合交给容器进行管理 ?
  • 表现层对象
  • 业务层对象
  • 数据层对象
  • 工具对象

哪些bean对象不适合交给容器进行管理?

  • 封装实例的域对象,因为会引发线程安全问题,所以不适合。

二、bean实例化

对象已经能交给 Spring 的 IOC 容器来创建了,但是容器是如何来创建对象的呢 ?
就需要研究下 bean 的实例化过程 ,在这块内容中主要解决两部分内容,分别是
  • bean是如何创建的
  • 实例化bean的三种方式,构造方法,静态工厂和实例工厂
在讲解这三种创建方式之前,我们需要先确认一件事 :
bean 本质上就是对象,对象在 new 的时候会使用构造方法完成,那创建 bean 也是使用构造方法完成的。
基于这个知识点出发,我们来验证 spring 中 bean 的三种创建方式

1.构造方法实例化

步骤 1: 准备需要被创建的类
准备一个 BookDao 和 BookDaoImpl 类
public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("book dao save ...");
    }

}
步骤 2: 将类配置到 Spring 容器
<?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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
</beans>
步骤 3: 编写运行程序
public class AppForInstanceBook {
    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        bookDao.save();

    }
}
步骤 4: 类中提供构造函数测试
在 BookDaoImpl 类中添加一个无参构造函数,并打印一句话,方便观察结果。
public class BookDaoImpl implements BookDao {

    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }

    public void save() {
        System.out.println("book dao save ...");
    }

}
运行程序,如果控制台有打印构造函数中的输出,说明 Spring 容器在创建对象的时候也走的是构造函数

步骤 5: 将构造函数改成 private 测试

运行程序,能执行成功 , 说明内部走的依然是构造函数 , 能访问到类中的私有构造方法 , 显而易见
Spring 底层用的是反射
步骤 6: 构造函数中添加一个参数测试
public class BookDaoImpl implements BookDao {

    private BookDaoImpl(int i) {
        System.out.println("book dao constructor is running ....");
    }

    public void save() {
        System.out.println("book dao save ...");
    }

}
运行程序,
程序会报错,说明 Spring 底层使用的是类的无参构造方法。

2.分析Spring的错误信息

接下来,我们主要研究下Spring的报错信息来学一学如阅读。

错误信息从下往上依次查看,因为上面的错误大都是对下面错误的一个包装,最核心错误是在最下面

Caused by: java.lang.NoSuchMethodException:
com.itheima.dao.impl.BookDaoImpl. <init> ()
  • Caused by 翻译为引起,即出现错误的原因
  • java.lang.NoSuchMethodException:抛出的异常为  没有这样的方法异常
  • com.itheima.dao.impl.BookDaoImpl. <init> ():哪个类的哪个方法没有被找到导致的异常,<init> ()指定是类的构造方法,即该类的无参构造方法

如果最后一行错误获取不到错误信息,接下来查看第二层:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookDao' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.dao.impl.BookDaoImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.itheima.dao.impl.BookDaoImpl.<init>()

  • nested:嵌套的意思,后面的异常内容和最底层的异常是一致的
  • BeanInstantiationException:翻译为bean实例化异常
  • No default constructor found:没有一个默认的构造函数被发现

3.静态工厂实例化

接下来研究Spring中的第二种bean的创建方式静态工厂实例化:

工厂方式创建bean

在讲这种方式之前,我们需要先回顾一个知识点是使用工厂来创建对象的方式 :
(1) 准备一个 OrderDao 和 OrderDaoImpl 类
public class OrderDaoImpl implements OrderDao {

    public void save() {
        System.out.println("order dao save ...");
    }
}
public interface OrderDao {
    public void save();
}
(2) 创建一个工厂类 OrderDaoFactory 并提供一个 静态方法
//静态工厂创建对象
public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}
(3) 编写 AppForInstanceOrder 运行类,在类中通过工厂获取对象
public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
        OrderDao orderDao = OrderDaoFactory.getOrderDao();
        orderDao.save();



    }
}

 如果代码中对象是通过上面的这种方式来创建的,如何将其交给Spring来管理呢?

静态工厂实例化

这就要用到 Spring 中的静态工厂实例化的知识了,具体实现步骤为 :
(1) 在 spring 的配置文件 application.properties 中添加以下内容 :
 <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
class: 工厂类的类全名
factory-mehod: 具体工厂类中创建对象的方法名
对应关系如下图

 (2)在AppForInstanceOrder运行类,使用从IOC容器中获取bean的方法进行运行测试

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
//        OrderDao orderDao = OrderDaoFactory.getOrderDao();
//        orderDao.save();


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");

        orderDao.save();

    }
}

4.实例工厂

接下来继续来研究Spring的第三种bean的创建方式实例工厂实例化:

环境准备

(1) 准备一个 UserDao 和 UserDaoImpl 类
public interface UserDao {
    public void save();
}
public class UserDaoImpl implements UserDao {

    public void save() {
        System.out.println("user dao save ...");
    }
}
(2) 创建一个工厂类 OrderDaoFactory 并提供一个普通方法,注意此处和静态工厂的工厂类不一样的
地方是方法不是静态方法
//实例工厂创建对象
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
(3) 编写 AppForInstanceUser 运行类,在类中通过工厂获取对象
public class AppForInstanceUser {
    public static void main(String[] args) {
        //创建实例工厂对象
        UserDaoFactory userDaoFactory = new UserDaoFactory();
        //通过实例工厂对象创建对象
        UserDao userDao = userDaoFactory.getUserDao();
        userDao.save();


    }
}
运行后,可以查看到结果

对于上面这种实例工厂的方式如何交给Spring管理呢?

实例工厂实例化  

具体实现步骤为 :
(1) 在 spring 的配置文件中添加以下内容 :
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
实例化工厂运行的顺序是 :
  • 创建实例化工厂对象,对应的是第一行配置
  • 调用对象中的方法来创建bean,对应的是第二行配置
  • factory-bean: 工厂的实例对象
  • factory-method:工厂对象中的具体创建对象的方法名 , 对应关系如下 :

 factory-mehod:具体工厂类中创建对象的方法名

(2)在AppForInstanceUser运行类,使用从IOC容器中获取bean的方法进行运行测试

public class AppForInstanceUser {
    public static void main(String[] args) {


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserDao userDao = (UserDao) ctx.getBean("userDao");

        userDao.save();

    }
}

 实例工厂实例化的方式就已经介绍完了,配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。

5.FactoryBean

具体的使用步骤为 :
(1) 创建一个 UserDaoFactoryBean 的类,实现 FactoryBean 接口,重写接口的方法
//FactoryBean创建对象
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;
    }

}
(2) 在 Spring 的配置文件中进行配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
(3)AppForInstanceUser 运行类不用做任何修改,直接运行

这种方式在 Spring 去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。
查看源码会发现, FactoryBean 接口其实会有三个方法,分别是 :
 getObject() throws Exception;

 Class<?> getObjectType();

 default boolean isSingleton() {
 return true;
 }
方法一 :getObject() ,被重写后,在方法中进行对象的创建并返回
方法二 :getObjectType(), 被重写后,主要返回的是被创建类的 Class 对象
方法三 : 没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true ,从意思上来看,我们猜想默认应该是单例,如何来验证呢 ?
思路很简单,就是从容器中获取该对象的多个值,打印到控制台,查看是否为同一个对象。
public class AppForInstanceUser {
    public static void main(String[] args) {


        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserDao userDao1 = (UserDao) ctx.getBean("userDao");
        UserDao userDao2 = (UserDao) ctx.getBean("userDao");
        System.out.println(userDao1);
        System.out.println(userDao2);
//        userDao.save();

    }
}
打印结果,如下 :

通过验证,会发现默认是单例,那如果想改成单例具体如何实现?

只需要将 isSingleton() 方法进行重写,修改返回为 false ,即可
public class UserDaoFactoryBean implements FactoryBean<UserDao> {


    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    public Class<?> getObjectType() {
        return UserDao.class;
    }

    public boolean isSingleton() {
        return false;
    }
 


}
重新运行 AppForInstanceUser ,查看结果

从结果中可以看出现在已经是非单例了,但是一般情况下我们都会采用单例,也就是采用默认即可。所以isSingleton() 方法一般不需要进行重写。

三、bean的生命周期

关于 bean 的相关知识还有最后一个是 bean 的生命周期 , 对于生命周期,我们主要围绕着 bean 生命周期控制来讲解 :
首先理解下什么是生命周期 ?
  • 从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。
bean 生命周期是什么 ?
  • bean对象从创建到销毁的整体过程。
构造方法 bean 生命周期控制是什么 ?
  • 在bean创建后到销毁前做一些事情。
现在我们面临的问题是如何在 bean 的创建之后和销毁之前把我们需要添加的内容添加进去。

1.环境准备

项目结构: 

(1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
public class BookServiceImpl implements BookService{
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
(2)resources 下提供 spring 的配置文件
<?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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
</beans>
(3) 编写 AppForLifeCycle 运行类,加载 Spring 的 IOC 容器,并从中获取对应的 bean 对象
public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();

    }
}

2.生命周期设置

接下来,在上面这个环境中来为 BookDao 添加生命周期的控制方法,具体的控制有两个阶段 :
  • bean创建之后,想要添加内容,比如用来初始化需要用到资源
  • bean销毁之前,想要添加内容,比如用来释放用到的资源

步骤1:添加初始化和销毁方法

针对这两个阶段,我们在 BookDaoImpl 类中分别添加两个方法, 方法名任意
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }

}

步骤2:配置生命周期

在配置文件添加配置,如下 :
  <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory" ></bean>
运行程序

从结果中可以看出, init 方法执行了,但是 destroy 方法却未执行,这是为什么呢 ?
  • Spring的IOC容器是运行在JVM中
  • 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方 法执行
  • main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了 所以没有调用对应的destroy方法
知道了出现问题的原因,具体该如何解决呢 ?

3.close关闭容器

 调用ctx的close()方法

public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        ctx.close();
    }
}
运行程序,就能执行 destroy 方法的内容:

注册钩子关闭容器
  • 在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器
  • 调用ctx的registerShutdownHook()方法
public class AppForLifeCycle {
    public static void main( String[] args ) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
//        注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();

    }
}

两种方式介绍完后, close 和 registerShutdownHook 选哪个 ?
相同点 : 这两种都能用来关闭容器
不同点 :close() 是在调用的时候关闭, registerShutdownHook() 是在 JVM 退出前调用关闭。
分析上面的实现过程,会发现添加初始化和销毁方法,即需要编码也需要配置,实现起来步骤比较多也比较乱。
Spring 提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置 init - method 和destroy- method
接下来在 BookServiceImpl 完成这两个接口的使用 :
修改BookServiceImpl 类,添加两个接口 InitializingBean , DisposableBean 并实现接口中的
两个方法 afterPropertiesSet 和 destroy
public class BookServiceImpl implements BookService,InitializingBean,DisposableBean
{
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        System.out.println("set .....");
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    public void destroy() throws Exception {
        System.out.println("service destroy");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}
pox.xml:
  <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
    </bean>

重新运行 AppForLifeCycle 类

 

bean 生命周期小结
(1) 关于 Spring 中对 bean 生命周期控制提供了两种方式 :
  • 在配置文件中的bean标签中添加init-method和destroy-method属性
  • 类实现InitializingBean与DisposableBean接口,这种方式了解下即可。
(2) 对于 bean 的生命周期控制在 bean 的整个生命周期中所处的位置如下 :
初始化容器
  • 1.创建对象(内存分配)
  • 2.执行构造方法
  • 3.执行属性注入(set操作)
  • 4.执行bean初始化方法
使用 bean
  • 1.执行业务操作
关闭 / 销毁容器
  • 1.执行bean销毁方法
(3) 关闭容器的两种方式 :
ConfigurableApplicationContext 是 ApplicationContext 的子类
  • close()方法
  • registerShutdownHook()方法
Spring中的IOC详解 单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。 阅读详情

相关推荐

死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

目录 1. 什么是 Spring Framework ? 2. Spring Framework 的优势和不足? 3. 你对 IoC 的理解? 4. 为什么需要 IoC ? 5. IoC 和 DI 的区别? 6. IoC 容器的职责? 7. 什么是 Spring IoC 容器? 8. 构造器注入和 Setter 注入 9. BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器? 10. Spring Bean 的生命周期? 11. Bea

javalingyu的博客 1232

【Spring篇】Spring相关概念

我们就想,如果能把框中的内容给去掉,不就可以降低依赖了么,但是又会引入新的问题,去掉以后程序能运行么?如果数据层的实现类发生变化,那么业务层的代码也需要跟着改变,发生变更后,都需要进行编译打包和重部署。会了基础操作后,就需要通过大量案例来熟练掌握框架的具体应用,加深对设计思想的理解。来说,它能迅速占领全球市场,不只是说它的某个功能比较强大,更重要是在它的。遇到的问题就会增多,为了解决问题会引入更多的框架,这些框架。除了上面的这三个技术外,还有很多其他的技术,也比较流行,如。

Javascript_tsj的博客 5066

【面试实战】Spring基础、IoC、AOP、MVC、Mybatis、Spring Boot

🙋‍♂答:Spring Bean就是IoC容器所要管理的对象。通过注解的方式,我们可以告诉IoC容器管理什么对象。Spring装配对象的四个注解:@Component(组件):装配普通组件到IOC中。@Repository(仓库):装配持久化层到IOC中。@Service(业务):装配业务逻辑层到IOC中。@Controller(控制):装配控制层/表示层组件到IOC中。Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发。

weixin_62633072的博客 975

Spring IoC——IoC 容器的使用

IoC:也就是控制反转Spring IoC 是一种设计模式,用于解耦对象之间的依赖关系,在之前创建的项目中对象通常会主动创建和管理自己所依赖的对象,例如,一个类可能会在自己的内部使用new关键字来创建一个对象用于数据访问,这样设计看似没有问题,但是可维护性却很低,当有很多类创建了各自的对象时,并且这些对象之间还有依赖关系,例如创建 Car ,Framework,Bottom,Tire 类,从左到右依次存在依赖关系,当其中有一个类的底层代码改变之后,调用链上的代码都需要修改car.run();

2202_76097976的博客 6321

怎么选?一文读懂12种SPC控制图,从基础到进阶,再到Python代码实现

本文系统介绍了12种常用SPC控制图的应用场景和特点,包括计量型(Xbar-R图、Xbar-s图、I-MR图等)、计数型(P图、NP图、U图等)及进阶控制图(EWMA图、CUSUM图、多元控制图)。文章强调控制图是SPC的核心工具,能有效区分过程变异类型,实现"预防优于检测"的质量管理目标。通过数据示例和Python代码展示了各类控制图的实现方法,为质量管理人员提供了实用参考。

m0_56592100的博客 4152

SQL2000在Win10上安装完整指南:兼容模式、SP4补丁与远程连接配置

数据库兼容性是老系统迁移与运维中绕不开的难题。当历史遗留的SQL Server 2000遭遇全新的Windows 10环境,安装程序常因系统版本检测失败而拒绝运行,这背后是旧版安装程序与NT内核版本间的识别错位。通过兼容模式模拟旧系统环境、以管理员身份运行安装程序,并处理注册表挂起与杀毒软件干扰,即可突破基础安装障碍。安装后的SP4补丁与TCP/IP端口配置,则是保障服务稳定与远程连接的关键。这一技术路径广泛适用于制造企业MES、进销存系统及医院HIS等仍依赖老旧数据库的场景,为IT运维与数据迁移测试提供了

weixin_29266679的博客 443

【spring】IOC与DI

DI,即依赖注入(Dependency Injection),是一种实现控制反转(IOC)原则的技术手段。 容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。 可以这样理解:IOC是一种思想,而DI则是具体实现

acm_pn的博客 4112

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 484

Spring IOC相关

Spring IOC个人学习笔记

后端小白个人学习记录 1911

文献综述三大痛点用AI轻松解决!借助Gemini 3 Pro搞定检索难、阅读慢、框架乱问题(附 AI 提示词)

4)“漏斗式”结构:先介绍宏观领域的研究现状,再缩小范围,聚焦于与你课题直接先关的子领域,深入探讨与你研究变量直接相关的文献, 指出前人没做过、没做全或结论有矛盾的地方,再顺势提出你的研究课题,这种结构逻辑最清晰,能直接引导读者发现你研究的必要性。想要有针对性的搜到相关文献,必须先把模糊的研究题目拆解成精准的检索语言,这个时候就需要建立一个关键词矩阵,如核心词、同义词、学术术语、上下位词,以及对应的英文表达。请围绕【我的研究主题/关键词】,检索近5年发表的高被引的中英文文献,优先选择顶刊综述/论文。

智能AI让学术科研更容易 277

爬虫面试:关于爬虫破解验证码的13个经典面试题

​解释:验证码是一种用于区分人类用户和自动化程序(如爬虫)的技术,通常通过显示图形、文字或音频等方式,要求用户完成特定任务(如识别扭曲的字母、点击特定区域等)。​作用:防止恶意爬虫滥用网站资源、进行批量注册、登录破解等行为,保护网站的安全性和数据的完整性。

数据知道的博客 1万+

Spring IoC容器

核心技术 发行版5.0.8 这一部分的指导文档覆盖了所有的完全集成到Spring框架中的技术。 这些技术中首要的便是Spring框架的控制反转(IoC)容器。Spring框架的IoC容器的全面的处理是与Spring的面向切面编程(AOP)的彻底实现紧密相关的。Spring框架拥有他自己的AOP框架,该技术在概念上是很容器理解的,并且成功的解决了在Java企业编程中的AOP需求的80%的点。 该框...

hongbochen1223的专栏 1万+

1、2022 应用密码学与网络安全会议亮点与关键技术解读

2022年应用密码学与网络安全会议(ACNS 2022)在意大利罗马成功举办,会议涵盖了密码学与网络安全的多个前沿领域,包括键控全同态加密、隐私保护技术、区块链、后量子密码学和多方计算等。会议共收录44篇论文,展示了众多创新的研究成果,为学术研究和实际应用提供了新的思路和方法。本次会议促进了学术界和工业界的交流与合作,推动了密码学与网络安全行业的发展。

blue的专栏 182

Spring IOC :相关接口分析、手写简易 Spring IOC

Spring IOC :相关接口分析、手写简易 Spring IOC

Henrik-Yao的博客 1248

STM32实战开发(66):STM32图像处理开发教程

随着物联网、人工智能和嵌入式技术的不断发展,图像处理技术在嵌入式系统中的应用越来越广泛。图像处理不仅在视觉识别、安防监控、智能家居等领域中发挥着重要作用,也在工业自动化、医疗成像、无人驾驶等高科技领域中占据重要地位。而STM32凭借其强大的硬件性能和丰富的外设支持,成为了许多图像处理应用的理想平台。

2201_76125393的博客 1447

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 472

Spring源码手写篇-手写IoC

根据上面的接收我们就清楚了Bean定义的意义了。那么我们来定义Bean定义的模型要考虑几个问题。作用肯定是告诉Bean工厂应该如何来创建某类的Bean实例。

埃泽漫笔 1090

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring IoC和DI

为什么要有这么多的类注解呢?这与 应用分层 类似,为了在看到类注解后,就能直接了解当前类的用途@Controller:控制层,接收请求,对请求进行处理,并进行响应@Service:业务逻辑层,处理具体的业务逻辑@Repository:数据访问层,也称为持久层,处理数据访问操作@Configuration:配置层,处理项目中的一些配置信息@Component:泛指组件,当组件不好归类时,可以使用这个注解。

2301_76161469的博客 1480

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IOC 相关内容

至此,关于Spring的构造方法实例化就已经学习完了,因为每一个类默认都会提供一个无参构造函数,所以其实真正在使用这种方式的时候,我们什么也不需要做。这也是我们以后比较常用的一种方式。需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。看到这,可能有人会问了,你这种方式在工厂类中不也是直接new对象的,和我自己直接new没什么太大的区别,而且静态工厂的方式反而更复杂,这种方式的意义是什么?

Eumenides_Suki的博客 1307

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。 IOC理解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/bl

qq_43842093的博客 7193

最经典的Spring源码手写篇-手写IoC

摘要:本文探讨了Spring框架中IoC容器的核心设计与实现。首先分析了IoC的概念、优势及容器功能,指出IoC容器本质上是一个工厂模式实例。然后详细阐述了Bean工厂的设计过程,包括BeanDefinition的定义、注册机制(BeanDefinitionRegistry)以及DefaultBeanFactory的实现。最后讨论了IoC功能的两个增强方向:别名管理和Type类型支持。文章呈现了完整的IoC容器设计思路,涵盖单例管理、初始化/销毁方法等关键特性,并遵循了面向接口编程、单一职责等设计原则,为理

weixin_46300935的博客 1738

Spring框架及Spring IoC核心容器介绍

SpringIoC核心容器介绍及其使用方式,推荐注解+配置类!!

weixin_44525733的博客 2514

Spring 相关IOC 两个Map

SPRING 架构分析 spring官网:spring.io/projects spring是一个资源整合框架 ,通过spring可以将很多资源整合在一起,例如:连接池、MyBatid等。 对外提供相关服务,比如:秒杀、支付等; spirng中的IOC负责实现生命周期的管理和对象依赖关系的管理; spring框架架构: 1.下图为容器初始化步骤图: 个人分析为:一个被@Component组...

Frame_X的博客 2013

Spring-IOC相关内容

Spring-IOC相关内容

qq_53098203的博客 452

Spring IOC相关例题及解析

💂 个人网站:【 海拥】【摸鱼小游戏】 🤟 风趣幽默的人工智能学习网站:👉人工智能 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 💬 便宜且实用的计算机相关书籍:👉进来逛逛 直接跳到末尾 去评论区领书 1、(单选题)下列关于Spring特性中IOC描述错误的是:() A.IOC就是指程序之间的关系由程序代码直接操控。 B.所谓“控制反转”,是指控制权由应用代码转到外部容器,控制权的转移 C.IOC将控制创建的职责搬进了框架中;并把它从应用代码脱离开来 D.当使用Spring的IOC容器..

努力是为了站在万人之中,成为别人的光 1万+

面试题-Spring IOC相关

Spring IOC的面试题,个人整理。 1. 说说你对Spring中IOC及DI的理解?* 2.从代码层面说说Spring的IOC容器本质到底是什么?*** 3.BeanFactory和ApplicationContext的关系和区别?**** 4.了解过FactoryBean么?说说你对它的理解?举一个相关的应用。*** 5.问题3,4如果答不出来,直接跳到这里。说说实现依赖注入有几种方式?或者说是Spring让你的Bean之间产生依赖的方式?* 6.说说Spring框架中Bean的自动装配方式有几种?

佛系程序员 2745
上一篇: Linux centos搭建web服务器
下一篇: 【Spring篇】DI相关内容
热爱编程的小白白
热爱编程的小白白 新星计划导师 新星计划导师
博客等级 码龄5年 11万+粉丝 243原创
评论 27
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值