1.SpringIOC概念


图中两个代码代表了两种不同的创建对象的方式
第一种创建对象的方式,我们采用的是new的方式,在采用new的方式创建对象的时候

我们在找对象的时候,是主动的在找,应用app是直接的跟资源联系,他们之间是有必然的联系,是消除不掉的,资源独立就变得很难
采用第二种方式创建对象的时候,就是如下图

app断开了和资源的联系,找工厂要一个资源,由工厂负责给我们的资源取得联系,把想要的资源返回给我们的应用中,从而实现应用和资源之间的依赖关系。这是IOC。
为什么叫控制反转。
把创建对象的权力交给我们的工厂,由工厂通过固定的名称给我们找到我们想要的对象。
第一种方式,它有独立的控制权,想要谁就创建谁,而第二种方法把控制权交给了工厂,带来的好处是降低程序间的依赖关系,削减计算机的耦合。
控制反转:Inversion of Control.IOC,把创建对象的权力交给框架,是框架的重要特征,它包括依赖注入和依赖查找

明确IOC的作用:削减计算机程序的耦合,解除我们代码中的依赖关系。
它不能实现数据库增删改查,也不能实现表现层的请求参数封装,也无法接收请求,能干的事情就是解决程序间的依赖关系。

2.spring基于XML的IOC环境搭建和入门


第一个aop包,基于注解的ioc开发的必备jar包。
而jcl是把apache的日志组件继承到其开发包中,做成了自己的jar包
而beans,core,spEl,context就是spring核心容器所需的jar包。
它就是一个map,封装我们的对象。
1.新建bean.xml文件,并导入xml约束(在index.html或官网中中搜索xmlns)

<?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">
</beans>

2.把对象的创建交给spring来管理
把对象的创建交给spring来管理,beans里面多个bean,id表示唯一标志,class表示全限定类名

<!--把对象的创建交给spring来管理,beans里面多个bean,id表示唯一标志,class表示全限定类名-->
<bean id="accountService" class="com.yujie.service.Impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="com.yujie.dao.Impl.AccountDaoImpl"></bean>

3.把创建好的容器给取出来,就可以根据唯一标志来获取对象
Spring中工厂的类结构图

获取spring的IOC核心容器,并根据ID获取对象,有两种方式获取对象
第一种,拿到object类型,强转
第二种,传给字节码,用字节码转

/*
*   获取spring的IOC核心容器,并根据ID获取对象
* */
public static void main(String[] args) {//1.获取核心容器对象ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");//2.根据id获取bean对象IAccountService as=(IAccountService)ac.getBean("accountService");       //第一种,拿到object类型,强转IAccountDao adao=ac.getBean("accountDao", IAccountDao.class);           //第二种,传给字节码,用字节码转System.out.println(as);System.out.println(adao);
}

3. applicationContext的实现类

三个常用实现类
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext

ClassPathXmlApplicationContext第一个它可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话,加载不了
FileSystemXmlApplicationContext它可以加载磁盘任意路径下的配置文件(必须有访问权限:不同操作系统不同)
AnnotationConfigApplicationContext读取注解创建容器,是明天的内容
用第二个,它会报错,我们把bean.xml扔到桌面上,并拷贝路径,粘贴进去,其他不作任何调整

4. BeanFactory和ApplicationContext的区别

核心容器的两个接口引发出的问题
ApplicationContext:
它在构件核心容器时,创建对象采取的思想策略是:
采用立即加载的方式,也就是说,只要一读取完配置文件,就创建配置文件中配置的对象
当我们走完那个代码的时候,它会马上读取配置文件,并且在配置的过程中使用反射的方式来把这两个对象都创建出来。
即读取完配置文件,对象就创建起来了,并且全部创建出来。

BeanFactory
它在构建核心容器时,创建对象采取的策略是延迟加载的方式,也就是说,什么时候根据id获取对象了,什么时候就真正的创建对象。

/*BeanFactory*/
Resource resource=new ClassPathResource("bean.xml");
BeanFactory factory=new XmlBeanFactory(resource);
IAccountService as=(IAccountService)factory.getBean("accountService");
System.out.println(as);

