网易首页 > 网易号 > 正文 申请入驻

大佬把Spring框架总结的「无比详细」,不信你学不会!

0
分享至

后台回复“大礼包”有惊喜礼包!

日英文

Smile, Because you’re beautiful; stand strong, Because haters can't bring you down.

微笑吧,因为你笑起来很美丽;保持坚强吧,因为这样谁都不可以打倒你。

每日掏心话

人,总是会经历一些事情,如爱情,如友情。没有人是能够永远的快乐幸福的过每一天,没有人能够坦然的面对自己的坚强和软弱。

责编:乐乐 | 来自:itcats_cn 链接:blog.csdn.net/itcats_cn/article/details/81479185

往日回顾:

正文

1、IOC和DI IOC: 控制反转

即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建(spring)

DI: Dependency Injection 依赖注入

spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件.

实现IOC思想需要DI做支持

注入方式:

  1. set方式注入

  2. 构造方法注入

  3. 字段注入

注入类型:

  1. 值类型注入

  2. 引用类型注入

好处:

1.降低组件之间的耦合度,实现软件各层之间的解耦. 2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播 3.容器提供单例模式支持,开发人员不需要自己编写实现代码. 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供众多的辅佐类,使这些类可以加快应用的开发.如jdbcTemplate HibernateTemplate
2.applicationContext & BeanFactory区别 BeanFactory接口

(1) spring的原始接口,针对原始接口的实现类功能较为单一

(2)BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

ApplicationContext接口

(1)每次容器启动时就会创建容器中配置的所有对象

(2)提供了更多功能

(3)从类路径下加载配置文件: ClassPathXmlApplicationContext
从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication

3.spring配置详解 3.1、元素属性

  • bean元素:使用该元素描述需要spring容器管理对象

  • name属性:给被管理的对象起个名字,获得对象时getBean("name值")

  • class属性:被管理对象的完整类名

  • id属性:与name属性一模一样,名称不可重复,不能使用特殊字符

name和id之间的一些注意点:

1、配置两个相同的 id 或者 name 都不能通过。

2、如果既配置了 id ,也配置了 name ,则两个都生效。如果id和name都没有指定,则用类全名作为name,如,则你可以通过getBean("com.stamen.BeanLifeCycleImpl")返回该实例。

3、如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 相同的时候, 则两个冲突,配置文件生效。

如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 不相同的时候, 则两个不冲突,都能够生效。

扩展:SpringBoot内容聚合

3.2、bean元素进阶( scope属性 生命周期属性)—————单例多例 (1)scope属性

(1)singleton(默认值)

单例对象:被标识为单例的对象在spring容器中只会存在一个实例

(2)prototype

多例原型:被标识为多例的对象,每次在获得才会被创建,每次创建都是新的对象

(3)request

Web环境下,对象与request生命周期一致

(4)session

Web环境下,对象与session生命周期一致

总结:绝大多数情况下,使用单例singleton(默认值),但是在与struts整合时候,务必要用prototype多例,因为struts2在每次请求都会创建一个新的Action,若为单例,在多请求情况下,每个请求找找spring拿的都是同一个action。

(2)生命周期属性(了解)———初始化和销毁

(1)配置一个方法作为生命周期初始化方法,spring会在对象创建之后立刻调用 init-method

(2)配置一个方法作为生命周期的销毁方法,spring容器在关闭并销毁所有容器中的对象之前调用destory-method
对应注解为@PostConstruct

对应注解为@PreDestory

(3)模块化配置,即分模块配置(导入其他spring配置文件)

3.3、spring三种对象的创建方式 (1)空参数构造(重要) (2)静态工厂创建(调用静态方法创建)

调用UserFactory类的静态createUser方法创建名为user的对象,放入容器

"user" factory-method="createUser">
(3)实例工厂创建(调用非静态方法创建)——需要配置两个bean,因为无法通过类名调用非静态方法

"user2" factory-bean="userFactory" factory-method="createUser">
3.4、spring注入方式 (1)set方式注入(重点)————值类型用value注入 引用类型用ref注入(2)构造方法注入

