Spring框架

spring技术栈面试题 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能。- IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归。一致性 (consistency):事务的执行的前后数据的完整性保持一致. 阅读详情

Spring 

概念:

Spring框架是一个开源的J2EE应用程序框架,是管理bean的生命周期的轻量级容器(lightweight container)。

*bean:由spring容器管理的对象称为bean

*轻量级:使用spring容器的方式简单,便捷

*容器:spring在容器的内存中开辟一块空间,用来管理对象

 Spring IOC介绍

概念:

Ioc全称Inversion of Control,即“控制反转”,这是一种设计思想。Spring框架创建对象.由容器管理对象的生命周期。

在这里插入图片描述

 IOC入门案例

准备接口类Pet

package com.jt.demo3;

public interface Pet {
    void hello();
}

Dog实现类

package com.jt.demo3;

public class Dog implements Pet {
    public void hello(){
        System.out.println("汪汪");
    }
}

准备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">
    <!--
        知识点讲解:
            1.bean 被spring容器管理的对象称之为bean
            2.id    全局唯一变量一般类型首字母小写
            3.class class的路径信息,需要写全名
    -->
    <bean id="dog" class="com.jt.demo3.Dog"></bean>
</beans>

编辑user测试对象

package com.jt.demo3;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class User {
    public static void main(String[] args) {
        //指定配置文件
        String resourse="spring.xml";
        //创建容器对象,加载配置文件
        ApplicationContext context=
                new ClassPathXmlApplicationContext(resourse);
        //从容器中获取对象
            //方式一
        Dog dog=context.getBean(Dog.class);
            //方式二,获取id
        Dog dog1=(Dog) context.getBean("dog");
        //调用对象方法属性
        dog.hello();
        dog1.hello();
    }
}

 IOC实现原理

容器的数据结构: K-V Map<K,V> key=bean中的ID, value=实例化的对象
程序执行过程:
1. 指定配置文件的名称.
2. 当Spring容器加载配置文件时.当按照顺序执行bean标签时,开始创建对象.
3. Spring通过bean标签中的class属性获取类型的路径,之后通过反射机制,实例化对象(必须有无参构造)
4. bean中的Id当做Map中的key, 将实例化的对象保存到Map中,当做value. 至此Spring容器启动成功!!!
5. 当用户需要获取对象时,可以通过key/或者类型 获取对象.

Spring注解开发

备注:由Spring管理的对象的作用域默认是单例的(并不是单例模式),即只创建一个对象,如果希望某个被Spring管理的对象不是单例的,可以在类上添加@Scope("prototype")注解;只有在单例模式下才讨论Spring管理的对象的生命周期

(1条消息) 项目中的常用注解_闪耀太阳的博客-优快云博客

