Spring IOC(Inversion Of Controll 控制反转)
IOC是什么?
对象之间的依赖关系由容器来建立。
DI(Dependency Injection 依赖注入)是什么?
容器通过调用对象提供的set方法或者构造器来建立依赖关系。
注:IOC是目标,DI是手段。
set方式注入
step1.提供相应的set方法。
step2.配置元素。
构造器方式注入
step1.添加相应的构造器。
public A(B b){System.out.println("A(B)");this.b = b;}
step2.配置constructor-arg元素。
自动装配(了解)
指的是spring容器依据某种规则,自动建立对象之间的依赖关系。
注意:
a、默认情况下,容器不会自动装配。
b、可以通过指定autowire属性来告诉容器进行自动装配(容器仍然需要通过调用set方法或构造器来完成依赖关系的建立)。
<bean id="wt" class="ioc2.Waiter"/>
<bean id="wt1" class="ioc2.Waiter"/>
<!-- autowire属性:表示让容器自动装配,该属性有如下三个值:byName:容器依据属性名查找对应的bean然后调用对应的set方法来完成注入。注:a.如果找不到对应的bean注入null。b.不可能找到多个符合条件的bean。byType:容器依据属性类型查找对应的bean,然后调用对应的set方法来完成注入。注:a.如果找不到对应的bean注入null。b.有可能找到多个符合条件的bean,此时会出错。constructor:容器依据属性类型查找对应的bean,然后调用对应的构造器来完成注入。-->
<bean id="rest" class="ioc2.Restaurant" autowire="byType"/>
注入基本类型的值
使用value属性即可。
注入集合类型的值(List Set Map Properties)
引用的方式注入集合类型的值
<%@taglib uri=”http//xxxxxx” prefix=”c”%>
uri–>命名空间 namespace
c–>命名空间的别名
<bean id="vb1" class="value.ValueBean"><property name="name" value="胡八一"/><property name="age" value="30"/><property name="city"><list><value>北京</value><value>上海</value><value>杭州</value></list></property><property name="interest"><set><value>钓鱼</value><value>看书</value><value>听音乐</value></set></property><property name="score"><map><entry key="english" value="90"/><entry key="math" value="95"/></map></property><property name="db"><props><prop key="username">Tiger</prop><prop key="password">123456</prop></props></property>
</bean><!-- 将集合类型的值配置成一个bean -->
<util:list id="cityBean"><value>上海</value><value>杭州</value><value>北京</value>
</util:list>
<util:set id="interestBean"><value>书法</value><value>绘画</value><value>写作</value>
</util:set>
<util:map id="scoreBean"><entry key="english" value="90"/><entry key="math" value="96"/>
</util:map>
<util:properties id="dbBean"><prop key="username">Sally</prop><prop key="password">123456</prop>
</util:properties>
<!-- 引用的方式注入集合类型的值 -->
<bean id="vb2" class="value.ValueBean"><property name="city" ref="cityBean"/><property name="interest" ref="interestBean"/><property name="score" ref="scoreBean"/><property name="db" ref="dbBean"></property>
</bean><!-- 读取properties文件的内容classpath:按照类路径来搜素。spring容器会依据路径找到对应的配置文件,然后读取该文件的内容到properties对象。-->
<util:properties id="config" location="classpath:config.properties"/>
读取properties文件的内容
<!-- 读取properties文件的内容classpath:按照类路径来搜素。spring容器会依据路径找到对应的配置文件,然后读取该文件的内容到properties对象。
--><util:properties id="config" location="classpath:config.properties"/>
使用spring表达式
可以使用spring表达式读取其他bean的属性,它的语法类似于el表达式。
<bean id="sp1" class="value.SpelBean"><property name="name" value="#{vb1.name}"/><property name="city" value="#{vb1.city[1]}"></property><!-- #{vb1.score['英语']} --><property name="score" value="#{vb1.score.english}"></property><property name="pageSize" value="#{config.pagesize}"/></bean><bean id="vb1" class="value.ValueBean">
使用注解简化配置
什么是组件扫描?
spring容器启动之后会扫描指定的包及其子包下面的所有类,如果该类前面有特定的注解(比如@Component),则spring容器会将其纳入容器进行管理。(相当于这儿配置了一个bean元素)。
如何进行组件扫描?
step1.在类前添加特定的注解。
注:除了@Component注解,还有@Service,@Repository,@Controller,作用是等价的,只不过有语义上的差异。
step2.在配置文件当中,添加组件扫描的配置。
<!-- 配置组件扫描 -->
<!-- base-package属性:指定要扫描的包名,spring容器会扫描该包及其子包下面的所有类,如果该类前面有特定的注解(比如@Component),则spring容器会将其纳入容器进行管理。(相当于这儿配置了一个bean元素)。-->
<context:component-scan base-package="annotation"></context:component-scan>
其他相关注解
@Scope("singleton")//指定作用域
@Lazy(true)//指定延时加载
public class SomeBean
{public SomeBean(){System.out.println("SomeBean()");}@PostConstruct//指定初始化方法public void init(){System.out.println("init()");}@PreDestroy//指定销毁方法public void destroy(){System.out.println("destroy()");}
}
依赖注入相关的注解
@Autowired和Qualifier
a.该注解支持set方式注入和构造器方式的注入。
b.当使用set方式注入时,可以将@Autowired添加到set方法前面,如果不使用@Qualifier,则容器会使用byType的方式来注入,有可能出错,所以建议使用@Qualifier注解,明确指出要注入的bean的id。
注:也可以将这两个注解直接添加到属性前。
@Autowired
public void setWt(@Qualifier("wt") Waiter wt)
{System.out.println("setWt()");this.wt = wt;
}
c.当采用构造器注入时,可以将注解添加到对应的构造器前面即可。
@Autowired
public School(@Qualifier("wt")Waiter wt)
{System.out.println("School(wt)");this.wt = wt;
}
@Resource注解
a.只支持set方式的注入。
b.可以将该注解添加到属性前,使用name属性指定要注入的bean的id(如果不指定,会按照byType的方式注入)。
注:也可以将注解添加到属性前。
@Value注解
a.可以使用该注解来注入基本类型的值。
b.也可以使用该注解来使用spring表达式。
c.该注解可以添加到属性前,或者添加到对应的set方法前。
@Value("#{config.pagesize}")
private String pageSize;
@Value("花千骨")
private String name;
Spring IOC(Inversion Of Controll 控制反转)相关推荐
- IoC(Inversion of Control,控制反转)模式
IoC模式 1.依赖依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它. ...
- 为什么要使用Spring,为什么要使用控制反转(IOC)和依赖注入(DI),为什么要使用AOP
为什么要使用Spring,为什么要使用控制反转(IOC)和依赖注入(DI),为什么要使用AOP Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod ...
- Spring.NET学习笔记1——控制反转(基础篇) Level 200
在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...
- Spring的依赖注入和控制反转很难理解?一文搞定
[用了这么久的Spring,一直没有理解好Spring的依赖注入和控制反转,以前看视频也没有老师讲清楚这个问题,今天终于刷到一个老师把这个问题讲清楚了,跪服大佬~~~] 孙哥说Spring5 全部更新 ...
- 大学生 从0开始学Spring第2篇:控制反转(IoC)与依赖注入【从0到精通】
控制反转(IoC)与依赖注 **引出spring** 依赖关系 spring 容器 IOC:控制反转 DI:依赖注入 总结 Spring中有3个核心的概念: 控制反转(Ioc). 依赖注入(DI). ...
- Spring的依赖注入和控制反转
轻松了解Spring中的控制反转和依赖注入(一) - 请叫我红领巾! - 博客园 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量 ...
- springboot的IOC依赖注入与控制反转-举例(转载+自己整理)
这个记录是对[1]的整理和简化,便于日后遗忘时迅速恢复记忆. Spring框架有四大原则: ①使用POJO进行轻量级与最小侵入式开发 ②通过依赖注入和基于接口编程实现松耦合 ③通过AOP和默认习惯进行 ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- 浅谈spring之IoC控制反转
以下学习资料来源于b站动力节点 spring: 出现是在2002左右,解决企业开发的难度.减轻对项目模块之间的管理,类和类之间的管理, 帮助开发人员创建对象,管理对象之间的关系.spring核心技术 ...
最新文章
- 聊聊高并发(十六)实现一个简单的可重入锁
- 解决掉这些痛点和难点,让知识图谱不再是“噱头”
- Groovy的春天从Java7诞生那日开始
- Java编程在线学习靠谱吗?能学会吗?
- SAP CRM WebClient UI directly navigate to given UI via url
- 【Shell教程】二----Shell变量,通配符,转义符
- jQuery UI 应用不同Theme的办法
- Eclipse设置Android Logcat输出字体大小
- (转载)经典SQL语句大全3-技巧篇
- 将Nginx加入service服务中
- cordova打开外部链接_企业网盘的分享链接功能 这种的你一定没见过
- 微信小程序云开发教程-云函数入门(2)-接收参数、前端调用
- 保姆级讲解Transformer
- ObjectAnimator旋转动画
- ng-template、ng-content、ng-container
- 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略
- PB级企业电商离线数仓项目实战
- CentOS7.9下安装Oracle19c
- 挑战程序设计(算法和数据结构)—九宫格
- Android中怎么重新启动APP或系统
热门文章
- 计算机二级办公室应用题目,计算机二级考试办公室软件高级应用试题
- 如何选择适合你的兴趣爱好(十六),健身房
- 计算机专业有什么劣势,各个专业有什么“优劣势”呢?
- 创见内存卡修复工具带数据恢复RecoveRx Tool v2.0
- 2017-3-11 Kafka的应用场景
- 新概念英语1-4册全套flash+美音听力mp3+全套笔记+电子书
- 远程打码平台是如何进行验证码的识别的?
- 如何关闭台式计算机休眠,win7台式机怎样关闭电脑休眠模式
- 搜狗高速浏览器4.2正式版发布
- 文章采集站-网站批量管理关键词采集文章