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 控制反转)相关推荐

  1. IoC(Inversion of Control,控制反转)模式

    IoC模式 1.依赖依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它. ...

  2. 为什么要使用Spring,为什么要使用控制反转(IOC)和依赖注入(DI),为什么要使用AOP

    为什么要使用Spring,为什么要使用控制反转(IOC)和依赖注入(DI),为什么要使用AOP Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod ...

  3. Spring.NET学习笔记1——控制反转(基础篇) Level 200

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  4. Spring的依赖注入和控制反转很难理解?一文搞定

    [用了这么久的Spring,一直没有理解好Spring的依赖注入和控制反转,以前看视频也没有老师讲清楚这个问题,今天终于刷到一个老师把这个问题讲清楚了,跪服大佬~~~] 孙哥说Spring5 全部更新 ...

  5. 大学生 从0开始学Spring第2篇:控制反转(IoC)与依赖注入【从0到精通】

    控制反转(IoC)与依赖注 **引出spring** 依赖关系 spring 容器 IOC:控制反转 DI:依赖注入 总结 Spring中有3个核心的概念: 控制反转(Ioc). 依赖注入(DI). ...

  6. Spring的依赖注入和控制反转

    轻松了解Spring中的控制反转和依赖注入(一) - 请叫我红领巾! - 博客园 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量 ...

  7. springboot的IOC依赖注入与控制反转-举例(转载+自己整理)

    这个记录是对[1]的整理和简化,便于日后遗忘时迅速恢复记忆. Spring框架有四大原则: ①使用POJO进行轻量级与最小侵入式开发 ②通过依赖注入和基于接口编程实现松耦合 ③通过AOP和默认习惯进行 ...

  8. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  9. 浅谈spring之IoC控制反转

    以下学习资料来源于b站动力节点 spring: 出现是在2002左右,解决企业开发的难度.减轻对项目模块之间的管理,类和类之间的管理, 帮助开发人员创建对象,管理对象之间的关系.spring核心技术 ...

最新文章

  1. 聊聊高并发(十六)实现一个简单的可重入锁
  2. 解决掉这些痛点和难点,让知识图谱不再是“噱头”
  3. Groovy的春天从Java7诞生那日开始
  4. Java编程在线学习靠谱吗?能学会吗?
  5. SAP CRM WebClient UI directly navigate to given UI via url
  6. 【Shell教程】二----Shell变量,通配符,转义符
  7. jQuery UI 应用不同Theme的办法
  8. Eclipse设置Android Logcat输出字体大小
  9. (转载)经典SQL语句大全3-技巧篇
  10. 将Nginx加入service服务中
  11. cordova打开外部链接_企业网盘的分享链接功能 这种的你一定没见过
  12. 微信小程序云开发教程-云函数入门(2)-接收参数、前端调用
  13. 保姆级讲解Transformer
  14. ObjectAnimator旋转动画
  15. ng-template、ng-content、ng-container
  16. 最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略
  17. PB级企业电商离线数仓项目实战
  18. CentOS7.9下安装Oracle19c
  19. 挑战程序设计(算法和数据结构)—九宫格
  20. Android中怎么重新启动APP或系统

热门文章

  1. 计算机二级办公室应用题目,计算机二级考试办公室软件高级应用试题
  2. 如何选择适合你的兴趣爱好(十六),健身房
  3. 计算机专业有什么劣势,各个专业有什么“优劣势”呢?
  4. 创见内存卡修复工具带数据恢复RecoveRx Tool v2.0
  5. 2017-3-11 Kafka的应用场景
  6. 新概念英语1-4册全套flash+美音听力mp3+全套笔记+电子书
  7. 远程打码平台是如何进行验证码的识别的?
  8. 如何关闭台式计算机休眠,win7台式机怎样关闭电脑休眠模式
  9. 搜狗高速浏览器4.2正式版发布
  10. 文章采集站-网站批量管理关键词采集文章