Spring IOC&DI
Posted haibinggan-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring IOC&DI相关的知识,希望对你有一定的参考价值。
传统实例化对象存在的为题:传统开发可以使用new对父接口进行实例化,这样就造成了代码的极大耦合性,为了解决这种耦合性,可以引入工厂设计模式,来负责创建子类对象,这样,工厂类帮助开发者隐藏了所有实现子类,但是静态工厂类不能为所有的接口服务,而且每增加一个子类就要修改工厂类,这样太麻烦,可以采用反射机制的动态工厂类来解决,但是动态工厂类还是需要知道对象的类型才可以,而且需要考虑到多线程的问题。
对于以上开发存在的问题,Spring采用IOC&DI来实现
Spring开发需要引入下列依赖包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
IOC指的是控制反转,将对象的管理交给Spring进行管理:
在src/main/resources/spring目录下创建Bean配置文件spring-base.xml,并且打开命名空间,里面定义所有的Bean,交由Spring管理:<bean id="messageImpl(别名)" class="cn.lt.service.MessageImpl(子类)"/>
对<bean>元素的解释:1、每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一,一般以对象类首字母小写来定义;
2、用来表示类的全名,通常为package.classname;
在Spring中所有的容器都由ApplicationContext接口来描述(子类ClassPathXmlApplicationContext是spring读取xml最常用的类。而我们一般操作的是她的接口ApplicationContext。),
ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-base.xml") ;
//Spring加载源文件夹目录下的.xml文件
Message msg = context.getBean("messageImpl",IMessage.class) ;
//通过getBean("id",接口.class)方法从ApplicationContext容器中获取装配好的Bean实例以供使用。
Spring测试:
DI指的是依赖注入,依赖是一种关系,在A类中创建B的实例,我们叫做A依赖于B;将B对象作为A的构造器参数进行传入,在调用类A之前已经将B类实例化好了,这种方式叫依赖注入
需要引入的依赖库:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.7.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>9.0.8</version>
</dependency>
引入测试依赖库后,就不需要使用ApplicationContext中的getBean()方法来获得bean对象了,而是使用ContextConfiguration(locations = {"classpath:spring/spring-base.xml"})来加载配置文件并装载实例。并且使用@Resource注解进行接口对象注入,替代了getBean()方法;
【问题】ClassPathXmlApplicationContext("spring/spring-base.xml") 最后是被什么替代的
【备注】耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
ApplicationContext是BeanFactory的子类,与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配
ApplicationContext有四个常用子类:1.ClassPathXmlApplicationContext(从类路径ClassPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)、2.FileSystemXmlApplicationContext(从指定的文件系统路径中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)、3.XmlWebApplicationContext(从Web应用中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作)。
以上是关于Spring IOC&DI的主要内容,如果未能解决你的问题,请参考以下文章