先在pom.xml中添加spring-context依赖(https://mvnrepository.com/ )

关于注解开发说明

如果是2010年,那么还需要对xml配置文件有所了解,但是引入springboot之后,基本不需要使用xml配置文件了,一般都使用注解开发.

spring创建对象的两种方式:

1.通过@Configuration和@bean开发(可用在任意类型,包括自定义类型)

package cn.tedu.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Random;

@Configuration //标识当前类是配置类
public class SpringBeanFactory {
    @Bean
    public Random random(){
        return new Random();
    }

}
package cn.tedu.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Random;

public class SpringRunner {

    public static void main(String[] args) {
        // 1. 加载Spring
        System.out.println("1. 加载Spring,开始……");
        AnnotationConfigApplicationContext ac
                = new AnnotationConfigApplicationContext(SpringBeanFactory.class);
        System.out.println("1. 加载Spring,完成!");
        System.out.println();

        // 2. 从Spring中获取对象
        System.out.println("2. 从Spring中获取对象,开始……");
        Random random = ac.getBean("random", Random.class);
        System.out.println("2. 从Spring中获取对象,完成!");
        System.out.println();

        // 3. 测试使用对象,以便于观察是否获取到了有效的对象
        System.out.println("3. 测试使用对象,开始……");
        System.out.println("\trandom > " + random);
        System.out.println("\trandom.nextInt() > " + random.nextInt());
        System.out.println("3. 测试使用对象,完成!");
        System.out.println();

        // 4. 关闭
        System.out.println("4. 关闭,开始……");
        ac.close();
        System.out.println("4. 关闭,完成!");
    }

}

2. 通过@Configuration和@componentScan("包名")组件扫描(只适用于自定义类型)

 

@Configuration
@ComponentScan("cn.tedu.spring")
public class SpringConfig {
}
package cn.tedu.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringRunner {

    // @Component
    public static void main(String[] args) {
        // 1. 加载Spring
        System.out.println("1. 加载Spring,开始……");
        AnnotationConfigApplicationContext ac
                = new AnnotationConfigApplicationContext(“cn.tedu.spring”);
        //AnnotationConfigApplicationContext ac
        //       = new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println("1. 加载Spring,完成!");
        System.out.println();

        // 2. 从Spring中获取对象
        System.out.println("2. 从Spring中获取对象,开始……");
        UserMapper userMapper = ac.getBean("userMapper", UserMapper.class);
        System.out.println("2. 从Spring中获取对象,完成!");
        System.out.println();

        // 3. 测试使用对象,以便于观察是否获取到了有效的对象
        System.out.println("3. 测试使用对象,开始……");
        System.out.println("\tuserMapper > " + userMapper);
        System.out.println("3. 测试使用对象,完成!");
        System.out.println();

        // 4. 关闭
        System.out.println("4. 关闭,开始……");
        ac.close();
        System.out.println("4. 关闭,完成!");
    }
}

编辑配置类

效果: 和配置文件类似
注解作用: 标识/标记
注解1: @Configuration
注解2: @Bean 作用于方法
注解3: @ComponentScan(“com.jt.demo4”) //包扫描注解: 让spring注解生效!!!

package com.jt.demo4;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  //标识当前类是配置类
@ComponentScan("com.jt.demo4")  //包扫描注解: 让spring注解生效!!!
public class SpringConfig {
    //作用: 和配置文件类似,管理对象!!!

    /**
     * IOC-写法
     *  1.@Bean 告诉Spring容器,当前方法的名称,为Map中的key
     *    返回值是Map中的value.
     *  2.特殊用法:
     *      常规条件下,Spring通过反射实例化对象.
     *      也可以由用户自己new的方式创建
     * @return
     */
    @Bean
    public Dog dog(){
        return new Dog();
    }
}

编辑测试类

package com.jt.demo4;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class User {

    public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        Dog dog = context.getBean(Dog.class);
        dog.hello();
    }
}

 Spring中的单例和多例问题

概念

单例对象: Spring中保存一份对象.
多例对象: Spring容器负责创建多次对象. 内存中对象多份.

单例/多例测试

注解: @Scope(“singleton”)/@Scope(“prototype”)
结论:
1.Spring容器默认条件下,对象都是单例对象. 节省内存空间!!!
2. Spring容器提供了多例对象的方法,一般适用 数据库链接/资源链接等功能…

在这里插入图片描述

 Spring中的懒加载

知识回顾:
懒汉式: 用户使用时创建.
饿汉式: 不管需不需要都要创建.

懒加载: 默认条件下Spring容器启动时都会实例化对象. 如果用户使用时创建对象,则使用懒加载机制!!!
规则:
1. spring容器启动,对象创建 不是懒加载
2. 当用户使用时创建对象. 是懒加载.

注意事项:
1.如果当前对象是多例模式, 则都是懒加载规则
2.懒加载的控制,只对单例对象有效!!!

在这里插入图片描述

Spring管理的对象的生命周期

由Spring创建并管理对象,则开发人员就没有了对象的控制权,无法对此对象的历程进行干预,而Spring允许在类中自定义最多2个方法,分别表示初始化方法和销毁方法,并且,Spring会在创建对象之后就执行初始化方法,在销毁对象之前执行销毁方法。

关于这2个方法,你可以按需添加,例如,当你只需要干预销毁过程时,你可以只定义销毁的方法,不需要定义初始化方法。

关于这2个方法的声明:

  • 访问权限:推荐使用public
  • 返回值类型:推荐使用void
  • 方法名称:自定义
  • 参数列表:推荐为空

然后,需要在初始化方法的声明之前添加@PostConstruct注解,在销毁方法的声明之前添加@PreDestroy注解。

用@Component也可以创建对象

package cn.tedu.spring;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class UserMapper {
    public UserMapper() {
        System.out.println("\tUserMapper.UserMapper()");
    }

    @PostConstruct
    public void init(){
        System.out.println("userMapper.init()");
    }
    @PreDestroy
    public void destory(){
        System.out.println("userMapper.destory()");
    }
}
package cn.tedu.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringRunner {

    // @Component
    public static void main(String[] args) {
        // 1. 加载Spring
        System.out.println("1. 加载Spring,开始……");
        AnnotationConfigApplicationContext ac
                = new AnnotationConfigApplicationContext(UserMapper.class);
        System.out.println("1. 加载Spring,完成!");
        System.out.println();

        // 2. 从Spring中获取对象
        System.out.println("2. 从Spring中获取对象,开始……");
        UserMapper userMapper=ac.getBean("userMapper",UserMapper.class);
        System.out.println("2. 从Spring中获取对象,完成!");
        System.out.println();

        // 3. 测试使用对象,以便于观察是否获取到了有效的对象
        System.out.println("3. 测试使用对象,开始……");
        System.out.println("UserMapper");
        System.out.println("3. 测试使用对象,完成!");
        System.out.println();

        // 4. 关闭
        System.out.println("4. 关闭,开始……");
        ac.close();
        System.out.println("4. 关闭,完成!");
    }
}

 运行结果

