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; } @Override public 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/beans https://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>
-
在配置文件加载的时候,容器中管理的对象就已经初始化了