Spring(三)SpringIOC

来源:互联网 发布:健美创研化妆品知乎 编辑:程序博客网 时间:2024/06/05 11:45

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实现类中的一段文字。

这里写图片描述

原创粉丝点击