1. 加载Spring,开始……
	UserMapper.UserMapper()
userMapper.init()
1. 加载Spring,完成!

2. 从Spring中获取对象,开始……
2. 从Spring中获取对象,完成!

3. 测试使用对象,开始……
UserMapper
3. 测试使用对象,完成!

4. 关闭,开始……
userMapper.destory()
4. 关闭,完成!

单词:

configuration:配置

annotation:注释

scope:范围

手写Spring框架 在学习完Spring框架之后, 我们知道了 Spring容器, IOC, AOP, 事务管理, SpringMVC 这些Spring的核心内容, 也知道了它们底层实现的基本原理, 比如Spring容器就是个Map映射, IOC底层就是反射机制, AOP底层是动态代理, SpringMVC不就是对Servlet进行了下封装嘛! 哈哈, 当然这些只是些皮毛, Spring除此之外还有更加复杂的设计, ... 阅读详情

相关推荐

【Spring框架】Spring概述及基本应用

Spring框架优点,构建及demo

一个真ikun 2062

SpringIOC中Bean对象的作用域和生命周期

目前我本人正在学习SpringFramework的知识,这也是这个专栏的主题。我前面的几篇博文中,简单的认识了一下SpringFramework,记录了SpringFramework的环境搭建,记录了SpringIOC如何加载配置文件,记录了SpringIOC三种Bean对象的实例化方法。还记录了SpringIOC手动装配(注入)的方法之一:set方法注入。还有另外三个不太常用的SpringIOC手动注入的方法。其实目前大部分都使用的是自动注入的方法,手动注入使用的不多。就算是使用手动注入的方法,使用的主流

weixin_46281472的博客 552

Androiud安卓链接sqllite的代码使用案例

【代码】Androiud安卓链接sqllite的代码使用案例。

laterstage的博客 1328

Spring完整版(三)

Spring完整版(三)七、Bean的自动装配7.1、测试环境搭建7.2、byName7.3、byType7.4、使用注解实现自动装配@Autowired@Qualifier@Resource小结八、使用注解开发8.1、Bean的实现8.2、属性注入8.3、衍生注解8.4、自动装配注解8.5、作用域8.6、小结九、使用Java的方式配置Spring 七、Bean的自动装配 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean。 Sp

Roc的博客 571

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 447

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1206

springIOC的作用及介绍

springIOC 及对应四种模式

开始的博客 1773

保姆级教程:用Qlib和LightGBM从零搭建你的第一个AI量化选股策略(附完整代码)

本文提供了一份详细的教程,教你如何使用Qlib和LightGBM从零搭建AI量化选股策略。教程涵盖了环境配置、数据获取、特征工程、模型训练和策略回测等关键步骤,并附有完整代码和常见问题解决方案,适合量化投资初学者快速上手。

weixin_29191081的博客 446

Springboot学习:整合log4j2打印System.out日志

Springboot整合log4j2打印System.out日志 记一次开发踩坑,springboot整合log4j2的过程中,try catch 捕获异常后,Exception.printStackTrace()方法却没有将错误日志打印到日志文件中,通过阅读源码发现,printStackTrace使用的是System.err进行日志打印,所以采用下面的办法进行处理,自定义PrintStream 1、继承PrintStream父类,并重写print这一类方法,使用log输出。 public class Lo

谦竹墨客 2776

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 526

1 硬件工程师笔面试高频知识考点真题及解析——电阻

本文系统介绍了电阻的基础知识、选型要点及各类特殊电阻的应用。主要内容包括:1. 电阻选型需考虑阻值、封装、功率、精度、耐压等参数;2. 高频信号优先选用小封装电阻以减小寄生参数;3. 采样电阻需高精度、低温漂以保证测量准确性;4. 详细解析了上拉/下拉电阻、0欧电阻、磁珠等元件的特性与区别;5. 介绍了压敏电阻、热敏电阻等特殊电阻的工作原理及应用场景;6. 阐述了阻抗匹配的重要性及常见匹配方法。文章为电子工程师提供了全面的电阻选型与应用指南。

XU157303764的博客 2858

什么是spring框架?spring框架到底有什么用?spring框架到底做了些什么?