函数注入

(3)p名称空间注入———实际上set注入,spring特有,为了简化写法

1、applicationContext.xml中标签头部导入p命名空间

xmlns:p="http://www.springframework.org/schema/p"

2、书写格式:值类型注入—— p:属性名="值" 引用类型注入—— p:属性名-ref="引用的name属性"

把Run类中的name属性值设置为haha,age属性设置为20,引用属性hello引用

"run2" p:name="haha" p:age="20" p:hello-ref="hello">
(4)spel注入: spring Expression Language spring表达式语言

SpEL特性:(1)、使用Bean的ID来引用Bean;(2)、调用方法和访问对象的属性;(3)、对值进行算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作

关于spel https://www.cnblogs.com/goodcheap/p/6490896.html

复杂类型注入

1、需要导入包spring-web

2、在web.xml中配置监听器

注意:假如不写括号内的值(即name或id),默认使用类名首字母小写作为搜索,为什么意思呢?

比如Student类中使用了@Component 没有书写括号和值,那么默认搜索id或name为student。

声明Student类对象为多例

下面是对singleton和prototype的一些补充

singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。 prototype作用域:prototype作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。对于具有prototype作用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源。简单的说: singleton 只有一个实例,也即是单例模式。 prototype访问一次创建一个实例,相当于new。
4.值类型的注入

实际通过反射field赋值

实际通过set方式赋值

面试题: @AutoWired和@Resource的区别?

@AutoWired默认以类型进行查找,@Resource默认以名称进行查找

@AutoWired(required=false) + @Qualifier("user") == @Resource(name="user")

其中@Resource注解是jdk1.6后才有的

虽然现在都用Maven项目构建,但是不能忘记,使用aop需要用到的包:spring-aop + spring-aspects + springsource.org.aopalliance + springsource.org.aspectj.weaver

关于AOP看一个小例子:

1、准备目标对象(被代理对象,被通知的对象,被增强的类对象)

2、准备通知(被增强方法的代码,想要实现功能的方法代码)

3、配置 applicationContext.xml

  1. 导入aop(约束)命名空间

  2. 配置目标对象

  3. 配置通知对象

  4. 配置将通知织入目标对象

4、测试

1、applicationContext.xml中配置目标对象,通知对象,开启使用注解完成织入

2、@Aspect注解代表该类是个通知类,书写切点表达式@Pointcut("execution(返回值 全类名.方法名(参数))")

注意环绕通知需要这么写:

public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//环绕方法执行前
//proceedingJoinPoint.proceed();表示对拦截的方法进行放行
//若注释proceedingJoinPoint.proceed()则不会执行被AOP匹配的方法
proceedingJoinPoint.proceed();
//环绕方法执行后

AOP注解解析:

@Before 前置通知(Before advice) :在某连接点(JoinPoint)——核心代码(类或者方法)之前执行的通知,但这个通知不能阻止连接点前的执行。为啥不能阻止线程进入核心代码呢?因为@Before注解的方法入参不能传ProceedingJoinPoint,而只能传入JoinPoint。要知道从aop走到核心代码就是通过调用ProceedingJionPoint的proceed()方法。而JoinPoint没有这个方法。 这里牵扯区别这两个类:Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理链执行的方法。暴露出这个方法,就能支持 aop:around 这种切面(而其他的几种切面只需要用到JoinPoint,这跟切面类型有关), 能决定是否走代理链还是走自己拦截的其他逻辑。建议看一下 JdkDynamicAopProxy的invoke方法,了解一下代理链的执行原理。这样你就能明白 proceed方法的重要性。 @After 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 @AfterReturning 返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。 @Around 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。这时aop的最重要的,最常用的注解。用这个注解的方法入参传的是ProceedingJionPoint pjp,可以决定当前线程能否进入核心方法中——通过调用pjp.proceed(); @AfterThrowing 抛出异常后通知(After throwing advice) :在方法抛出异常退出时执行的通知。
8、spring整合jdbc

