什么是spring
spring是一个以ioc和aop为内核的框架。
ioc(inversion of control ,控制反转)是spring的基础。
ioc简单说就是创建对象由以前的程序员调用new 构造方法,变成了交由spring创建对象。
di(dependency inject,依赖注入)与ioc的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。
简单地说, di就是对象的属性,已经被注入好相关值了,直接使用即可。
ioc-控制反转
把各个对象类封装之后,通过ioc容器来关联这些对象类。这样对象与对象之间就通过ioc容器进行联系,而对象与对象之间没有什么直接联系。
应用程序在没有引入ioc容器之前,对象a依赖对象b,那么a对象在实例化或者运行到某一点的时候,自己必须主动创建对象b或者使用已经创建好的对象b,其中不管是创建还是使用已创建的对象b,控制权都在应用程序自身。
如果应用程序引入了ioc容器之后,对象a和对象b之间失去了直接联系,所以,当对象a实例化和运行时,如果需要对象b的话,ioc容器会主动创建一个对象b注入(即依赖注入)到对象a所需要的地方。由此,对象a获得依赖对象b的过程,由主动行为变成了被动行为,即把创建对象交给了ioc容器处理,控制权颠倒过来了,这就是所谓的控制反转。
di-依赖注入
由ioc容器在运行期间,动态地将某种依赖关系注入到对象之中。例如,将对象b注入(赋值)给对象a的成员变量。
事实上,依赖注入(di)和控制反转(ioc)是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,即应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,即容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可能是外部文件对象等。
ioc与di的实现
(1)属性setter方法注入:指ioc容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化bean后,调用该bean的setter方法,即可实现基于setter方法的依赖注入。该方式简单、直观,而且容易理解,所以spring的设置注入被大量使用。
package com.ssm.entry;public class userserviceimpl implements userservice { private userdao userdao; // setter()实现依赖注入 public void setuserdao(userdao userdao){ this.userdao = userdao; } public void login() { this.userdao.login(); system.out.println("userservice login"); }}
(2)构造方法注入:指ioc容器使用构造方法注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。
applicationcontext.xml
<?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/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- 将指定类配置给spring,让spring创建其对象的实例 控制反转 --> <bean id="userdao" class="com.ssm.entry.userdaoimpl"></bean> <!-- 添加一个id为userservice的bean 依赖注入--> <bean id="userservice" class="com.ssm.entry.userserviceimpl"> <!-- 将name为userdao的bean注入userservice实例中 --> <property name="userdao" ref="userdao"/> </bean></beans>
ioc测试
package com.ssm.entry;import org.springframework.context.applicationcontext;import org.springframework.context.support.classpathxmlapplicationcontext;public class ioc { public static void main(string[] args) { applicationcontext applicationcontext = new classpathxmlapplicationcontext("applicationcontext.xml"); userdao userdao = (userdao)applicationcontext.getbean("userdao"); userdao.login(); }}
di测试
package com.ssm.entry;import org.springframework.context.applicationcontext;import org.springframework.context.support.classpathxmlapplicationcontext;public class di { public static void main(string[] args) { applicationcontext applicationcontext = new classpathxmlapplicationcontext("applicationcontext.xml"); userservice userservice = (userservice)applicationcontext.getbean("userservice"); userservice.login(); } }
推荐教程:《java教程》
以上就是spring ioc和di详解的详细内容。