Spring IoC(控制反转)之IoC的使用

IoC是Inversion of Control的缩写,被称为控制反转。

IoC是Spring框架中其他功能的基础。因此,理解并能够熟练使用IoC是进一步学习Spring框架的必要前提。


例:

public class A{
	private B b;
	public void setB(B b){
		this.b=b;
	}
}
public class B{
	private C c;
	public void setC(C c){
		this.c=c;
	}
}
public class C{

}

上述代码中共有三个类,分别是A、B、C类。

其中A类的实例总是依赖一个B类的实例,而B类的实例总是依赖一个C类的实例。

因此要正常使用A类的实例,总需要如下所示的创建装配的过程:

C c = new C();
B b = new B();
b.setC(c);
A a = new A();
a.setB(b);

在实际应用中,类似这样的代码随处可见,A越是复杂,则对其装配的过程将越复杂。


为了能够更为直观地理解IoC,通过使用dbcp连接池的例子进行说明。

首先通过非IoC的方式装配使用BasicDataSource对象:

1、在工程中导入dbcp包

commons-dbcp.jar

commons-pool-1.3.jar

2、导入MySql驱动包

3、创建TestDbcp类,测试连接池

package test;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;

public class TestDbcp {

	public static void main(String[] args) {
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/mldn");
		dataSource.setUsername("root");
		dataSource.setPassword("password");
		dataSource.setMaxActive(10);
		dataSource.setInitialSize(2);
		Connection con = null;
		for(int i=0;i<15;i++){
			try {
				con=dataSource.getConnection();
				System.out.println("connection "+i+" : "+con.hashCode());
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();

		}
	}
	}
}

运行结果:

connection 0 : 14518194
connection 1 : 33018164
connection 2 : 32425490
connection 3 : 10430987
connection 4 : 9516880
connection 5 : 2765838
connection 6 : 10481519
connection 7 : 19883652
connection 8 : 27547574
connection 9 : 11403277

由于最大连接数为10,所以在没有释放当前连接前,将最多获得10个连接,不能再获得新的连接,当前线程将进入等待状态。

上述代码中,关键的对象是BasicDataSource,而要正确使用该对象,需要使用大量的setXXX方法,对其依赖的属性进行赋值。


IoC就是要将上述代码中生成BasicDataSource对象的过程交给容器实现,而不在代码中实现。

也就是说,以前是在代码中控制对象的生成和注入,而是用IoC后,就将设计好的类交给IoC容器,让IoC容器控制对象的生成和属性的注入,称为控制反转。

生成对象的过程,就是将对象依赖的属性进行注入的过程,因此IoC也被称为DI(Dependency Injection),即依赖注入。


IoC的使用


通过修改连接池的实例,使用IoC来装配BasicDataSource对象。

要使用IoC装配对象,就必须在Spring的配置文件(默认为applicationContext.xml)中进行配置。

配置信息如下:

<?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-2.5.xsd">
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/mldn</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>password</value>
		</property>
		<property name="maxActive">
			<value>10</value>
		</property>
		<property name="initialSize">
			<value>2</value>
		</property>
	</bean>
</beans>

<property>元素为bean装配属性,其中name是bean的类中setXXX方法的名字,如<property name="username">将调用setUsername()方法,

并将<value>的值root作为参数传递给setUsername方法对属性赋值。


在applicationContext.xml中配置了bean后,通过如下代码使用bean:

package test;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Testspr {

	public static void main(String args[]){
		
		ApplicationContext ctxt = new ClassPathXmlApplicationContext("applicationContext.xml");
		BasicDataSource dataSource =(BasicDataSource)ctxt.getBean("dataSource");
		Connection con =null;
		for(int i=0;i<15;i++){
			try {
				con=dataSource.getConnection();
				System.out.println("connection "+i+" : "+con.hashCode());
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}

}
运行结果:

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
connection 0 : 10969598
connection 1 : 17984263
connection 2 : 26440236
connection 3 : 4098499
connection 4 : 8106640
connection 5 : 29131495
connection 6 : 14440411
connection 7 : 31401995
connection 8 : 20634710
connection 9 : 7579563

上述代码中首先创建了ClassPathXmlApplicationContext对象,该对象依据配置文件applicationContext.xml获得IoC容器的信息。

然后使用ClassPathXmlApplicationContext中的getBean方法获得id为dataSource的bean对象。

接下来就可以通过获得的bean对象来获得连接,使用数据库连接池。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值