SpringBoot-基础

SpringBoot-基础

1.IOC控制反转

Spring的核心是IoC(Inversion of Control,控制反转)容器,它可以管理容器内的普通Java对象以及对象之间关系的绑定(Dependency Injection依赖注入)。容器中被管理的对象称为Bean。

Spring是通过元数据和POJO来定义和管理Bean的。
◎POJO:简单的Java对象。
◎元数据:描述如何管理POJO的数据。

2.注解配置(@Compoent)

当使用了@Compoent,@Service,@Controller,@Repository时,Spring容器(@CompoentScan实现)会自动扫描,并将他们注册成被容器管理的Bean.

@Service、@Repository和@Controller这三个注解组合了@Component注解,它们是@Component语义上的特例。

3.JAVA配置(@Configuration和@Bean)

在类上注解@Configuration(@Component的特例,会被容器自动扫描),可使类成为配置类。如果使用@Bean标注在类的方法上,则方法的返回值即为Bean的实例。

4.依赖注入(DI)

1.注解注入-直接注入类:在类的属性上添加@Autowired注解,即可获取容器中的Bean对象.

@Component
public class SpringTestDI {public void di(){System.out.println("已注入Bean的方法");}
}
@SpringBootTest
@Component
public class SpringAuto {@Autowiredprivate SpringTestDI springTestDI;@Testpublic void autoPoint(){this.springTestDI.di();}
}

2.注解注入-注入方法:加在方法上,注册Bean的时候会自动依赖注入

@Component
public class SpringTestDI {public void di(){System.out.println("已注入Bean的方法");}
}
@Component
@Data
public class SpringAuto {private SpringTestDI springTestDI;@Autowiredpublic void autoPoint(SpringTestDI springTestDI){this.springTestDI = springTestDI;}
}
@SpringBootTest
public class SpringTest {@Autowiredprivate SpringAuto springAuto;@Testpublic void xxx(){SpringTestDI springTestDI = springAuto.getSpringTestDI();springTestDI.di();}
}

3.注解注入-构造方法:加在构造方法上依赖注入,只有一个构造方法可以默认不写@Autowired

@SpringBootTest
@Component
@Data
public class SpringAuto {private SpringTestDI springTestDI;public SpringAuto(SpringTestDI springTestDI){this.springTestDI = springTestDI;}}
5.@Primary

使用@Autowired注解是根据类型自动注入的,当两个类型相同时,无法正确注入,可以使用@Primary注解来确定注入哪一个Bean

@Configuration
public class SpringPrimary {@Beanpublic SpringAuto a(){System.out.println("a");return new SpringAuto("a");}@Primary@Beanpublic SpringAuto b(){System.out.println("b");return new SpringAuto("b");}
}
6.@Qualifier

通过指定名称来确定依赖注入的bean

@Configuration
public class SpringPrimary {@Bean("a")public SpringAuto a(){System.out.println("a");return new SpringAuto("a");}@Bean("b")public SpringAuto b(){System.out.println("b");return new SpringAuto("b");}
}
@Autowired
@Qualifier("a")
private SpringAuto springAuto;
7.运行校验CommandLineRunner

是Spring Boot框架提供的一个接口,主要用于应用启动后立即执行特定的业务逻辑。当一个类实现了 CommandLineRunner 接口,Spring Boot将会自动检测并运行该类的 run 方法。这对于一些初始化任务或者一次性执行的任务非常有用,比如读取配置文件、数据预加载、初始化缓存等。

@Component
public class SpringCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("SpringBoot项目启动完成,我来前面探探路");}
}
8.@Scpoe

指定Bean的作用域,默认是单例模式,整个容器只有一个相同类型的bean

  1. Singleton(单例)
    • 默认作用域,Spring容器中每个Bean定义对应一个单一实例。
    • 整个容器中,无论何时何处请求该Bean,都会返回相同的实例。
  2. Prototype(原型)
    • 每次请求都会创建一个新的Bean实例。
    • 适用于需要独立状态和生命周期的对象,比如临时性的操作对象。
  3. Request
    • 仅在Web应用上下文中适用,每次HTTP请求都会创建一个新实例,仅在当前请求的生命周期内有效。
  4. Session
    • 同样在Web应用上下文中,每个HTTP Session拥有一个Bean实例,该实例在会话期间持续有效。
  5. GlobalSession(Application Session):
    • 仅在支持portlet的Web应用中使用,每种全局会话(如PortletSession或ServletContext)对应一个Bean实例。
  6. WebSocket
    • 在WebSocket相关的Spring应用上下文中,每个WebSocket连接对应一个Bean实例,仅在该连接生命周期内有效。