什么是spring框架,spring框架究竟有什么用呢?我们可以用spring框架来做些什么呢?让我们来具体了解一下,以及经常所说的IOC和AOP是一种怎样的思想,到底是怎么实现这些思想的!

小汤圆的博客 3万+

从win系统远程使用服务器中的nsight system、nsight compute

本文介绍了如何在Windows系统中远程使用服务器上的Nsight System和Nsight Compute工具。主要内容包括:1)双系统同步安装相同版本的Nsight工具,配置环境变量;2)命令行生成profile文件或直接运行分析;3)Windows远程连接服务器的配置方法;4)解决权限问题的具体方案,如修改文件夹权限或调整NVIDIA驱动配置。文章提供了详细的安装步骤和常见问题解决方案,适用于需要进行GPU性能分析和调试的开发人员。

Justinyh的博客 401

【Spring框架】Spring框架介绍

文章目录Spring框架介绍Spring两大核心技术Spring的优点Spring体系介绍核心容器数据访问/集成Web页面其他模块 Spring框架介绍 Spring框架是分层的 Java SE/EE 应用 full-stack 全栈式轻量级开源框架,以 IOC(Inverse Of Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 SpringMVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术

Super_Powerbank的博客 1654

Muse Spark:功能、性能测试及使用方法

对于一个仅用九个月时间从零开始重建的团队来说,这样的健康状况和多模态测试结果无疑是迈出了坚实的第一步,并且经受住了独立测试的考验。Muse Spark 为每个产品确定了最重要的主题(A 产品的发布策略、B 产品的定价策略、C 产品的规模化策略),并提出了切实可行的具体行动方案。抽象视觉推理也遵循同样的模式:Muse Spark 的 ARC-AGI-2 得分为 42.5,而 GPT-5.4 和 Gemini 的得分都在 70 分左右。他的离职是由于组织结构的变化限制了他的角色,以及团队转向闭源开发。

xiaoshun007的专栏 123

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spring框架介绍_Spring框架介绍

spring框架介绍 这是Spring框架和Spring核心概念的简介。 在本教程中,我们将介绍Spring Framework的主要优点和功能。 在随后的教程中,我们将学习有关Spring和Spring Boot的更多信息。 总览 我们知道, Spring框架是Java开发人员中最受欢迎的应用程序框架。 Spring以为Java 几乎可以完成的所有工作提供抽象和基础结构框架而闻名。 在较...

最佳 Java 编程 1309

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

重学Spring框架系列之——什么是Spring框架

说在前面 Spring框架算得上是java程序员必备的一项技能了。不论是早期的SSM或SSH架构,还是现在流行的SpringBoot加SpringCloud构建的分布式、微服务架构。Spring在其中扮演着不可或缺的角色,其重要性也是不言而喻的。 为了更好的工作和自身的提升,菜鸟又重新学习了一下Spring框架,在学习的过程中也有一些收获,从而想着通过文章将自己的学习过程记录下来。也希望可以帮助到有需要的人。如果文章中存在不合理或错误的地方也希望大家可以提出来,我会及时改正,希望我们可以一起进步。 既然我们

first_M的博客 590

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

spring框架_Spring框架介绍

spring框架 这是Spring框架和Spring核心概念的简介。 在本教程中,我们将介绍Spring Framework的主要优点和功能。 在随后的教程中,我们将学习有关Spring和Spring Boot的更多信息。 总览 我们知道, Spring Framework是Java开发人员中最受欢迎的应用程序框架。 Spring以为Java几乎可以完成的所有工作提供抽象和基础结构框架而闻名。 ...

cunhui1209的博客 205

如何下载Spring框架

首先进入Spring官网:https://spring.io/ 点击PROJECTS   找到SPRING FRAMEWORK 并点击  因为是托管在github上的,所以点击github标志  找到Spring Framework Artifacts 找到Spring仓库连接  点击Artifacts选项 然后找到菜单下的 libs-release-local...

liutao2001的博客 2万+

spring框架_Spring框架和Spring Boot框架的区别

什么是Spring Boot框架?什么是Spring框架?他们的目标是什么?他们产生的背景是怎样的,两者有什么区别,我们应该使用哪个框架进行开发,带着这样的疑问,我们开始今天的讲解。Spring框架背景Spring框架是Java最受欢迎的应用程序开发框架之一。Spring的最佳功能是它具有依赖注入(DI)或控制反转(IOC), 这使我们能够开发松耦合的应用程序。而且,松耦合的应用程序可以轻松地进行...

weixin_39563823的博客 246
上一篇: Maven
下一篇: Spring ICO和DI
五八个
博客等级 码龄8年 638粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值