【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进行比较就先讲解到这里了,我们下面的内容会更加精彩哦!请继续关注!!






猜你喜欢

转载自blog.csdn.net/tengliu6/article/details/80612693