管制反转IOC(Inversion of Control)

代码构造

// mapperpublic interface UserDao {    String getUser();}//mapper实现 张三public class UserDaoImpl implements UserDao {    @Override    public String getUser() {        return "张三 22岁";    }}//mapper实现 李四public class UserDao2Impl implements UserDao {    @Override    public String getUser() {        return "李四 22岁";    }}//servicepublic interface UserService {    String getUser();}

一般对象注入(service的实现)

//实现public class UserServiceImpl implements UserService {    private UserDao userDao = new UserDaoImpl();    @Override    public String getUser() {        return userDao.getUser();    }}//调用public class UserTest {    public static void main(String[] args) {        UserService userService = new UserServiceImpl();        System.out.println(userService.getUser());    }}

引入 UserDaoImpl 让其获取张三信息

看上述代码 此时咱们的测试类获取的是张三的信息。如果须要获取李四的信息须要 批改引入的对象为private UserDao userDao = new UserDao2Impl();

此时对象的创立势力在程序员的手中。如果用户的要求有扭转须要批改源代码。

set形式对象注入

//实现public class UserServiceImpl implements UserService {    private UserDao userDao;    public void setUserDao(UserDao userDao){        this.userDao = userDao;    }    @Override    public String getUser() {        return userDao.getUser();    }}//调用public class UserTest {    public static void main(String[] args) {        UserService userService = new UserServiceImpl();        ((UserServiceImpl) userService).setUserDao(new UserDao2Impl());        System.out.println(userService.getUser());    }}

通过set让用户本人抉择须要创立的对象类型,将创建对象的势力交给用户本人,不须要批改源代码。

此时程序自身由被动的创建对象到被动的接管对象。零碎的耦合性升高了,能够更加关怀业务的实现。

所以说IOC其实只是一种思维,这就是所谓的管制反转。

Spring治理

service实现类:

public class UserServiceImpl implements UserService {    private UserDao userDao;    public void setUserDao(UserDao userDao){        this.userDao = userDao;    }    private UserDao userDao1;    public void setUserDao1(UserDao userDao1){        this.userDao1 = userDao1;    }    @Override    public String getUser() {        return userDao.getUser();    }    @Override    public String getUser1() {        return userDao1.getUser();    }}

名为beans.xml的文件,放于资源文件resources下边:

<?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"><!-- id指的是标识单个bean的字符串     class指的是bean对象的门路-->    <bean id="userDaoZs" class="com.spring.daoimpl.UserDaoImpl">    </bean>    <bean id="userDaoLs" class="com.spring.daoimpl.UserDao2Impl">    </bean>    <!-- 控制器调用setAxe办法,将容器中的axe bean作为传入的参数 --><!--    value: 根本数据类型        ref: spring曾经创立的对象        上述两个指bean配置文件中的bean名称        name是决定UserService类中的那个参数(此时传递是userDao,如果是userDao1)-->    <bean id="userService" class="com.spring.serviceimpl.UserServiceImpl">        <property name="userDao1" ref="userDaoZs"></property>        <property name="userDao" ref="userDaoLs"></property>    </bean></beans>

调用类:

public class Test {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        UserService userService = (UserService) context.getBean("userService");        System.out.println(userService.getUser());//李四        System.out.println(userService.getUser1());//张三    }}

此时对象的创立,治理,拆卸全副交给了Spring去治理。如果用户有须要能够通过更该配置文件的形式去批改而不须要去批改源代码。