Spring框架的概述以及Spring中基于XML的IOC配置
Spring的概述
Spring是什么
Spring是分层的Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse of Control:反转控制)和 AOP(Aspect Oriented Programing:面向切片编程)为内核,提供了展现层SpringMVC和持久层 Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。
Spring的两大核心
IoC(Inverse of Control:反转控制)
AOP(Aspect Oriented Programing:面向切片编程)
Spring的发展历程和优势
Spring的优势
方便解耦,简化开发
AOP编程的支持
声明式事务的支持
方便程序的测试
方便集成各种优秀的框架
降低JavaEE API的使用难度
Java源码是经典学习案例
Spring体系结构
程序的耦合和解耦
- 曾经案例中的问题
- 程序的耦合
- 耦合:程序间的依赖关系
- 包括
- 类之间的依赖
- 方法之间的依赖
- 包括
- 解耦:降低程序间的依赖关系
- 实际开发中:
- 应该做到:编译器不依赖,运行时才依赖。
- 解耦的思路:
- 第一步:使用反射来创建对象,而避免使用new关键字
- 第二步:通过读取配置文件来获取要创建的对象的全限定类名
- 耦合:程序间的依赖关系
- 程序的耦合
- 工厂模式解耦
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的 方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。 那么,这个读取配置文件,创建和获取三层对象的类就是工厂。
package cn.kxwahn.factory;import java.io.InputStream;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.Properties;/*** 一个创建Bean对象的工厂* Bean:在计算机英语中,有可重用组件的含义。* JavaBean:用java语言编写的可重用组件。* javabean > 实体类* 它就是创建service和dao对象的* 第一个:需要一个配置文件来配置service和dao* 配置的内容:唯一标识 = 全限定类名(key = value)* 第二个:通过读取配置文件中配置文件的内容,反射创建对象* 配置文件可以是xml也可以是properties*/public class BeanFactory {// 定义一个Properties对象private static Properties props;// 定义一个Map,用于存放我们要创建的对象,我们把它称之为容器。private static Map<String, Object> beans;// 使用静态代码块为Properties对象赋值static {try {// 实例化对象props = new Properties();// 获取Properties文件的流对象InputStream is = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");props.load(is);// 实例化容器beans = new HashMap<String, Object>();// 取出配置文件中所有的keyEnumeration keys = props.keys();// 遍历枚举while (keys.hasMoreElements()) {// 取出每个keyString key = keys.nextElement().toString();// 根据key获取valueString beanPath = props.getProperty(key);// 反射创建对象Object value = Class.forName(beanPath).newInstance();// 把key和value存入容器中beans.put(key, value);}} catch (Exception e) {throw new ExceptionInInitializerError("初始化properties失败!");}}/*** 根据Bean的名称获取Bean对象* @param beanName* @return*/public static Object getBean(String beanName){return beans.get(beanName);}}
IOC概念和Spring中的IOC
Spring中基于XML的IOC环境
原来: 我们在获取对象时,都是采用 new 的方式。是主动的。
现在: 我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。
这种被动接收的方式获取对象的思想就是控制反转,它是 spring 框架的核心之一。
明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系)。
依赖注入(Dependency Injection)
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--spring中的依赖注入依赖注入:Dependency InjectionIoC的作用:降低程序间的耦合(依赖关系)依赖关系的管理:以后都交给了spring来维护在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护:就称之为依赖注入。依赖注入:能注入的数据:有三类:基本类型和String其他bean类型(在配置文件中或者注解配置过的bean)复杂类型/集合类型注入的方式:有三种第一种:使用构造函数提供第二种:使用set方法提供第三种:使用注解提供--><!--构造函数注入:使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据也是构造函数中某个或某些参数的类型index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始name:用于指定给构造函数中指定名称的参数赋值=================以上三个用于指定给构造函数中哪个参数赋值=================value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型数据。它指的是在spring的IoC核心容器中出现过的bean对象优势:在获取bean对象时,注入数据时必须的操作,否则对象无法创建成功。弊端:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。--><bean id="accountService" class="cn.kxwahn.service.impl.AccountServiceImpl"><constructor-arg name="name" value="可惜我爱怀念"></constructor-arg><constructor-arg name="age" value="18"></constructor-arg><constructor-arg name="birthday" ref="now"></constructor-arg></bean><!--配置一个日期对象--><bean id="now" class="java.util.Date"></bean><!--set方法注入 更常用的方式涉及的标签:property出现的位置:bean标签的内部标签中的属性name:用于指定注入时所调用的set方法名称value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型数据。它指的是在spring的IoC核心容器中出现过的bean对象优势:创建对象时没有明确的限制,可以直接使用默认构造函数弊端:如果有某个成员必须有值,则获取对象是有可能set方法没有执行。--><bean id="accountService2" class="cn.kxwahn.service.impl.AccountServiceImpl2"><property name="name" value="test"></property><property name="age" value="21"></property><property name="birthday" ref="now"></property></bean><!--复杂类型的注入/集合类型的注入用于给List结构集合注入的标签:list array set用于给Map结构集合注入的标签:map props结构相同,标签可以互换--><bean id="accountService3" class="cn.kxwahn.service.impl.AccountServiceImpl3"><property name="myStrs"><array><value>AAA</value><value>BBB</value><value>CCC</value></array></property><property name="myList"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="mySet"><list><value>AAA</value><value>BBB</value><value>CCC</value></list></property><property name="myMap"><map><entry key="testA" value="aaa"></entry><entry key="testB"><value>BBB</value></entry></map></property><property name="myProps"><props><prop key="testC">ccc</prop><prop key="testD">ddd</prop></props></property></bean></beans>
Spring中的基本注解的IOC和IOC的案例
Spring中IoC的常用注解
案例使用xml方式和注解方式实现单表的CRUD操作
改造基于注解的IoC案例,使用纯注解的方式实现
Spring和Junit整合
- 应用程序的入口
- main方法
- junit单元测试中,没有main方法也能执行
- junit集成了一个main方法
- 该方法就会判断当前的测试类中有哪些方法有@Test注解
- junit就会让有Test注解的方法执行
- junit不会管我们是否采用spring框架
- 在执行测试方法时,junit根本不知道我们是不是使用了spring框架
- 所以也就不会为我们读取配置文件/配置类创建spring核心容器
- 由以上三点可知