spring中提供了一个可以操作数据库的对象,对象封装了jdbc技术 ————JDBCTemplate JDBC模板对象,而JdbcDaoSupport则对JdbcTemplate进行了封装,所以要操作JdbcTemplate,或只需要继承JdbcDaoSupport即可。

依赖关系配置:

测试:

关于事务的隔离级别:https://blog.csdn.net/itcats_cn/article/details/81487466

spring中事务的分类:

spring中事务可以分为编程式事务控制和声明式事务控制。

编程式事务控制 自己手动控制事务,就叫做编程式事务控制。 Jdbc代码: Conn.setAutoCommit(false); // 设置手动控制事务 Hibernate代码: Session.beginTransaction(); // 开启一个事务 【细粒度的事务控制:可以对指定的方法、指定的方法的某几行添加事务控制】 (比较灵活,但开发起来比较繁琐:每次都要开启、提交、回滚.) 声明式事务控制 Spring提供了对事务的管理, 这个就叫声明式事务管理。 Spring提供了对事务控制的实现。用户如果想用Spring的声明式事务管理,只需要在配置文件中配置即可; 不想使用时直接移除配置。这个实现了对事务控制的最大程度的解耦。 Spring声明式事务管理,核心实现就是基于Aop。 【粗粒度的事务控制:只能给整个方法应用事务,不可以对方法的某几行应用事务。】 (因为aop拦截的是方法。) Spring声明式事务管理器类: Jdbc技术:DataSourceTransactionManager Hibernate技术:HibernateTransactionManager

有一点需要注意的:若为编程式事务控制,则开启事务后一定要手动释放(提交或回滚),否则长期占用内存,有可能报事务异常

spring封装了事务管理的代码(打开,提交,回滚事务)

事务操作对象,因为在不同平台,操作事务的代码各不相同.spring提供了一个接口

PlatformTransactionManager 接口

在不同平台,实现不同的接口即可

注意:在spring中玩事务管理.最为核心的对象就是TransactionManager对象

spring管理事务的属性介绍

  • 事务的隔离级别

  • 是否只读

  • 事务的传播行为

配置事务的核心管理器,它封装了所有事务,依赖于连接池(DataSourceTransactionManager)

xml中配置通知

配置将通知织入目标

在需要管理的方法或者类中声明配置事务管理

@Transactional(isolation=Isolation.REPEATABLE_READ,readOnly=false,propagation=Propagation.REQUIRED)

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师,在后台回复“”即可。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。

别找了,想获取史上最简单的Java大厂面试题学习资料

扫下方二维码回复「面试」就好了

嘿,你在看吗

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
1-1!欧洲杯神剧情!FIFA第57惨遭读秒绝平,前中超名帅死里逃生

1-1!欧洲杯神剧情!FIFA第57惨遭读秒绝平,前中超名帅死里逃生

体坛纪录片
2024-06-20 23:00:07
毕业典礼扇老师耳光!身份被扒:家中人脉深厚,黑历史一箩筐

毕业典礼扇老师耳光!身份被扒:家中人脉深厚,黑历史一箩筐

清欢渡语
2024-06-20 21:41:39
呼和浩特一家五口被杀害,仅剩下一个儿媳妇,村干部曝更多细节

呼和浩特一家五口被杀害,仅剩下一个儿媳妇,村干部曝更多细节

180°视角
2024-06-20 15:16:22
中国游客在韩旅行,被240斤的酒店员工强奸,抓捕十小时后被释放

中国游客在韩旅行,被240斤的酒店员工强奸,抓捕十小时后被释放

社会酱
2024-06-20 17:39:36
澳洲网红为了博流量跟狗跨物种交配,在西方引起效仿?

澳洲网红为了博流量跟狗跨物种交配,在西方引起效仿?

我有一盐
2024-06-20 20:44:11
金融圈突发!李一平,被查!

金融圈突发!李一平,被查!

