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; } }
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>
集合类型
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>
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>
Bean和Spring容器的关系
每次加载配置文件,都会生成一个新的ioc/di容器,从不同容器得到bean,肯定是不同的。
实例化范围

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

浙公网安备 33010602011771号