1. IOC理论推导
- 本质:控制反转是一种设计思想,DI(依赖注入)是实现IOC的一种方式。没有IOC的程序中,我们使用面向对象编程,对象的创建与对象之间的依赖关系完全硬编码在程序中,对象的创建有程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了
- IOC是Spring框架的核心内容,使用多种方式来实现IOC,可以使用XML配置,可以使用注解,最新版的Spring也可以零配置实现IOC
- Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入
例如
private UserDao userDao = new UserDaoImpl();
改为
private UserDao userDao;//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {this.userDao = userDao;
}
2. HelloSpring
-
编写实体类Hello
public class Hello {private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return "Hello{" +"str='" + str + '\'' +'}';} } -
编写配置文件(beans.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--使用Spring来创建对象,在Spring这些都称为Bean--><bean id="hello" class="com.lrm.pojo.Hello"><!--ref:引用Spring容器中创建好的对象 value:具体的值,基本数据类型--><property name="str" value="Spring"/></bean> </beans> -
编写测试类
public static void main(String[] args) {/*获取Spring的上下文对象*/ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");/*我们的对象现在都在Spring中的管理了,我们要使用直接去里面取出来就可以*/Hello hello = (Hello) context.getBean("hello");System.out.println(hello.toString()); }
通过修改xml文件中的配置,即可动态改变所要调用的方法,代码无需进行改变
3. IOC创建对象的方式
-
使用无参构造创建对象(默认)
-
使用有参构造创建对象
-
下标赋值
<bean id="user" class="com.lrm.pojo.User"><!--有参构造,下标赋值--><constructor-arg index="0" value="Java"/> </bean> -
使用参数类型赋值(不建议使用)
<bean id="user" class="com.lrm.pojo.User"> <!--使用参数类型(不建议使用)--><constructor-arg type="java.lang.String" value="Java"/> </bean> -
通过参数名来赋值
<bean id="user" class="com.lrm.pojo.User"> <!--直接通过参数名来设置--><constructor-arg name="name" value="Java"/> </bean>
-
在配置文件加载的时候,容器中管理的对象就已经初始化了