Spring框架学习(一)

Spring介绍

Spring概念

1、spring是一个松散耦合、优化程序结构的轻量级框架(解耦)。

2、是一个技术平台,可以用于集成其他技术。如SSM(Spring、SpringMVC、MyBatis)SSH(Spring、Struts、Hibernate)

3、适用于任何Java程序,解决企业开发的复杂性,使用基本的Javabean代替EJB并提供更多的企业应用功能。

 

Spring在开发中的位置

Spring贯穿于整个Web应用,从表现层到业务层再到数据层。

 

Spring的组成

 

 



 

 

Spring---->Ioc

Ioc概念

Ioc:Inverse of control,控制反转。

Ioc容器反过来控制应用程序获取外部资源的一种程序实现。

  反过来:当A类需要B类对象时,A类自己采取new关键字获得B类对象时称之为正向。  

  外部资源:不能在A类中定义的资源对A类来说称之为外部资源。

  程序实现:Ioc是一种程序设计思想,Spring是Ioc的一种具体实现方式。

如下代码,B为A的外部资源。

 

class A {
    B b = new B();
}

class B {
}

 

 

 

 

Ioc思想演变

我们在service层的实现类中调用DAO层的实现类,产生了耦合。

GoodServiceImpl:

package cn.sxt.spring.service.impl;

import cn.sxt.spring.vo.Goods;
import cn.sxt.spring.dao.impl.GoodsDAOImpl;
import cn.sxt.spring.service.GoodsService;

public class GoodsServiceImpl implements GoodsService{

    @Override
    public void create(Goods goods) {
        new GoodsDAOImpl().create(goods);
    }
}

 

GoodDAOImpl:

package cn.sxt.spring.dao.impl;

import cn.sxt.spring.vo.Goods;

public class GoodsDAOImpl implements GoodsDAO {
    @Override
    public void create(Goods goods) {
        
    }
}

 

 

为了解决service层和DAO层的耦合我们可以引入Factory

GoodsServiceImp:

package cn.sxt.spring.service.impl;

import cn.sxt.spring.vo.Goods;
import cn.sxt.spring.factory.GoodsDAOFactory;
import cn.sxt.spring.service.GoodsService;

public class GoodsServiceImpl implements GoodsService{
    @Override
    public void create(Goods goods) {
        new GoodsDAOFactory().getGoodsDAO();
    }
}

 

GoodsDAOFactory:

package cn.sxt.spring.factory;

import cn.sxt.spring.dao.impl.GoodsDAO;
import cn.sxt.spring.dao.impl.GoodsDAOImpl;

public class GoodsDAOFactory {
    
    public GoodsDAO getGoodsDAO() {
        return new GoodsDAOImpl();
    }
}

 

GoodsServiceImpl中不再出现GoodsDAOImp类名,两者解耦。

但是在GoodsServiceImp中又出现了GoodsDAOFactory的类名,这两者发生了耦合。

GoodsDAOFactory中还出现了GoodsDAOImpl的类名,这两者也发生耦合。

 

 

引入配置文件,利用反射

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="goodsDAO" class="cn.sxt.spring.dao.impl.GoodsDAOImpl"/>
</beans>

 

configuration:配置文件,保存配置信息,用以封装 <bean id="goodsDAO" class="cn.sxt.spring.dao.impl.GoodsDAOImpl"/>

 

