什么是Spring IOC容器?
IOC容器,全称(Inversion of Control),即控制反转,是Spring框架的核心功能之一,它把传统上由程序代码直接操控的对象调用权交给了容器,通过容器来实现对象组件的装配和管理,利用了java反射机制。
Spring IOC负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期,所以IOC就像一个存放对象的容器。
通俗理解,就是使用者只需要把自己需要用到的对象告知Spring,然后直接声明使用,Spring就可以把这些所需的对象创建准备好,要用的时候直接就可以拿来用了,这样就不需要在程序中创建对象,消除了硬编码,降低了类之间的依赖关系。
好处:在实际的项目开发中,往往需要通过类与类之间的相互协作来完成特定的业务逻辑,这个时候,没个类都要管理与自己有交互的类的引用和依赖,这样就使得代码的维护异常困难并且耦合度过高,而IOC的出现就是为了解决这个问题,IOC将类与类的依赖关系写在配置文件中,程序在运行时根据配置文件动态加载依赖的类,降低了类与类之间的耦合度。
Spring IOC实现方式:
1. 依赖查找(DL):这种方式已经被抛弃了,因为它需要用户自己去使用API进行查找资源和组装对象。有侵入性。
2. 依赖注入(DI):Set注入、构造器注入、注解注入
Spring的IOC支持以下功能:
1. 依赖注入
2. 依赖检查
3. 自动装配
4. 支持集合
5. 指定初始化方法和销毁方法
6. 支持回调某些方法(需要实现Spring接口,略有侵入)
举例说明:
调用用户User对象,首先来创建一个User对象实体类
public class user{
private String name;
private Integer age;
//构造器
public user(){}
public user(String name, Integer age){
super();
this.name = name;
this.age = age;
}
//set,get方法这就不写了……
}
利用Spring来创建这个类的对象
<?xml version=“1.0” encoding=“UTF-8“?>
<beans xmlns=“http://www.springfrmework.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.xsd”>
<!—-创建user对象—->
<bean id=“u1” class=“com.xxx.user”>
<!—- set注入 —->
<!—— DI 依赖注入在创建这个对象的时候调用这个对象的属性完成赋值—->
<property name=“name” value=“Zhangsan”/>
<property name=“age” value=“18”/>
<!—-构造器注入 —->
<constructor-arg name=“name” value=“Zhangsan”/>
<constructor-age name=“age” value=“18”/>
</bean>
</beans>
调用user对象类
public class test{
public static void main(String[] arg){
ApplicationContext context = new ClassPathXmlAppliactionContext(“applicationContext.xml”);
user userObj = (user) context.getBean(“u1”);
System.out.println(userObj);
}
}
以上两种讲的是set注入和构造器注入,接下来讲解下注解注入方式;
配置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” xmlns:context=“http://www.springframework.org/schema/context” xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd”>
<!—- 开启自动扫描xxx.ioc包下的所有类的注解—->
<context:component-scan base-package=“Xxx.ioc”></context:component-scan>
</beans>
注解注入类
package xxx.ioc;
public interface userDao{
public void get();
}
package xxx.ioc;
import org.springfremawork.stereotype.Component;
@Component(“userDao”)//相当于<bean id=“userDao” class=“Xxx.ioc.userDaoImpl”/>
public class userDaoImpl implements userDao{
@Value(“张三”)
private String name;
public void get(){
System.out.println(“参数是:” + name);
}
}