通过上述代码加debug即可测试,断点到了第三步的时候,还未执行创建对象。
实际开发中根据不同的情况选择不同的方法。
什么时候适合于延迟加载,什么时候适合立即加载
由于不会有类成员,因此不会有线程安全问题,我们可以使用单例模式来创建我们service和dao,进一步如果service和dao都是单例的话,任何时候都只会创建一次,因此,只要容器创建,我们就需要马上创建对象,因为它只创建一次。因此只要容器一创建,我们马上就创建对象,因为它只会创建一次,创建完就不会再创建。
单例模式适用于本次案例。
beanFactory什么时候用什么时候创建,适用于多例对象,如果我在加载容器就要创建对象,那么我第二次用又要创建对象。
Spring会根据配置不同改变其策略。实际开发中更多的使用ApplicationContext来创建对象.它很智能,可以根据对象的单例还是多例来决定立即加载还是延迟加载

Spring框架----Spring的IOC相关推荐

  1. Spring框架的灵魂IOC和AOP

    2019独角兽企业重金招聘Python工程师标准>>> 关键词 名称 模式 实现方式 IOC 依赖注入或控制反转 工厂模式 sessionfactory注入 AOP 面向切面编程 代 ...

  2. 请解释下Spring 框架中的IOC 容器?

    Spring 中的org.springframework.beans 包和org.springframework.context 包构成了Spring 框架IOC 容器的基础. BeanFactory ...

  3. @select注解_SSM框架(十三):Spring框架中的IoC(3)新注解,完全摆脱xml文件

    spring中的新注解 1.Configuration 作用:指定当前类是一个配置类 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以 ...

  4. @kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1)

    控制反转 IOC: 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Depende ...

  5. Spring框架----Spring框架的基本概念

    1.spring 是什么 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IOC(Inverse Of Control: 控制反转)和 AOP(Aspect ...

  6. Spring 框架——spring入门教程

    打个广告,帮朋友卖点东西,东西超便宜的哟[衣服鞋子等],厂家直接出货,绝对低于市场价!!! 一般都比市场价便宜3-7折[都是牌子货],如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!! 微信 一. ...

  7. java集成hibernate_JavaWeb_(Spring框架)Spring整合Hibernate

    Dao层类要继承HibernateDaoSupport.java父类 原先使用Hibernate框架hibernate.cfg.xml配置数据库 com.mysql.jdbc.Driver jdbc: ...

  8. Spring框架----Spring的环绕通知

    问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了 /*环绕通知 * 问题:当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了 * */ public void arou ...

  9. Spring框架----Spring的bean注解

    这里能看出什么?红线两行表明了它可以通过调用构造函数来进行实例化,因为这都是newInstance,上面可以加参数,下面这个没有任何参数. 对比图一上面一行,他们的作用是不是是一样的,上面图的有一个全 ...

最新文章

  1. The MIT License (MIT)
  2. 猎豹MFC--TH_双管道--对管道的操作就想对文件的操作一样
  3. 计算机英语 动态,计算机英语高级词汇精选
  4. linux下FTP服务搭建(1)
  5. android意图实验报告,Activity 常见的意图整理
  6. android 获取uri的正确文件路径的办法
  7. 该来的还是要来,数据挖掘
  8. win10:为U盘设计图标
  9. 2022保研夏令营/预推免记录:浙大计院直博/西湖电子直博/南大软院/厦大信院
  10. 软件测试工程师的职业技能分析
  11. 拨号时显示无法连接服务器失败,拨号网络常见的错误提示解释及解决方法大全...
  12. npm ERR! nested aliases not supported 报错原因
  13. C# 中的委托和事件[转自张子扬]
  14. 分布式技术原理与实战45讲--05 第05讲:共识问题:区块链如何确认记账权?
  15. 徐锋-用例和面向方面软件开发-UMLChina讲座-音频和幻灯
  16. 终于有人把股市集合竞价的秘密说清楚了
  17. 双向链表 建立和插入
  18. 算法第四版学习(chapter1.3)
  19. windows 下编译 DSview 记录
  20. 原生JS实现瀑布流效果

热门文章

  1. iQOO手机正式发布,全新性能旗舰打造爆燃体验
  2. 终于!华为Mate 9已获安卓9.0正式版更新
  3. Java对象的四种引用
  4. python格式化输入_python-格式化(%,format,f-string)输出+输入
  5. ftp加速传输java_Java FTPClient 大量数据传输的问题(未解决)
  6. 嵌入式Linux入门13:应用层调试
  7. 《转》Unsafe与CAS
  8. html按钮的下拉菜单,按钮下拉菜单
  9. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解
  10. 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能