/*** 原型Prototype 每次都会创建一个新的实例*/
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class SpringScope {
}
@SpringBootTest
public class SpringTest {@Autowiredprivate SpringScope springScope1;@Autowiredprivate SpringScope springScope2;@Testpublic void xxx(){// 结果:false;  默认不使用Scope注解,结果为trueSystem.out.println(springScope1 == springScope2);}
}
9.Bean的生命周期

先了解简单的生命周期,以下是顺序执行

@Component
public class SpringLife {public SpringLife() {System.out.println("bean的构造方法");}@PostConstructpublic void init(){System.out.println("bean的初始化方法");}@PreDestroypublic void destroy(){System.out.println("bean的销毁方法");}
}
10.@Lazy

延迟初始化:再被调用的时候才会初始化,需要已常见四大组件注解搭配使用

11.@DependsOn

可以控制依赖注入的先后顺序

12.@Enable*

@Enable* 注解系列: Spring框架提供了一系列以 @Enable 开头的注解,这些注解用于启用特定的功能模块或框架特性。例如:

  • @EnableAspectJAutoProxy:启用Spring AOP代理和AspectJ切面自动代理功能。
  • @EnableCaching:启用Spring的缓存支持。
  • @EnableScheduling:启用定时任务调度功能。
  • @EnableTransactionManagement:启用Spring的事务管理支持。
  • @EnableWebMvc:在Spring MVC应用中启用注解驱动的Web MVC配置。
  • @EnableAsync : 用于启用异步方法执行的支持

这些注解通常放在一个配置类上,Spring在扫描和解析配置时会识别到这些注解,并加载相应的配置处理器来处理它们。

13.@Import

@Import 注解用于将其他配置类或配置类的全限定名导入到当前配置类中。当Spring容器加载包含 @Import 注解的配置类时,也会加载并处理被导入的配置类。这样可以实现多个配置类的整合和复用。

@Configuration
@Import({DatabaseConfig.class, ServiceConfig.class, WebConfig.class})
public class AppConfig {// ...
}
14.BeanPostProcessor接口

可以通过实现BeanPostProcessor接口,在构造时对容器内所有或者部分指定Bean进行处理。和@PostConstruct与@PreDestroy不同的是,它针对的是IoC容器里的所有的Bean。

  1. postProcessBeforeInitialization(Object bean, String beanName): 这个方法会在Spring容器对Bean实例化并设置好所有属性后,但在调用该Bean的初始化方法(如InitializingBean.afterPropertiesSet() 或者带有 @PostConstruct 注解的方法)之前调用。在该方法中,开发者可以对刚实例化的Bean进行进一步的加工或修改。
  2. postProcessAfterInitialization(Object bean, String beanName): 这个方法会在Bean的初始化方法调用完毕后,但在Bean正式交付给Spring容器使用之前调用。开发者可以在该方法中对已经初始化完成的Bean做进一步的处理,例如AOP代理增强、日志记录等。
public class PostProcessorTest implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("属性设置之后,Bean初始化之前:" + beanName + "]");// 可以对bean进行某些操作,例如AOP代理、属性修改等return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("Bean初始化之后: [" + beanName + "]");// 同样可以对bean进行更多后期处理return bean;}
}
15.Spring Aware

Spring Aware 是Spring框架中一系列接口的总称,这些接口允许Spring容器在实例化和初始化Bean的过程中向Bean注入特定的资源或信息。实现这些Aware接口的类能够感知Spring容器的存在,并通过Spring容器获取相应的服务或上下文。

◎BeanNameAware:可获得beanName,即Bean的名称。
◎ResourceLoaderAware:可获得ResourceLoader,即用来加载资源的Bean。