package cn.sxt.spring.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class Configuration {
//存放所有的bean
private Map<String,BeanConfig> beans = new HashMap<String,BeanConfig>(); public Configuration(String fileName) {
      //得到包名 String packageName
= this.getClass().getPackage().getName();
//将‘.’替换为‘/’ packageName
= packageName.replace(".", "/");
//得到文件路径
//得到输入流 InputStream inputStream
= this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); //进行XML解析 parseXml(inputStream); }   

  解析xml
private void parseXml(InputStream inputStream) { SAXBuilder builder = new SAXBuilder(); try { Document document = builder.build(inputStream); Element root = document.getRootElement(); for(Element ele:root.getChildren("bean")) { String id = ele.getAttributeValue("id"); String clzName = ele.getAttributeValue("class"); BeanConfig bc = new BeanConfig(id, clzName); beans.put(id, bc); } } catch (JDOMException | IOException e) { e.printStackTrace(); } }   //获取类名 public String getClzName(String id) { BeanConfig bc = beans.get(id); if(bc==null) { return null; } return bc.getClzName(); }   //用来封装bean private static class BeanConfig { private String id; private String clzName; public BeanConfig(String id, String clzName) { super(); this.id = id; this.clzName = clzName; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClzName() { return clzName; } public void setClzName(String clzName) { this.clzName = clzName; } } }

 

goodsDAOFactory:

package cn.sxt.spring.factory;

import cn.sxt.spring.dao.impl.GoodsDAO;
import cn.sxt.spring.vo.Goods;

public class GoodsDAOFactory {
    
    public static GoodsDAO getGoodsDAO() {
        String fileName = "applicationContext.xml";
        Configuration cf = new Configuration(fileName);
        
        String clzName = cf.getClzName("goodsDAO");
      
try { Class<?> cls = Class.forName(clzName); return (GoodsDAO) cls.newInstance(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 测试 * @param args */ public static void main(String[] args) { GoodsDAO goodsDAO = GoodsDAOFactory.getGoodsDAO(); Goods goods = new Goods(); goodsDAO.create(goods); } }

此时GoodDAOFactory和GoodsServiceImpl不再产生耦合。

但是需要写一定量的代码,而Spring的Ioc很好的帮助我们解决了这个问题。

 

Ioc容器替换了Factory,创建接口类型对象,并返回GoodsDAOImpl。

 

简单的Ioc例子

步骤:1、创建Java项目

  2、引入jar包

  3、编写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-3.0.xsd">
    <bean id="goodsDAO" class="cn.sxt.spring.dao.impl.GoodsDAOImpl1"></bean>
</beans>

 

 

 

   4、编写测试代码

GoodsDAOImpl1:

package cn.sxt.spring.dao.impl;

import cn.sxt.spring.dao.GoodsDAO;
import cn.sxt.spring.vo.GoodsModel;

public class GoodsDAOImpl1 implements GoodsDAO{
    @Override
    public void create(GoodsModel gm) {
        System.out.println("GoodsDAOImpl1");
    }
}

 

GoodsDAOImpl2:

package cn.sxt.spring.dao.impl;

import cn.sxt.spring.dao.GoodsDAO;
import cn.sxt.spring.vo.GoodsModel;

public class GoodsDAOImpl2 implements GoodsDAO{
    @Override
    public void create(GoodsModel gm) {
        System.out.println("GoodsDAOImpl2");
    }
}

 

GoodsDAO:

package cn.sxt.spring.dao;

import cn.sxt.spring.vo.GoodsModel;

public interface GoodsDAO {
    public void create(GoodsModel gm);
}

 

TestApp:

package cn.sxt.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.sxt.spring.dao.GoodsDAO;
import cn.sxt.spring.vo.GoodsModel;

public class TestApp {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        GoodsDAO goodsDAO = (GoodsDAO) ac.getBean("goodsDAO");
        GoodsModel gm = new GoodsModel();
        goodsDAO.create(gm);
    }
}

 

GoodsModel:

package cn.sxt.spring.vo;

public class GoodsModel {

}

 

可以通过修改配置文件,切换数据层的具体实现类。

 

 

Spring---->di

di概念

di:dependency injection 依赖注入

应用程序依赖ioc/di容器注入外部资源的一种程序实现。

ioc容器反过来控制应用程序获取外部资源一种实现。

ioc和di谈的是一件事,仅仅站的角度不同。ioc站在容器角度,di站在应用程序角度。

自己主动的创建(new)和维护对象(设置对象属性)的事情,对应Spring框架中ioc/di概念

 

简单的di例子

在ioc的例子上再加一个service层

GoodService:

package cn.sxt.spring.service;

import cn.sxt.spring.vo.GoodsModel;

public interface GoodsService {
    public void create(GoodsModel gm);
}

 

GoodServiceImpl:

package cn.sxt.spring.service.impl;

import cn.sxt.spring.dao.GoodsDAO;
import cn.sxt.spring.service.GoodsService;
import cn.sxt.spring.vo.GoodsModel;

public class GoodsServiceImpl implements GoodsService{

    public GoodsServiceImpl() {
        System.out.println("GoodsServiceImpl");
    }
    

    private GoodsDAO goodsDAO;
    
    public void setGoodsDAO(GoodsDAO goodsDAO) {
        this.goodsDAO = goodsDAO;
    }
    
    @Override
    public void create(GoodsModel gm) {
        goodsDAO.create(gm);
    }

}

 

在applicationcontex中添加如下配置信息:

<bean id="goodsService" class="cn.sxt.spring.service.impl.GoodsServiceImpl">
        <property name="goodsDAO" ref="goodsDAO"></property>
    </bean>

 

 

ioc和di

1、实例化

通过在applicationcontext.xml中定义<bean id="" class="">

2、维护对象关系

在对象中定义接受外部资源的方式,定义一个属性,提供setter方法

在bean元素中配置子元素<property name="用来拼接setter方法" ref="引用类型"></property>

 

创建和管理对象

无参构造方法

<bean id="goodsDAO" class="cn.sxt.spring.dao.impl.GoodsDAOImpl1"></bean>

 

带参数构造方法

GoodsModel:

package cn.sxt.spring.di;

public class GoodsModel {
    private int id;
    private String name;
    
    
    public GoodsModel() {
        
    }
    
    public GoodsModel(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "GoodsModel [id=" + id + ", name=" + name + "]";
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        GoodsModel other = (GoodsModel) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
}
View Code

 

appliactionContext:

<?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-3.0.xsd">
    <bean id="goodsModel" class="cn.sxt.spring.vo.GoodsModel" scope="prototype">
        <constructor-arg name="id" value="100"></constructor-arg>
        <constructor-arg name="name" value="iphone"></constructor-arg>
    </bean>
</beans>
View Code

 

 

集合类型

CollectionModel:

<?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-3.0.xsd">
    <bean id="goodDAO" class="cn.sxt.spring.di.GoodsDAOImpl2"></bean>
    
    <bean id="collectionModel" class="cn.sxt.spring.di.CollectionModel">
        <property name="name" value="lianlian"></property>
        
        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>
        
        <property name="list">
            <list>
                <value>4</value>
                <value>5</value>
                <value>6</value>
            </list>
        </property>
        
        <property name="set">
            <set>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </set>        
        </property>
        
        <property name="pro">
            <props>
                <prop key="l">lianlian</prop>
                <prop key="q">qiqi</prop>
            </props>
        </property>
        
        <property name="map">
            <map>
                <entry>
                    <key><value>lianlian</value></key>
                    <value>qiqi</value>
                </entry>
            </map>
        </property>
    </bean>
    
</beans>
View Code

 

 

applicationContext:

<?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-3.0.xsd">
    <bean id="goodDAO" class="cn.sxt.spring.di.GoodsDAOImpl2"></bean>
    
    <bean id="collectionModel" class="cn.sxt.spring.di.CollectionModel">
        <property name="name" value="lianlian"></property>
        
        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>
        
        <property name="list">
            <list>
                <value>4</value>
                <value>5</value>
                <value>6</value>
            </list>
        </property>
        
        <property name="set">
            <set>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </set>        
        </property>
        
        <property name="pro">
            <props>
                <prop key="l">lianlian</prop>
                <prop key="q">qiqi</prop>
            </props>
        </property>
        
        <property name="map">
            <map>
                <entry>
                    <key><value>lianlian</value></key>
                    <value>qiqi</value>
                </entry>
            </map>
        </property>
    </bean>
    
</beans>
View Code

 

 

Bean和Spring容器的关系

每次加载配置文件,都会生成一个新的ioc/di容器,从不同容器得到bean,肯定是不同的。

 

实例化范围

一般使用singleton实例化范围,每次向容器获取bean,容器只返回一个对象。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2017-04-18 17:58  止水、三千  阅读(306)  评论(0)    收藏  举报