【Spring】——IOC原理(二)
小编最近在学习Spring的内容,以小编的能力就是能理解什么程度,就先给朋友们展示到什么程度了,还请小伙伴们努力留下自己的宝贵建议和我一起探讨咯!
【IOC】
控制反转(Inverse of Control),java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。
IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。
【IOC好处】
【IOC与DI】
一、 IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系
举个例子:你找男友要有各种要求:有钱,智商A+,180mm,善言谈等条件
(1)传统的程序开发:我们要自己想办法自己设计和面对每个追帅哥的环节,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个),使用完之后还要将对象销毁,对象始终会和其他的接口或类耦合起来。
(2)IOC开发:通过婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,合适就想出,不合适就抛出异常,婚介类似一个容器机构来控制。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
二、DI(Dependency Injection,依赖注入)
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI来实现的。比如对象A需要操作数据库,在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。
那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
【代码实现】
1、传统方式:
UserDao.java
package com.spring.tl.Dao;
/**
* Created by 滕柳 on 2018/6/4.
*/
public interface UserDao {
public void addUser(String username,String password);
}
UserDaoMysql.java
package com.spring.tl.Dao;
/**
* Created by 滕柳 on 2018/6/4.
*/
public class UserDaoMysql implements UserDao {
@Override
public void addUser(String username, String password) {
System.out.println("UserDaoMysql");
}
}
UserManager.java
public interface UserManager {
public void addUser(String userName,String password);
}
UserManagerImp.java
public class UserManagerImp implements UserManager {
@Override
public void addUser(String userName, String password) {
//由我们的应用程序负责服务(对象)定位
UserDao userDao=new UserDaoMysql();
userDao.addUser(userName,password);
}
}
client.java
/**
* Created by 滕柳 on 2018/6/4.
*/
public class Client {
public static void main(String[] args) {
UserManager userManager=new UserManagerImp();
userManager.addUser("tl","123");
}
}
2、IOC:将对象注入到IOC容器中
(1)通过构造方法实现的注入,有侵入性,不建议使用
UserManagerImp.java
/**
* Created by 滕柳 on 2018/6/4.
*/
public class UserManagerImp implements UserManager {
private UserDao userDao;
//通过构造方法实现的注入,有侵入性,不建议使用
public UserManagerImp(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String userName, String password) {
//由我们的应用程序负责服务(对象)定位
// UserDao userDao=new UserDaoMysql();
userDao.addUser(userName,password);
}
}
Application.xml
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans" 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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userDaoMySql" class="com.spring.tl.Dao.UserDaoMysql"/>
<bean id="userManager" class="com.spring.tl.manager.UserManagerImp">
<constructor-arg ref="userDaoMySql"></constructor-arg> <--配置构造器-->
</bean>
</beans>
client.java
(2) 通过setter注入---必须要有无参数的构造器(可以不写,如果写一定要有无参数的构造器)
UserManagerImp.java
Application.xml
【总结】
今天小编主要是对传统和用Spring IOC进行比较就先讲解到这里了,我们下面的内容会更加精彩哦!请继续关注!!
推荐阅读
-
详解JSP 中Spring工作原理及其作用
-
操作系统原理之内存管理(第四章第二部分)
-
spring集成mybatis原理(spring和mybatis整合步骤)
-
struts2、hibernate、spring的工作原理[简明易懂]
-
php入门学习知识点二 PHP简单的分页过程与原理
-
Spring源码剖析2:Spring IOC容器的加载过程
-
Spring源码剖析1:初探Spring IOC核心流程
-
Spring源码剖析7:AOP实现原理详解
-
利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下
-
Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析