JAVAEE2

本文详细介绍了SpringBoot的核心特性,包括其简化应用开发、整合技术栈以及一站式解决J2EE问题。深入探讨了SpringBoot的自动配置原理,解释了@Autowired的工作机制,以及如何通过@Primary和@Qualifier消除依赖注入的歧义。同时,概述了Spring的Bean生命周期,包括Bean的创建、初始化、依赖注入和销毁过程。此外,文章还涵盖了Spring的多种Bean注入方式,如set注入、构造方法注入和@Autowired注入,并讨论了Spring的核心——IoC和AOP。最后,文章提到了Spring Data JPA的常用注解和Linux常用命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Springboot
简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;
springboot参数配置默认加载顺序
在这里插入图片描述

Springboot自动配置原理
Spring Boot启动的时候会通过@EnableAutoConfiguration注解扫描所有jar包类路径下META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
@Autowired
首先它会根据类型找到对应的 Bean,如果对应类型的 Bean 不是唯一的,那么它会根据其属性名称和 Bean 的名称进行匹配。如果匹配得上,就会使用该 Bean :如果还无法匹配,就会抛出异常。
消除歧义性一一@Primary 和@Quelifier
@Primary 含义告诉IoC容器,当发现有多个同样类型的Bean时,优先使用该组件进行注入;有时候@Primary可以使用在多个类上,此时IoC容器还是无法区分采用哪个 Bean 的实例进行注入,它的配置项value需要一个字符串去定义,它与@Autowired组合使用,通过类型和名称一起找到Bean。
类似BeanFactory接口的下面这个方法:
T getBean(String name , Class requiredType) throws BeansException;
spring bean的生命周期:
1.资源定位,比如@ComponentScan所定义的扫描包
2.将Bean的定义保存到BeanDefiniton实例中
3.发布Bean定义,将它装载IOC容器中
4.Bean的初始化(实例化+依赖注入)
5.Bean生存期
6.Bean销毁
ComponentScan 中还有个配置项 lazyIinit ,只可以配 Boolean 值,且默认值为 false ,也就是默认不进行延迟初始化,在spring的IoC 容器初始化时就执行了实例化和依赖注入;设置为true时,我们取出Bean的时候才完成初始化和依赖注入。
读取配置文件
@Value("${database.name}");
@ConfigurationProperties(“database”) ;
@PropertySource(value={“classpath:jdbc.properties”},ignoreResourceNotFound=true)
条件装配bean
@Conditional
@Profile注解:多环境配置bean
@ImportResource:以引入对应的XML文件,用以加载 Bean
Spring的Bean的生命周期
流程节点都是针对单Bean 的,但是 BeanPostProcessor 是针对所有 Bean 的。
在这里插入图片描述
Spring的Bean容器都有哪些
SpringIOC容器是一个IOC Service Provider。提供了两种容器类型:BeanFactory和ApplicationContext。
BeanFactory是基础类型IOC容器。顾名思义,就是生产Bean的工厂。能够提供完整的IOC服务。没有特殊指定的话,其默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该对象进行初始化和依赖注入操作。
ApplicationContext是在BeanFactory的基础上边构建的,是相对比较高级的容器的实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他的高级特性。例如事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。相对于BeanFactory来说,ApplicationContext会要求更多的系统资源。因为在启动时就完成了所有的初始化,容器启动的时间与BeanFactory相比会长一些。因此,ApplicationContext更适用于系统资源充足,并且要求更多功能的场景中。
ApplicationContext间接继承自BeanFactory,所以说它是构建与BeanFactory之上的IOC容器。
ApplicationContext的诸多实现中,经常会用到的有以下三种实现:
ClassPathXMLApplicationContext 从类路径中的XML文件载入上下文定义信息
FileSystemXmlApplicationContext 从文件系统中的XML文件载入上下文定义信息
AnnotationConfigApplicationContext 基于注解来使用的,它不需要配置文件
spring注入方式
1.set注入2.构造方法注入3.@Autowired注入
Spring的核心
IoC(Inverse of Control 反转控制)
AOP(Aspect Oriented Programming 面向切面编程)。作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
spring的事务传播行为
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
SpringAOP 编程的本质
通过约定,把对应的方法通过动态代理技术织入约定的流程中
@Pointcut:定义切点
execution(* com.springboot.chapter4.aspect .service.impl.UserServceimplprintUser (. . ) )
其中:
• execution表示在执行的时候 ,拦截里面的正则匹配的方法:. *表示任意返回类型的方法:
•com.springboot.chapter4.aspect.service.impl.UserServicelmpl 定目标对象的全限定名称:
• printUser 指定目标对象的方法
•(…)表示任意参数进行匹配。
AspectJ 关于 Spring AOP 切点的指示器:
arg()
@args()
execution()
this()
target
@target()
within
@within()
@annotation()
限定连接点方法参数
通过连接点方法参数上的注解进行限定
用于匹配是连接点的执行方法
限制连接点匹配AOP代理Bean引用为指定的类型
目标对象(即被代理对象)
限制目标对象的配置了指定的注解
限制连接点匹配指定的类型
限定连接点带有匹配注解类型
限定带有指定注解的连接点
AOP之引入

