SpringIOC讲解
IOC(Inversion of Control)即控制器反转,主要有以下两部分:
(1)控制:是javaBean与javaBean之间的关系不需要开发人员维护,而交给spring容器维护。关系包括引用关系继承关系,javaBean是类,接口不是javaBean。
(2)反转:用户在创建和使用对象时不需要自己创建和使用对象,而是由spring帮助我们创建对象,用户直接拿来使用spring创建好的对象。
在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
IoC容器负责容纳此前所描述的bean,并对bean进行管理。org.springframework.beans.factory.BeanFactory 是Spring IoC容器的实际代表者,在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。Spring为我们提供了许多易用的BeanFactory实现, XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象 以及对象间的依赖关系。XmlBeanFactory类将获取此XML配 置元数据,并用它来构建一个完全可配置的系统或应用。容器是xml文件,通过读取xml中的Bean来实现类的初始化,需要有读取javaBean的接口或者对象如:BeanFactory接口主要用来实例化容器中的javaBean。
反转的演示
1.src下新建配置文件application.xml,也可以在WEB-INF中创建,该配置文件用来描述、管理、实例化javaBean。在配置文件对实体类(javaBean)描述中的property标签于类中的set方法的功能相同,一般情况下bean中属性的值是从页面获取的,不需要在文件中配置。
<?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">
//class属性:javabean的全名,id:bean的标识,每个bean通过它来区别
// scope属性:如何来实例化对象的默认是单例,还有prototype:原型模式
<bean id="dept" class="com.spring.entity.Dept" scope="Singleton" >
<property name="id" value="1"></property>
<property name="dname" value="鸡蛋"></property>
</bean>
</beans>
2.在控制器里面使用实体类。创建一个Test方法,运用Junit进行测试,得到要使用的bean首先要拿到配置文件,其次通过id拿到bean,此时就可以在不new对象的情况下使用该bean了。
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.entity.Dept;
public class OneController {
@Test
public void Test(){
//获得容器
BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml");
//根据id获得对应的Bean
Dept dept=(Dept)beanFactory.getBean("dept");
System.out.println(dept.getId()+dept.getDname());
}
}
控制的演示
1.dao层中创建一个接口,包含一个返回值为void的方法。
package com.spring.dao;
public interface DeptDao {
void findDept();
}
2.创建实现dao接口的类,重写其方法,方法中输出一段文字即可。
package com.spring.dao;
public class DeptDaoImp implements DeptDao{
@Override
public void findDept() {
System.out.println("testIoc");
}
}
3.Service层,创建一个接口包含一个返回值为void的方法。
package com.spring.service;
public interface DeptService {
void findDept();
}
4.创建一个service接口的类,类中包含一个dao接口类型的属性,实现接口的方法,该方法的内容是调用dao层的方法。
package com.spring.service;
import com.spring.dao.DeptDao;
public class DeptServiceImp implements DeptService{
private DeptDao deptDao;
public void setDeptDao(DeptDao deptDao) {
this.deptDao = deptDao;
}
@Override
public void findDept() {
deptDao.findDept();
}
}
5.控制器层,创建一个类,类中包含一个Service接口类型的成员变量,创建一个返回值为空的方法,在方法中调用接口的方法,创建main函数,其中包括获取控制层的bean和调用该bean的方法。
package com.spring.controller;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.DeptService;
public class OneController {
private DeptService deptService;
public void findDept(){
deptService.findDept();
}
public void setDeptService(DeptService deptService) {
this.deptService = deptService;
}
public static void main(String[] args) {
BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml");
//根据id获得对应的Bean
OneController oneController=(OneController)beanFactory.getBean("oneController");
oneController.findDept();
}
}
6.目前所做的步骤中,在service层中引用了dao层,控制器中引用了service层,同时也用到其中的方法。以往的方法需要将这些引用的对象通过new出来才能用,这些接口的实例化都需要自己做得。而spring完成时只需要添加一个接口类型的属性,并书写其set方法,再将每一层的接口的实现类配到容器中,这样使得层与层之间的耦合度降低。在容器中配置。
<bean id="deptDao" class="com.spring.dao.DeptDaoImp"></bean>
//ref的值是该类中引用到的bean在配置文件中的id值
<bean id="deptService" class="com.spring.service.DeptServiceImp">
<property name="deptDao" ref="deptDao"></property>
</bean>
<bean id="oneController" class="com.spring.controller.OneController">
<property name="deptService" ref="deptService"></property>
</bean>
7.Web.xml将application.xml配置到其中
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
8.运行main方法,可以看到控制台中输出了dao实现类中的一段文字。