Spring框架从入门到精通(纯干货,建议收藏)
文章目录
- 概述
- ioc控制反转
- 配置文件
- 使用spring创建对象
- 给属性赋值
- set注入
- 构造注入
- 引用类型的自动注入
- 注解
- 简单类型属性注入@Value(掌握)
- 引用类型注入@Autowired
- 引用类型注入@Resource
- 注解和配置文件的对比
- 多配置文件优势
- 组件扫描器
- AOP面向切面编程
- @Aspect:表示当前类是切面类
- @Before:前置通知注解
- @AfterReturning:后置通知
- @Around 环绕通知
- @AfterThrowing:异常通知(了解)
- @After:最终通知(了解)
- @Pointcut注解:定义和管理切入点
- 实际操作:
- 指定通知方法中的参数:JoinPoint
- spring集成Mybatis
- 步骤
- spring的事务处理
- PROPAGATION_REQUIRED
- PROPAGATION_SUPPORTS
- PROPAGATION_REQUIRES_NEW
- spring提交事务,回滚事务的时机
- spring框架中提供的事务处理方案
- web项目中怎么使用spring
- 使用方法:
- 思维导图(建议保存下来回顾)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607223312429.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAwNjY4Ng==,size_16,color_FFFFFF,t_70#pic_center)
前言,文章很长,但是满满干货,建议认真阅读.
概述
spring全家桶:spring,springmvc,spring boot,spring cloud
spring:出现在2002左右,为了解决企业开发难度.能够减轻对项目模块之间的管理和类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系
spring核心技术:ioc(控制反转),aop(面向切面编程)能实现模块之间,类之间的解耦合.
依赖:class A中使用class B的属性或者方法,叫做class A依赖class B
maven加入spring的依赖
<!-- spring的依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency>
ioc控制反转
框架的理解:框架是一个软件,是其他人写好的软件
- 知道框架能做什么,mybatis–访问数据库,对表中的数据执行增删改查
- 框架的语法,框架要完成一个功能,需要一定的步骤支持的
- 框架的内部实现,框架内部怎么做,原理是什么—>进一步的提升
- 通过学习,可以实现一个框架
spring的第一个核心功能 ioc
ioc(Inversion of Control):控制反转,是一个理论,概念,思想
简单描述:把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是说对象的创建是由其他外部资源来完成.
控制:创建对象,对象的属性赋值,对象之间的关系管理.
反转:把原来的开发人员管理,创建对象的权限转移给代码之外的容器实现由容器来代替开发人员管理对象,创建对象,给属性赋值.
正转:由开发人员在代码中,使用new构造方法创建对象,开发人员主动管理对象.
public static void main(String args[]){
Student student = new Student ();//在代码中,创建对象–正转
}
容器:是一个服务器软件,一个框架(spring)
为什么要使用ioc:对就是减少对代码的改动,也能实现不同的功能.实现解耦合.
java中创建对象有哪些方式:
- 构造方法
- 反射
- 序列化
- 克隆
- ioc:容器创建对象
- 动态代理
ioc的体现:servlet :
创建类继承HttpServlet
在web.xml注册servlet,使用
<servlet-name>myservlet</servlet-name><servlet-calss>bjpowernode.MyServlet</servlet-calss>
没有创建servlet对象,从没有MyServlet myservlet = new MyServlet()
servlet是tomcat服务器他给你创建的.tomcat也称为容器
tomcat作为容器:里面存放的有Servlet对象,Listener,Filter对象
IOC的技术实现:
DI是ioc的技术实现,
DI(Dependency Injection):依赖注入,只需要在程序中提供要是用的对象名称就可以,至于对象如何在容器中创建,赋值,查找都由容器内部实现.
spring是使用了DI实现了ioc的功能,spring底层创建对象,使用的是反射机制
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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<!--告诉spring创建对象声明bean,就是告诉spring要创建某个java对象id:对象的自定义名称,唯一值.spring通过这个名称来找到这个对象class:类的全限定名称(不能是借口,因为spring是反射机制,必须使用类)spring内部就完成了 SomeServlet someservlet = new SomeServletImp();spring是吧创建好的对象放入到map中,spring框架中会有一个map存放对象的springMap.put(id的值,对象);例如: springMap.put("someServlet",new SomeServletImp());一个bean标签声明一个java对象
--><bean id="someServlet" class="com.bjpowernode.service.impl.SomeServletImpl"></bean></beans>
<!--spring的配置文件1.beans:是根标签,spring中把java对象称为bean.2.spring-beans.xsd 约束文件,和mybatis中的dtd是一样的
-->
使用spring创建对象
//使用spring容器创建的对象//1.指定spring配置文件的名称String config = "beans.xml";//2.创建表示spring容器的对象,ApplicationContext//ApplicationContet就是表示Spring容器,通过容器对象获取对象了//ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件/** spring默认创建对象的时间:在创建spring的容器时,会创建配置文件中的所有对象* */ApplicationContext ac = new ClassPathXmlApplicationContext(config);//从容器中获取某个对象,你要调用对象的方法//getBean("配置文件中的bean的id值")SomeServlet servlet = (SomeServlet)ac.getBean("someServlet");//使用spring创建好的对象servlet.doSome();//使用spring提供的方法,获取容器中定义的对象的数量int nums = ac.getBeanDefinitionCount();
//容器中每个定义的对象的名称String[] names = ac.getBeanDefinitionNames();
给属性赋值
set注入
<!-- 声明student对象简单类型:spring中规定java的基本类型和String都是简单类型di:给属性赋值1.set注入(设值注入):调用spring类的set方法,你可以在set类的方法中完成属性赋值1).简单类型的set注入<bean id ="xx" class ="yy"><property name = "属性名字" value = "此属性的值"/>一个property只能给一个属性赋值</bean>
--><bean id="myStudent" class="com.bjpowernode.ba01.Student"><property name="name" value ="张三"/><property name="age" value ="20"/></bean>
相当于调用了对象的set方法
注意事项:
- 执行顺序是:先执行无参构造方法,后执行的是set方法赋值(如果没有set方法会报错,但set方法里面由开发人员决定)
- 如果id=“email” ,但是这个类中没有email属性,有一个setEmail()方法,则会执行setEmail()方法,只要有set方法就能用
注入引用对象方法:
2).引用类型的注入:spring调用类的set方法<bean id = "xxx" class = "yy"><property name ="属性名称" ref = "bean的id(对象的名称)"/></bean>
构造注入
构造注入:spring调用类的有参构造方法,在创建构造参数的同时,在构造方法中给属性赋值
构造注入 使用标签
标签:一个表示构造方法中的一个参数.
标签属性:
name表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右位置时0,1,2的顺序
value:构造方法的形参类型是简单类型的,使用value
ref:构造方法的形参类型是引用类型的,使用value
<!-- 使用name属性完成构造输入--><bean id="myStudent" class="com.bjpowernode.ba03.Student"><constructor-arg name="myname" value="张三"/><constructor-arg name="myage" value="20"/><constructor-arg name="myschool" ref="myXueXiao"/></bean><!-- 使用index属性--><bean id="myStudent2" class="com.bjpowernode.ba03.Student"><constructor-arg index="0" value="李四"/><constructor-arg index="1" value="26"/><constructor-arg index="2" ref="myXueXiao"/></bean>
引用类型的自动注入
spring框架根据某些规则,可以给引用类型赋值.不需要你再给引用类型赋值了,适用的规则常用的byName,byType
byName(按名称注入):java类中引用类型的属性名和spring容器中(配置文件)的id名称一样,且数据类型一致,这样的容器中的bean,spring能够赋值给引用类型
语法:
<bean id = "xx" class ="yyy" autowire="byName">
简单类型属性赋值
byType(按类型注入):java类中引用类型和spring容器中(配置文件)的class属性是同源关系的,这样bean能够赋值给引用类型
同源就是一类的意思:
- java类中引用类型的数据类型和class的值是一样的
- java类中引用类型的数据类型和bean的class的值父子类关系的
- java类中引用类型的数据类型和bean的class的值接口和实现类关系的.
注解
基于注解的DI:通过注解完成java对象的创建,属性赋值
使用注解的步骤:
- 加入maven的依赖 spring-context,在你加入spring-context的同时,间接加入spring-aop的依赖,使用注解必须使用spring-aop依赖
- 再类中加入spring的注解(多个不同功能的注解)
- 在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
需要学习的注解:
- @Component
- @Respotory
- @Service
- @Controller
- @Value
- @Autowired
- @Resource
@Component:(value属性指定对象的名称)
简写@Component(“myStudent”)
如果不写对象名称,由spring提供默认对象名称名称:类名的首字母小写
/*** @Compoent:是用来创建对象的,等同于bean的功能* 属性value就是对象的名称,也就是<bean>的id值,* value的值是唯一的,创建的对象在整个spring容器中就一个* 位置:在类的上面** @Component(value = "myStudent")等同于* <bean id = "myStudent" class="com.bjpowernode.ba01.Student"/>** spring中和@Component功能一致,创建对象的注解还有:* 1.@Repository(用在持久层类的上面):放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的* 2.@Service(放在业务层类的上面):放在Service的实现类的上面,创建service对象,* service对象是做业务处理,可以有事务功能的* 3.@Controller(放在控制器的上面):放在控制器类的上面,创建控制器对象的控制器对象,* 能够接受用户提交的参数,显示请求的处理结果.(Servlet)** 以上三个注解的使用语法和@Component一样的.都能够创建对象,但是这三个注解还有额外的功能** @Repository,@Service,@Controller是给项目的对象分层的* 当一个类既不是dao,service,controller的时候,可以使用@Component*/
@Component@Respotory@Service@Controller看上面的注释
简单类型属性注入@Value(掌握)
@Value:简单类型的属性赋值
属性:value 是String类型的,表示简单类型的属性值
位置:1.在属性定义上面,无需set方法,推荐使用
2.在set方法的上面
@Value("张飞")private String name ;@Value("29")private int age;
引用类型注入@Autowired
引用类型
@Autowired:spring框架提供的注解,实现引用类型的赋值
spring中通过注解给引用类型赋值,使用的是自动注入原理 ,支持byName,byType
@Autowired:默认使用的是byType自动注入
位置:1.在属性定义的上面,无需set方法,推荐使用
2.在set方法的上面
属性:required,是一个boolean类型的,默认为true
required= true:表示引用类型赋值失败,程序保存,并终止执行
required = false:引用类型如果赋值失败,程序正常执行,引用类型是null
如果要使用byName的方式,需要做 的是:
在属性的上面,加入@autowired
在属性的上面加入**@Qualifier(value=“bean的id”)
Spring框架从入门到精通(纯干货,建议收藏)相关推荐
- ❤️六万字《Spring框架从入门到精通》(建议收藏)❤️
❤️ Spring 代码:https://github.com/Donkequan/Spring-Study ❤️ 希望各位博友三连+关注!!! 1.简介 spring理念:是现有的技术更加容易使用, ...
- 视频教程-Spring框架快速入门到精通-Java
Spring框架快速入门到精通 十年项目开发经验,主要从事java相关的开发,熟悉各种mvc开发框架. 王振伟 ¥18.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 ...
- 2020最新Spring框架教程【IDEA版】-Spring框架从入门到精通
第一章:认识Spring spring思维导图 01p/102p Spring认识框架 02p/102p Spring官网浏览以及资源介绍 03p/102p 框架内部模块 第二章 IoC控制反转 04 ...
- spark 写本地文件_(纯干货建议收藏)一次GC引发的Spark调优大全
上一篇Tungsten On Spark-内存模型设计总结了Spark内存设计相关的知识点,本篇会快速为读者复习一下JVM相关的知识点,然后基于线上的GC调优对spark整体的调优做一个汇总,希望能让 ...
- ❤️《GUI编程从入门到精通》(建议收藏)❤️
GUI编程(+贪吃蛇示例代码) 组件: 窗口 弹出 面板 文本框 列表框 按钮 图片 监听事件 鼠标事件 键盘事件 1.简介 GUI的核心技术:Swing AWT 1.界面不美观, 2.需要j ...
- 青岛新媒体运营教程:纯干货建议收藏,给自媒体运营人10突破
自媒体创作的前提,一定是先有爱好,再有创作,否则很难持久. 当你在某个爱好领域深耕,并成为「专家」,哪怕是很偏的领域,也是能赚钱的. 抖音相比公众号,包容性和传播性肯定是更广的,包罗万象. 比如哪怕是 ...
- Spring Boot从入门到精通(超详细)
Spring Boot从入门到精通(超详细) _kayden_ 2020-07-20 15:19:22 9491 正在上传-重新上传取消 收藏 184 分类专栏: springboot 文章标签: ...
- Java学习从入门到精通的学习建议
想要学好java技术,首先打好基础很重要,不论学什么基础都是重中之重,学习Java更是如此.如:基础语法.核心类库.面向对象编程.异常.集合.IO流等基础如果学不好,那么后边更深入的语法也不容易学会. ...
- Oracle 数据怎么实时同步到 Elasticsearch | 亲测干货建议收藏
摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.我自己亲测了一种方式,很快实现了Oracle 数据实时 ...
最新文章
- java 模拟ajax上传图片
- 将widerface标注转换为VOC格式
- 汇编语言--微机CPU的指令系统(五)(字符串操作指令)
- Maven 使用bat批量清除本地仓库的lastUpdated文件
- 树莓派能直接运行python程序_树莓派怎么运行python程序
- python3进阶_Python3 进阶教程 2020全新版
- 怎么开启队友无伤_和平精英暗夜危机无敌点位送上!不仅无伤打僵尸 敌人还看不到你...
- iOS 疑难杂症 — — 推送本地国际化 loc-key 本地化失败的问题
- RNN神经网络- 吴恩达Andrew Ng 循环神经网络 NLP Transformers Week4 知识总结
- swift的if语句
- openstack项目_新项目,安全性以及更多OpenStack新闻
- C# 版 EXE捆绑器
- 小程序和H5有什么区别?
- Ubuntu 14.04 LTS 的安装和配置以及各种问题的解决
- Cocos2d-x 3D模型渲染
- 单晶进展:隆基发表LIR技术、天合推双面PERC组件
- 省级面板数据(2000-2019)四:固定资产投资+房地产(stata版)
- Wondershare PDFelement Pro Mac(好用的PDF编辑器)
- Sound Event Detection: A Tutorial
- 设备驱动的艺术之旅 - Watch Dog 的 NMI 应用场景
热门文章
- 2020年计算机高级职称,2020年计算机软考高级哪个好考
- 【Turtle系列】史上最强推理动漫角色代码强势上线——柯南控坐不住了~(附代码)
- 南邮java实验一报告_南京邮电大学双语web实验一报告2017.docx
- android沉浸式布局详解
- 用Windows电脑看epub小说,阅读器软件怎么选
- Lucene--TokenStream(TokenFilter、Tokenizer)
- ubuntu18.04 搭建LDAP服务器
- commander使用技巧
- P5043 【模板】树同构([BJOI2015]树的同构 // P4323 [JSOI2016]独特的树叶
- IPSEC建立过程(简)
- ❤️六万字《Spring框架从入门到精通》(建议收藏)❤️