@Aspect
public class MyAspect {
@DeclareParents(
value= "com.springboot.chapter4.aspect.service.impl.UserService mpl +”,
defaultimpl=UserValidator mpl.class)
public UserValidator userValidator; 
}

value:指向要增强功能的目标对象;defaultImpl:引入增强功能的类
在前置通知中获取参数
@Before(“pointCut() && args(user)”)
public roid beforeParam (JoinPoint point, User user) {
Object[] args = point.getArgs ( ) ;
}
配置多个切面
使用@Order配置多个切面的顺序,如@Order(1),@Order(2)
对于前置通知,都是从小到大执行的,而对于后置通知和返回通知,是从大到小执行的;
这是责任链模式的顺序
另外一种方式:切面类实现Order接口,并实现int getOrder()方法
@Transaction失效
1.用在非public修饰的方法上
2.若是错误的配置以下三种 propagation,事务将不会发生回滚。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
3.Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务
4.同一类中方法调用,@Transactional失效(aop是基于动态代理)
5.try catch导致失效
构建REST风格网站
GET:访问服务器资源
POST:提交资源信息,创建新资源。
PUT:修改服务器己经存在的资源,使用PUT时需要把资源的所有属性一并提交
PATCH:修改服务器已经存在的资源,PATCH只需要将部分资源属性提交,目前这个动作不常用也不普及
DELETE:删除服务器资源
HEAD:获取资源元数据(Content-type)
OPTIONS:提供资源可供客户端修改的属性信息
Spring Aop基本概念
连接点:对应的是具体被拦截的对象,因为 Spring 只能支持方法 所以被拦截的对象往往就是指特定的方法。
切点:有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点,切点就是提供这样个功能的概念。
通知:就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。
目标对象:被代理的对象。
引入:是指引入新的类和其方法,增强现有Bean功能。
织入:它是通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程。(织入是一个生成动态代理对象并且将切面和目标对象的方法编织成为约定流程的过程)
切面:是一个可以定义切点、各类通知和引入的内容,SpringAOP 将通过它的信息来增强 Bean的功能或者将对应的方法织入流程。

Spring Aop通知类型
1.前置通知。在目标方法执行之前执行执行的通知。
2.环绕通知。在目标方法执行之前和之后都可以执行额外代码的通知。
3.后置通知。在目标方法执行之后执行的通知。
4.异常通知。在目标方法抛出异常时执行的通知。
5.最终通知。是在目标方法执行之后执行的通知。和后置通知不同之处在于,后置通知是在方法正常返回后执行的通知,如果方法没有正常返-例如抛出异常,则后置通知不会执行。
而最终通知无论如何都会在目标方法调用过后执行,即使目标方法没有正常的执行完成。
在目标方法没有抛出异常的情况下
环绕通知的调用目标方法之前的代码
前置通知
目标方法
环绕通知的调用目标方法之后的代码
后置通知
最终通知
在目标方法抛出异常的情况下
环绕通知的调用目标方法之前的代码
前置通知
目标方法 抛出异常 异常通知
最终通知
Spring中的bean的作用域有哪些?
在这里插入图片描述
serverlet生命周期
1.创建servlet实例
2.当servlet实例化后,将调用这个对象的init()方法进行初始化
3.再调用对象的service()方法来处理请求,并返回处理结果,在调用service之前,需保证init初始化已被成功执行
4.当需要释放servlet的时候,调用对象的destroy()方法来结束,并释放资源

