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{
@Override
public void getUser() {
System.out.println("获取数据信息");
}
}
实现类2:
package com.gothic.sunset.dao;
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取Mysql数据信息");
}
}
实现类3:
package com.gothic.sunset.dao;
public class UserDaoOracleImpl implements UserDao{
@Override
public 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();
@Override
public 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;
}
@Override
public 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即可。
导入依赖后记得更新依赖。
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.1version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
第一个例子,当然是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属性:
<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">
<bean id="HelloWorld" class="com.gothic.sunset.demo.HelloWorld">bean>
beans>
@Test
public void testHello(){
// 通过ClassPathXmlApplicationContext读取spring配置文件来获取IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld helloWorld = (HelloWorld)ioc.getBean("HelloWorld");
helloWorld.sayHello();
}
今天,spring的IOC回顾就到此结束啦!!!!其中的例子只是最简单的例子,后续文章再详细展开。