中国基金报
2024-06-20 19:37:35
越扒越深,享受国务院津贴的余琦,到底还有多少个头衔

越扒越深,享受国务院津贴的余琦,到底还有多少个头衔

文雅笔墨
2024-06-20 10:24:07
意大利拒绝欧尔班加入欧洲议员小组!匈牙利何去何从?

意大利拒绝欧尔班加入欧洲议员小组!匈牙利何去何从?

项鹏飞
2024-06-20 19:28:59
玉兰油女神45岁全貌曝光!震撼对比让人惊呆

玉兰油女神45岁全貌曝光!震撼对比让人惊呆

轻嗅蔷薇
2024-06-20 18:50:02
姜萍中专同学被找到,确认其月考数学成绩只有83分,有准考证可以证明

姜萍中专同学被找到,确认其月考数学成绩只有83分,有准考证可以证明

小萝卜丝
2024-06-20 21:06:54
漫天嘘声!欧洲杯又1场丑陋足球:15亿豪阵摆烂,3大巨星低迷

漫天嘘声!欧洲杯又1场丑陋足球:15亿豪阵摆烂,3大巨星低迷

叶青足球世界
2024-06-21 01:53:57
医生反复提醒:过了60岁,宁可在家里坐着不动,别出门做这3件事

医生反复提醒:过了60岁,宁可在家里坐着不动,别出门做这3件事

贾文彬的史书
2024-06-07 22:32:31
中联部部长在海参崴出席“抵制新殖民主义”论坛,让人如鲠在喉

中联部部长在海参崴出席“抵制新殖民主义”论坛,让人如鲠在喉

顾礼先生
2024-06-20 14:53:15
云南保山市长陈锐离世 简历已从政府官网撤下

云南保山市长陈锐离世 简历已从政府官网撤下

红星新闻
2024-06-20 16:11:08
2012年三对高校教师夫妻玩“换妻”游戏,内容不堪入目,结局如何

2012年三对高校教师夫妻玩“换妻”游戏,内容不堪入目,结局如何

阿胡
2024-06-19 14:36:12
她认怂了!内部人士透露其权力之大,一细节致工作能力被怀疑

她认怂了!内部人士透露其权力之大,一细节致工作能力被怀疑

温柔看世界
2024-06-19 23:58:29
复旦打人学生被北大录取?北大回应,成绩曝光第一名,网友热议

复旦打人学生被北大录取?北大回应,成绩曝光第一名,网友热议

180°视角
2024-06-20 22:11:26
曹县翰林府7分29秒视频后续,女销售竟然开直播,网友疯狂围观!

曹县翰林府7分29秒视频后续,女销售竟然开直播,网友疯狂围观!

新动察plus
2024-06-18 10:39:19
谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

谭咏麟病愈后首次公开现身,瘦到青筋毕现感慨声线不好

小萝卜天下事
2023-07-21 21:57:53
两性疑问:为什么男生更喜欢从后面来

两性疑问:为什么男生更喜欢从后面来

坟头长草
2024-05-30 16:33:38
2024-06-21 05:34:44
程序员小乐
程序员小乐
有趣有内涵
3163文章数 9493关注度
往期回顾 全部

健康要闻

晚餐不吃or吃七分饱,哪种更减肥?

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

头条要闻

欧洲杯:凯恩破门 英格兰1-1丹麦

体育要闻

千夫所指的关系户 成了拯救葡萄牙的英雄

娱乐要闻

叶舒华参加柯震东生日聚会,五毒俱全

财经要闻

楼市新“王炸”!释放何信号?

科技要闻

小米SU7流量泼天,富贵却被蔚来接住了

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

房产
艺术
健康
教育
时尚

房产要闻

海棠湾!一所重量级国际学校真的来了!

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

晚餐不吃or吃七分饱,哪种更减肥?

教育要闻

学霸的题目,当然要学霸来做了!学渣挤眉弄眼一个字都没写出来

当男人不耍帅时,就是最帅的时候(穿衣篇)

无障碍浏览 进入关怀版