springmvc常用注解
@Controller @Service @Repository
@RequestMapping @GetMapping @DeleteMapping @PostMapping @PutMapping
@requestParam @ResponseBody @PathVariable
SpringMVC的流程?
在这里插入图片描述
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。

Mybatis#{}和dollar{}的区别是什么
#{}是预编译处理,dollar{}是字符串替换。
使用#{}可以有效的防止SQL注入,提高系统安全性。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
解决方案1:在sql语句中使用别名
解决方案2:resultMap –mapper配置
解决方案3:驼峰匹配 mybatis-config.xml
Mybatis动态sql
在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能。
动态sql标签:
1.if
2.choose,when,otherwise
3.where,set
4.foreach
MyBatis 的缓存
MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存要求返回的POJO实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置《cache/》
Mybatis中mapper的实现原理
MapperProxyFactory中,使用JDK的动态代理生成Mapper接口的代理。
在MapperProxy的invoke方法里先获取MapperMethod类,然后调用mapperMethod.execute()。
MapperMethod类是整个代理机制的核心类,对SqlSession中的操作进行了封装使用。
常用maven命令
mvn clean:将以前编译得到的旧文件class字节码文件删除
mvn compile:将java源程序编译成class字节码文件
mvn test-compile:编译测试程序
mvn test:自动测试,自动调用junit程序
mvn package:动态Web工程打War包,java工程打jar包
mvn install:Maven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置
Spring Data JPA 中常用注解
@Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表
@Table:设置实体类在数据库所对应的表名
@Id:标识类里所在变量为主键
@GeneratedValue:设置主键生成策略,此方式依赖于具体的数据库
@Column:表示属性所对应字段名进行个性化设置
@Transient:表示属性并非数据库表字段的映射,ORM框架将忽略该属性
@Enumerated:使用此注解映射枚举字段,以String类型存入数据库,注入数据库的类型有两种:EnumType.ORDINAL(Interger)、EnumType.STRING(String)
@Embedded、@Embeddable:当一个实体类要在多个不同的实体类中进行使用,而其不需要生成数据库表
@Embeddable:注解在类上,表示此类是可以被其他类嵌套
@Embedded:注解在属性上,表示嵌套被@Embeddable注解的同类型类
@ElementCollection:集合映射
linux常用命令
ls,cd,pwd,mkdir,touch,rm,mv,cp,cat,more,less,find,chmod,chown,chgrp,grep,ps,kill,tar,gzip,sudo,vi/vim
查看磁盘空间使用情况:
df -h 目录
springBoot异步线程池
配置类实现 Asynconfigurer接口,并加上注解@EnableAsync,这样就可以使用注解@Async异步调用。

@Configuration
@EnableAsync
public class AsyncConf implements AsyncConfigurer {
//定义线程池
Override
public Executor getAsyncExecutor () {
//定义线程池
ThreadPoolTaskExecutor taskExecutor =new ThreadPoolTaskExecutor();
//核心线程数
taskExecutor.setCorePoolSize (10);
//线程池最大线程数
taskExecutor.setMaxPoolSize (30) ;
//线程队列最大线程数
taskExecutor.setQueueCapacity(2000) ;
//初始化
taskExecutor.initialize();
return taskExecutor;
}
}

定时任务
配置类上标注@EnableScheduling,@Scheduled配置定时
配置项:
cron(String):使用表达式的方式定义任务执行时间
zone(String):设定区域时间
fixedDelay(long):从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒
fixedDelayString(String):与fixedDelay相同,只是可使用字符串
initialDelay(long):在IOC容器完成初始化后,首次任务执行的延迟时间,单位毫秒
initialDelayString(String):与initialDelay相同,只是可使用字符串
fixedRate(long):从上一个任务开始到下一个任务开始的间隔,单位毫秒
fixedRateString(String):与fixedRate相同,只是可使用字符串,这样可以用spEl从配置文件取值
cron有6-7个时间元素,依次是“秒 分 时 天 月 星期 年”,其中年是一个可以不配置的元素
在这里插入图片描述

通配符

* 表示任意值
? 不指定值,用来处理天和星期的冲突
- 指定时间区间
/ 指定时间间隔执行,*/等同于0/
L 最后的
# 第几个
, 列举多个项
W:表示有效工作日(周一到周五),只能出现在DayofMonth域

linux cronTab格式
分 时 天 月 星期 command
通配符:*,/ -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值