◎BeanFactoryAware:可获得BeanFactory,即容器的父接口,用于管理Bean的相关操作。
◎EnvironmentAware:可获得Environment,即当前应用的运行环境。
◎MessageSourceAware:可获得MessageSource,即用来解析文本信息的Bean。
◎ApplicationEventPublisherAware:可获得ApplicationEventPublisher,即用来发布系统时间的Bean。
◎ApplicationContextAware:可自动注入ApplicationContext,即容器本身。

16.Spring 事件通信

如果Bean之间需要通信,比如说BeanA完成了处理后需要告知BeanB,通知BeanB继续处理,那么我们称BeanA为Publisher,称BeanB为Listener。

/*** 事件类* @Author : MengYansong* @create 2024/1/29 15:53*/
public class MyEvent extends ApplicationEvent {public MyEvent(Object source) {super(source);}
}
/*** 发布事件*/
@Component
public class EventPublisher {private final ApplicationContext context;@Autowiredpublic EventPublisher(ApplicationContext context) {this.context = context;}public void fireEvent() {System.out.println("1.发布事件");context.publishEvent(new MyEvent(this));}
}
/*** 事件监听*/
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {// 在这里处理事件逻辑System.out.println("2.监听事件: " + event);}
}
17Spring EL

Spring EL(Spring Expression Language,Spring表达式语言)是Spring生态下的通用语言,在运行时使用表达式查询属性信息(使用符号$)或操作Java对象(使用符号#),主要用在XML或注解上。

@SpringBootTest
public class SpringTest {@Autowiredprivate EventPublisher eventPublisher;@Value("${yyds.y1}")private String name;@Testpublic void xxx(){System.out.println(name);}
}
yyds:y1: 666y2: 777

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Javassist字节码增强实现本地公参传递

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 测试线上的公参是通过skywalking agent的方式进行传递的。 如果是本地则会因为获取不到公参报错影响正常测试。所以需要本地也进行公参传递 正常链路是 前…

一体化设计:兼容多种OS系统Linux网关楼宇DDC

在工业物联网&#xff08;IIoT&#xff09;和智能建筑领域&#xff0c;钡铼网关具备高度灵活性与强大计算能力的边缘网关产品正逐渐成为推动行业智能化转型的关键要素。本文将详细介绍的基于Linux系统的4G工业智能网关&#xff0c;不仅拥有NXP i.MX8M Mini四核64位处理器的强大…

设计一个数据库连接池

注意点 限制连接池中最多可以容纳的连接数目&#xff0c;避免过度消耗系统资源当客户请求连接&#xff0c;而连接池中所有连接都已被占用时&#xff0c;一种方式是让客户一直等待&#xff0c;直到有空闲连接&#xff0c;另一种方式是为客户分配一个新的临时连接。当客户不在使…

《golang设计模式》第三部分·行为型模式-10-模板方法(Template Method)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 模板方法&#xff08;Template Method&#xff09;用来定义算法的框架&#xff0c;将算法中的可变步骤定义为抽象方法&#xff0c;指定子类实现或重写。 1.1 角色 AbstractClass&#xff08;…

质数判断(5种方法)

1.普通枚举所有因数 if(n<2) return 0; if(n2) return 1; for(int i2;i<n/2;i) if(!(n%i)) return 0; return 1; 2.枚举所有因数对中较小的部分&#xff08;到sqrt(n)&#xff09; if(n<2) return 0; if(n2) return 1; int tmpsqrt(n)//注意&#xff0c;n为大整数时…

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;即数据抽取、转换、装载的过程。它是一种思想&#xff0c;主要是说&#xff0c;从不同的数据源获取数据&#xff0c;并通过对数据进行处理&#xff08;格式&#xff0c;协议等转换&a…

Java-12a.Spring 中通过 TaskDecorator 配置默认异步线程池

Java-12.Spring 中通过 ThreadPoolTaskExecutor 和 AsyncConfigurerSupport 配置默认异步线程池 前言 在Spring框架中&#xff0c;TaskDecorator 是一个接口&#xff0c;它可以用来自定义由 ThreadPoolTaskExecutor 或其他任务执行器管理的任务的装饰行为。这通常用于在执行任…

第32关 k8s集群管理开源神器 - k9s

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 随着我们管理维护的K8S集群上线&#xff0c;怎么管理好集群上面成百上千的服务pod&#xff0c;就是我们该操心的事情了。这里博哥把在生产中一直在用的一个开源管理工具k8s&#xff0c;github…

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出&#xff0c;滑到最下面&#xff0c;出现这个就说明构建成功了&#xff0c;如果没有出现&#xff0c;说明构建有问题&#xff0c;需要解决好问题才能启动哦~

C++实现通讯录管理系统

目录 1、系统需求 2、创建项目 2.1 创建项目 3、菜单功能 4、退出功能 5、添加联系人 5.1 设计联系人结构体 5.2 设计通讯录结构体 5.3 main函数中创建通讯录 5.4 封装联系人函数 5.5 测试添加联系人功能 6、显示联系人 6.1 封装显示联系人函数 7、删除联系人 7.1…

GPT栏目:yarn 安装

GPT栏目&#xff1a;yarn 安装 一、前言 在跟GPT交互的时候&#xff0c;发现最近gpt4给出的答案率有了比较明显的提高&#xff0c;简单记录一下&#xff0c;我用gpt4拿到的答案吧。 本人已按照这个步骤成功 二、具体步骤 要安装 yarn&#xff0c;你可以按照以下步骤进行操作…

MyBatis常见面试题汇总

说一下MyBatis执行流程&#xff1f; MyBatis是一款优秀的基于Java的持久层框架&#xff0c;它内部封装了JDBC&#xff0c;使开发者只需要关注SQL语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接等的过程&#xff0c;MyBatis的执行流程如下&#xff1a; 加载配…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 题目共4问&#xff0c;描述网络通信中的 帧传输时延&#xff08;Frame Delay&#xff09;、传播时延&#xff08;Propagation Delay&#xff09;&#xff0c;以及 链接利用率&#xff08;Link Utilization&#xff09; 的相关…

【NodeJS】005- NodeJS的NVM与express框架

1.NVM介绍与使用 1.介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具,方便切换不同版本的Node.js 2.使用 nvm 的使用非常的简单,跟 npm 的使用方法类似 3.下载安装 首先先下载 nvm,下载地址 https://github.com/coreybutler/nvm-windows/rel…

Vue2:通过代理服务器解决跨域问题

一、场景描述 现在的项目大多数是前后端分离的。Vue前端项目通过ajax去请求后端接口的时候&#xff0c;会有同源策略的限制。从而产生跨域问题。 二、基本概念 1、什么是同源策略&#xff1f; 就是前端服务和后端服务的协议名&#xff0c;IP或主机名&#xff0c;端口号不完…

0x02递推与递归

0x02递推与递归 递推者&#xff0c;自小而大&#xff0c;循序渐进&#xff1b;递归者&#xff0c;由上而下&#xff0c;分而治之 文章目录 0x02递推与递归例题T1&#xff1a;T2&#xff1a;T3&#xff1a;T4:T5T6 例题 T1&#xff1a; 92. 递归实现指数型枚举 - AcWing题库 …

Mysql 插入数据

1 为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值。基本语法格式为&#xff1a; INSERT INTO table_name (column_list) VALUES (value_list); 使用INSERT插入数据时&#xff0c;允许列名称列表column_list为空&#xff0c;此时&…

网络安全战略中的法律问题

文章目录 前言一、各国网络安全的法律需求陡增二、战争的多维化使对法律的需求也越加多样(一)从平时到战时,网络斗争的平战模糊性增加法律适用难度(二)从高维到低维,博弈的多维性使法律需求层次更加丰富(三)从防御到进攻,网络空间的攻防不均衡改变法律斗争重点三、各国…

flink分别使用FilterMap和ProcessFunction实现去重逻辑

背景 在日常的工作中&#xff0c;对数据去重是一件很常见的操作&#xff0c;比如我们只需要保留重复记录的第一条&#xff0c;而忽略掉后续重复的记录&#xff0c;达到去重的效果&#xff0c;本文就使用flink的FilterMap和ProcessFunction来实现去重逻辑 FilterMap和ProcessF…