初学Spring IOC总结,按照狂神视频
1.什么是Spring
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的框架(容器)
学习Spring主要学习 IOC 与 AOP
2.什么是IOC
官话:IOC 是一种设计思想,DI(依赖注入)是实现IOC的一种方法(谁听得懂)
在不使用IOC之前
1、UserDao接口
public interface UserDao {
public void getUser();
}
2、再去写Dao的实现类
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}
3、然后去写UserService的接口
public interface UserService {
public void getUser();
}
4、最后写Service的实现类
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
5、测试一下
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
这是我们原来的方式 , 开始大家也都是这么去写的对吧 . 那我们现在修改一下 。
把UserDao的实现类增加一个
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql获取用户数据");
}
}
紧接着我们要去使用MySql的话 , 我们就需要去service实现类里面修改对应的实现
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
在假设, 我们再增加一个UserDao的实现类 .
public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Oracle获取用户数据");
}
}
使用IOC之后
1、编写一个Hello实体类
public class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Hello,"+ name );
}
}
2、编写我们的spring文件 , 这里我们命名为beans.xml(idea可以自动生成模板)
<?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.xsd">
<!--
使用spring创建对象,在spring中这些称为bean
类型变量名 = new类型();
HeLLo hello = new HeLLo();
id =变量名
class = new的对象;
property相当于给对象中的属性设置一个值!
-->
<bean id="hello" class="com.kuang.pojo.Hello">
<!--
ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型!
-->
<property name="str" value="Spring"/>
</bean>
</beans>
3、我们可以去进行测试了 .
import com.kuang.pojo.Hello;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
/**
* context:获取spring上下文对象
* 解析beans.xml文件 , 生成管理相应的Bean对象
* 我们的对象现在都在Spring中的管理J,我们要使用. 直接去里面取出来就可以!
*/
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
}
总结:不难看出,对比两种方式,在使用IOC的时候,对象的创建不再是在java类中创建
- Hello 对象是谁创建的 ? hello 对象是由Spring创建的
- Hello 对象的属性是怎么设置的 ? hello 对象的属性是由Spring容器设置的
这个过程就叫控制反转 :
控制反转是一种通过描述(XML或注解)并通过第三方去获取特定对象的方式
在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection,DI
- 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
- 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
依赖注入(DI) : 就是利用set方法来进行注入的.
IOC是一种编程思想,由主动的编程变成被动的接收