1.Spring有什么作用?
Spring就是用来封装对象的。
2.原理是什么?
Spring自己写了一个工厂类,用来读取核心配置文件,通过id或者是name属性,反射出配置文件中的各种已经被用户配置好的对象。
3.核心功能是什么?
反转控制(inverse of control)、面向切面编程(aspect oriented programming)。
(1)反转控制是什么意思?
指的是将原来程序中用户自己创建对象翻转到了IOC容器中。说白了也就是原来用户在写代码创建对象的时候需要自己来new,现在呢,Spring自己有一个容器叫IOC,它就是用来创建对象的,可以对bean进行实例化,使用对象的时候就从IOC里面取。IOC反转控制,也就是说,将对象的创建权反转到了Spring容器里面。
(2)DI(依赖注入)是什么意思?
Spring在创建一个类的实例时,如果这个类的里面依赖其他类型的引用,那么会自动将其引用的类型的类先实例化再注入到该实例里面。
举个例子:
<bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="service.impl.UserServiceImpl">
<property name="userDao" ref="userdao"></property>
</bean>
name=“userDao”指的是在id=“userDao”的这个对象里有一个叫userDao 的属性,并且还有set方法。
ref=“userdao”指的是在Spring容器中,有一个id或者name叫userdao的bean。
4.一个关于IOC和DI的小demo
(1)建立项目,然后导包。
使用Spring框架最起码需要6个包,有4个基本包(core、experssion、bean、context)和2个日志包。
(2)建立Spring核心配置文件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">
</beans>
记得把约束加上。
(3)建立dao接口和dao实现类:
package dao.impl;
import dao.UserDao;
public class UserDaoImpl implements UserDao{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("DI,依赖注入");
}
}
(4)建立service接口和servive实现类
package service.impl;
import dao.UserDao;
import service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void sayHello() {
userDao.sayHello();
}
}
(5)配置applicationContext.xml
<!--IOC容器和DI注入 无参构造-->
<bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
这样项目就完成了,我们来测试一下
(6)Testdemo类
package demo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
public class DemoIOC {
@Test
public void sayHello(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService bean = (UserService)context.getBean("userService");
bean.sayHello();
}
}
(7)运行结果
5.总结:DI和IOC区别:
ioc:控制反转,将对象的创建权反转到ioc容器。
DI:依赖注入,将对象所依赖的对象注入到对象的属性中。 就是IOC的具体实现方法。
1、IOC是一个容器。
2、IOC容器中包括spring管理的所有bean。
3、IOC容器负责对bean进行实例化。
4、IOC容器对bean进行实例化时候,检查有哪些依赖的属性,将依赖的属性注入到实例化的bean的属性中。
要实现依赖注入,需要spring管理依赖方和被依赖方(spring要对依赖方和被依赖方实例化)。