IOC:Inversion of Control,翻译过来是反转控制。
翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。
比较抽象,对吧那就看看下面的小例子。
一个小例子,来体会IOC的基础思想。
package com.gothic.sunset.dao;public interface UserDao {void getUser();
}
实现类1:
package com.gothic.sunset.dao;public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取数据信息");}
}
实现类2:
package com.gothic.sunset.dao;public class UserDaoMysqlImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取Mysql数据信息");}
}
实现类3:
package com.gothic.sunset.dao;public class UserDaoOracleImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取Oracle数据信息");}
}
package com.gothic.sunset.service;public interface UserService {void getUser();
}
package com.gothic.sunset.service;import com.gothic.sunset.dao.UserDao;
import com.gothic.sunset.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}
import com.gothic.sunset.service.UserService;
import com.gothic.sunset.service.UserServiceImpl;public class MyTest {public static void main(String[] args) {UserService userService1 = new UserServiceImpl();userService1.getUser();}
}
运行输出后,发现只能根据上面service层实现类中固定的dao实现类对象来输出。
如果现在我需要里面的实现类对象为实现类2的对象,那么我就需要去修改service层中的实现类,然后如果代码比较多的话,改动会非常大,牵一发而动全身。那么如何解决这一问题呢?
其实可以在service层,通过set注入dao实现类对象来进行,修改如下:
package com.gothic.sunset.service;import com.gothic.sunset.dao.UserDao;
import com.gothic.sunset.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao ;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}
import com.gothic.sunset.dao.UserDaoImpl;
import com.gothic.sunset.dao.UserDaoMysqlImpl;
import com.gothic.sunset.service.UserService;
import com.gothic.sunset.service.UserServiceImpl;public class MyTest {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();userService.setUserDao(new UserDaoMysqlImpl());//通过set注入将程序主动权释放userService.getUser();}
}
Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。
Spring 提供了 IOC 容器的两种实现方式:
创建一个maven项目,file–>new–>project,然后一直next到finish即可。
导入依赖后记得更新依赖。
org.springframework spring-context 5.3.1 junit junit 4.12 test
第一个例子,当然是helloworld啦!!
package com.gothic.sunset.demo;public class HelloWorld {public void sayHello(){System.out.println("HelloWorld!");}
}
在resources目录下,右键选择new–>xml configuration file–>spring config,然后命名为applicationContext.xml.
在applicationContext.xml中,我们需要配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理。
通过bean标签配置IOC容器所管理的bean属性:
@Testpublic void testHello(){// 通过ClassPathXmlApplicationContext读取spring配置文件来获取IOC容器ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorld helloWorld = (HelloWorld)ioc.getBean("HelloWorld");helloWorld.sayHello();}
今天,spring的IOC回顾就到此结束啦!!!!其中的例子只是最简单的例子,后续文章再详细展开。