spring核心内容基本解读、spring中IOC控制反转入门案例,debug带你剖析Spring容器机制和结构(图文讲解,简单易懂)。

目录

1.spring核心内容大概解读

2.spring的IOC(控制反转容器机制剖析)

2.1 来份快速入门案例

2.2  debug剖析spring容器的机制和结构


1.spring核心内容大概解读

1.  在线文档 :  https://docs.spring.io/spring-framework/docs/current/reference/html/
2.  线 档    spring-framework-5.3.8\docs\reference\html\index.html
3.  线 API:    spring-framework-5.3.8\docs\javadoc-api\index.html

解释一下: 

1. IOC(Inversion of control):控制反转,可以用来管理java对象

2. AOP:切面编程

3.JDBCTemplate:是spring提供的一种访问数据库的技术。

4.声明式事务:基于ioc/aop实现的事务管理。

5.Spring可以整合其他框架,如Spring Boot,SSM这些框架都是基于Spring实现的,简而言之,就是Spring是来管理框架的框架。

来看看IOC的控制反转是什么概念

1.传统的开发模式比如说反射,或者通过配置文件读取信息连接数据库等。他们都是程序----->环境

也就是程序先读取环境配置,然后创建对象,在进行操作。

2.而现在的IOC控制反转开发模式呢: 是首先将你要创建的对象,通过文件/XML,或者注解的形式创建在容器中,你可以将容器想象成集合。当你要使用某个对象实例的时候,直接从容器中拿,就不需要new 一个对象的形式了。

1 Spring 根据配置文件 xml/ 注解 , 创建对象, 并放入到容器 (ConcurrentHashMap) ,
并且可以完成对象之间的 依赖
2 、当需要使用某个对象实例的时候 , 就直接从容器中获取即可
3 、程序员可以更加关注如何使用对象完成相应的业务 , ( 以前是 new ... ==> 注解 / 配置
方式 )
4. Spring 最大的价值,通过配置,给程序提供需要使用的web 层[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]对象,
这个是核心价值所在,也是 ioc 的具体体现, 实现解耦

2.spring的IOC(控制反转容器机制剖析)

2.1 来份快速入门案例

spring容器从配置文件/xml中获取对象,并输出该对象相关信息的案例

输出结果:

Monster类

package spring.bean;
/**
 * @author sn
 */
public class Monster {
    private Integer id;
    private String name;
    private String skill;

    //写一个无参构造函数,spring是用反射来创建对象的

    public Monster() {
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

 beans.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">
<!--
    1.配置Monster对象/javabean
    2.在beans中可以配置多个bean
    3.class属性指定的是类的全路径
    4.id属性表示java对象在spring容器中的id,通过id可以获取对象
    5.<property name="skill" value="向阳而生"/>是用来给该对象赋值
-->
<bean class="spring.bean.Monster" id="monster01">
    <property name="id" value="1"/>
    <property name="name" value="小红花"/>
    <property name="skill" value="向阳而生"/>
</bean>
</beans>

测试案例 

 @Test
    public void getMonster() {

        //1. 创建容器 ApplicationContext
        //2. 该容器和容器配置文件关联
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");

        //3. 通过getBean获取对应的对象
        //   默认返回的是Object , 但是运行类型Monster
        //Object monster01 = ioc.getBean("monster01");
        Monster monster01 = (Monster) ioc.getBean("monster01");

        //4. 输出
        System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());
        System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +
                " id=" + monster01.getId());


        //5. 也可以再获取的时候,直接指定Class类型, 可以在次获取
        Monster monster011 = ioc.getBean("monster01", Monster.class);
        System.out.println("monster011=" + monster011);
        System.out.println("monster011.name=" + monster011.getName());


        //6. 查看容器注入了哪些bean对象,会输出bean的id
        System.out.println("================================");
        String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("beanDefinitionName=" + beanDefinitionName);
        }
        System.out.println("================================");

        System.out.println("ok~~~");
    }

具体解释

 该容器就是通过上述案例中为ioc的对象

问题1:如何通过ClassPathXmlApplicationContext("beans.xml")读取到xml文件的?

ClassPath也成为类的加载路径。当运行程序的时候会默认以类的加载路径去读取xml文件的

类的加载路径怎么看

  @Test
    public void classPath()
    {
        File file = new File(this.getClass().getResource("/").getPath());
        System.out.println("file=>"+file);
    }

 结果:

 

由上图我们可知道他默认读取到的就是项目在运行后的out/production/spring_/spring下的beans.xml文件 

2.2  debug剖析spring容器的机制和结构

代码都是上述案例的代码

debug过后可以看到

 

在beanDefinitionMap中存放的是beans.xml中所有bean对象的信息。

目的是:如果不是单例对象,以后通过这些信息,反射创建该对象 

你咋知道这里面存放的不是bean对象呢

在val中我们可以看到是通用的类的定义,并不是一个实例

 bean对象的实例放在哪儿呢,继续看

 

在这里啊我们就可以看到是一个Monster对象 ,实例是放在singletonObjects里面的

注意的是,spring容器的创建会消耗大量资源,尽量不要多创,将你要用到的对象信息,放在同一个xml文件中即可。

后续spring的更新不断,请大伙多多支持!

本篇文章来自Java高级工程师韩顺平教育学习心得,如有版权问题及时删除。 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 19:52:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 19:52:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 19:52:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 19:52:01       69 阅读

热门阅读

  1. C语言相关知识点(不定期更新内容)

    2024-07-19 19:52:01       22 阅读
  2. C++如何管理指针从而避免内存泄露

    2024-07-19 19:52:01       16 阅读
  3. OpenCV——图像与视频的保存

    2024-07-19 19:52:01       19 阅读
  4. Vue 给表格单元格加省略号和hover提示

    2024-07-19 19:52:01       18 阅读
  5. Eclipse Temurin Docker镜像

    2024-07-19 19:52:01       16 阅读
  6. npm 缓存目录

    2024-07-19 19:52:01       16 阅读
  7. vllm安装踩坑

    2024-07-19 19:52:01       23 阅读
  8. 探索Eureka的高级用法:在服务中实现分布式锁

    2024-07-19 19:52:01       19 阅读
  9. ArkTS语法---运算符及语句

    2024-07-19 19:52:01       23 阅读