| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> SSM整合之spring笔记(IOC 获取bean的三种方式)(P063—P069) -> 正文阅读 |
|
[Java知识库]SSM整合之spring笔记(IOC 获取bean的三种方式)(P063—P069) |
以下笔记是结合面试题来写的笔记?一? ?Spring简介1 .Spring概述
官网地址:
https://spring.io/
? Spring
是最受欢迎的企业级
Java
应用程序开发框架,数以百万的来自世界各地的开发人员使用
Spring
框架来创建性能好、易于测试、可重用的代码。
Spring
框架是一个开源的
Java
平台,它最初是由
Rod Johnson
编写的,并且于
2003
年
6
月首
次在
Apache 2.0
许可下发布。
Spring
是轻量级的框架,其基础版本只有
2 MB
左右的大小。
Spring
框架的核心特性是可以用于开发任何
Java
应用程序,但是在
Java EE
平台上构建
web
应
用程序是需要扩展的。
Spring
框架的目标是使
J2EE
开发变得更容易使用,通过启用基于
POJO
编程模型来促进良好的编程实践。
面试题:
2 .谈谈你对
Spring
的理解?
3 .
谈谈你对Spring的理解
2 .Spring家族
项目列表:
https://spring.io/projects
3 .Spring Framework
Spring
基础框架,可以视为
Spring
基础设施,基本上任何其他
Spring
项目都是以
Spring Framework 为基础的
? 3.1?Spring Framework特性
非侵入式:使用
Spring Framework
开发应用程序时,
Spring
对应用程序本身的结构影响非常
小。对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会
破坏原有结构,反而能将组件结构进一步简化。这就使得基于
Spring Framework
开发应用程序
时结构清晰、简洁优雅。
控制反转:
IOC——Inversion of Control
,翻转资源获取方向。把自己创建资源、向环境索取资源
变成环境将资源准备好,我们享受资源注入。
面向切面编程:
AOP——Aspect Oriented Programming
,在不修改源代码的基础上增强代码功
能。
容器:
Spring IOC
是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化
的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发
效率。
组件化:
Spring
实现了使用简单的组件配置组合成一个复杂的应用。在
Spring
中可以使用
XML
和
Java
注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭
建超大型复杂应用系统。
声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。
一站式:在
IOC
和
AOP
的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且
Spring
旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在
Spring Framework
的基
础上全部使用
Spring
来实现。
3.2?Spring Framework五大功能模块面试题:
二? .IOC1 .IOC容器?1.1?IOC思想??IOC:Inversion of Control,翻译过来是反转控制。 之前我们需要用到某个资源 某个对象? 需要我们手动去创建他? 手动的去访问他? 有了spring之后? 可以把对象的管理权 ,对象的控制权? 完全交给IOC容器? ?原来是主动获取? 现在是被动去接受? ?spring为我们提供的对象? 总结一句话:原来我们要自己创建 现在不用自己? 用spring里面的就可以
①获取资源的传统方式
自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程
中的全部细节且熟练掌握。
在应用程序中的组件需要获取资源时,传统的方式是组件
主动
的从容器中获取所需要的资源,在这样的
模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效
率。
②反转控制方式获取资源
点外卖:下单、等、吃,省时省力,不必关心资源创建过程的所有细节。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向
——
改由容器主
动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源
的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的
被动
形式。
③
DI
DI
:
Dependency Injection
,翻译过来是
依赖注入
。
DI
是
IOC
的另一种表述方式:即组件以一些预先定义好的方式(例如:
setter
方法)接受来自于容器
的资源注入。相对于
IOC
而言,这种表述更直接。
所以结论是:
IOC
就是一种反转控制的思想, 而
DI
是对
IOC
的一种具体实现。
解释:例如以三层架构为例子
controller:控制层 帮助我们处理请求和响应
service:??
dao:
controller? 访问 service, service访问? dao? 换句话说controller就要获取service对象? 之前我们用传统方式的话? 我们需要用到service, 就要自己new一个service对象? 而我们现在有了反转控制(DI),不用在自己new一个service对象,我们可以提前以设置好的方式,然后被动的接受,然后利用spring注入
总结一句话:我们在传统方式在自己new 而现在我们有了spring之后? ?我们需要用到哪个对象? 这个对象就由IOC容器为我们提供? 具体的一个实现就用到我们DI的依赖注入
依赖注入解释:
我们当前用到哪个对象,spring就为哪个对象进行赋值
我们为成员变量赋值的方式有二种:set? 构造器??
面试题:
1 .IOC
是什么?
1.2、? ?IOC容器在Spring中的实现
Spring
的
IOC
容器就是
IOC
思想的一个落地的产品实现。
IOC
容器中管理的组件也叫做
bean
。在创建
bean
之前,首先需要创建
IOC
容器。
Spring
提供了
IOC
容器的两种实现方式:
①
BeanFactory
这是
IOC
容器的基本实现,是
Spring
内部使用的接口。面向
Spring
本身,不提供给开发人员使用。
②
ApplicationContext
BeanFactory
的子接口,提供了更多高级特性。面向
Spring
的使用者,几乎所有场合都使用
ApplicationContext
而不是底层的
BeanFactory
。
③
ApplicationContext
的主要实现类
?双击shift 查找IOC的具体实现 BeanFactory就是IOC容器最根本的实现 ctrl+H? 查看子接口或类的继承关系 提问:1.如何把对象交给IOC容器管理 2.如何获取ioc容器 3.如何从ioc容器中获得我们当前所管理的对象 ?2、基于XML管理bean?入门准备工作? ??com.atguigu.spring spring管理对象, 管理的对象我们叫做组件? 也叫做been 所以spring管理对象也可以叫做spring管理been
2.1
、实验一:入门案例
①创建spring_helloworld
②引入依赖
<packaging>jar</packaging> <dependencies> <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> ③创建类HelloWorld 对象从类来的
?现在要把HelloWorld这个类交给spring 如何交给spring 做法:? ④创建Spring的配置文件
现在的名字可以随便写 到ssm后 名字不能随便写 因为ssm创建的是一个web工程,spring不用我们自己来获取,而是由程序自动来获取的。以后的名字大部分是写applicationContext.xml
现在我们可以通过指定某个xml来获取ioc容器,所以当前名字可以随便取? ?为了规范? 现在的名字也是用applicationContext.xml
⑤在Spring的配置文件中配置bean
⑥创建测试类测试
⑦思路
⑧注意
Spring
底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。如果在需要
无参构造器时,没有无参构造器,则会抛出下面的异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'helloworld' defined in class path resource [applicationContext.xml]: Instantiation of bean
failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed
to instantiate [com.atguigu.spring.bean.HelloWorld]: No default constructor found; nested
exception is java.lang.NoSuchMethodException: com.atguigu.spring.bean.HelloWorld.<init>
()
2.2、ioc容器创建对象的方式
com.atguigu.spring
①创建spring_ioc_xml ②引入依赖 <packaging>jar</packaging> <dependencies> <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- 数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> </dependencies> ③创建学生类Student? ? ??package com.atguigu.spring.pojo
④创建spring配置文件spring-ioc.xml? ?这个名字可以随便起? 具体原因见上面解释
⑤测试IOCByXMLTest
如果把无参构造删掉 那么spring无法帮我们把对象创建出来?
因为无参构造是固定的,写法是固定的,有参构造要设置各自成员变量,然后为成员变量进行赋值,所以有参构造可以设置多种方式,可以设置多个重载的方法,里面可以有sid,或者说只有sname或是有sid和sname,所以它并不知道我们的有参构造是什么,但是他知道我们无参构造的样子,我们以后主要有反射 通过反射创建实例化对象用的都是无参构造 总上所述 如果这时我们把无参构造删除后 会出现如下问题:
?总结:以后在写一个类的时候 一定要加上无参构造(宁可没有有参也要有无参,当前如果没有设置有参时 无参是默认的 总之一句话? 写一个类? 一定要写上无参构造) 2.3、实验二:获取bean的三种方式和注意事项
①方式一:根据
id
获取
由于
id
属性指定了
bean
的唯一标识,所以根据
bean
标签的
id
属性可以精确获取到一个组件对象。
上个实验中我们使用的就是这种方式。
②方式二:根据类型获取
注意事项: 1 .如果有二个bean 如图 不知道要获取哪一个就会报错? 如下
?报错如下:
总结:注意:根据类型获取bean时,要求IOC容器中有且只有一个类型匹配的bean 2 .如果一个bean都没有
报错:
③方式三:根据
id
和类型
④注意
当根据类型获取
bean
时,要求
IOC
容器中指定类型的
bean
有且只能有一个
当
IOC
容器中一共配置了两个:
根据类型获取时会抛出异常:
⑤扩展
如果组件类实现了接口,根据接口类型可以获取
bean
吗?
组件类:当前交给ioc管理所管理的类? ?每一个bean 就是一个组件? 就是ioc所管理的对象
可以,前提是
bean
唯一
验证:
创建一个接口Person
让Student实现当前接口
?而我们这题的意思是如下:
如果一个接口有多个实现类,这些实现类都配置了
bean
,根据接口类型可以获取
bean
吗?
不行,因为
bean
不唯一
⑥结论
根据类型来获取
bean
时,在满足
bean
唯一性的前提下,其实只是看:『对象
instanceof
指定的类
型』的返回结果,只要返回的是
true
就可以认定为和类型匹配,能够获取到。
总结:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 4:24:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |