Spring(一)

110 阅读6分钟

Spring框架简介及官方压缩包

Spring理论

  • 轮子理论:不用重复发明轮子,即直接使用写好的代码
  • Spring框架宗旨:不重新发明技术,让原有技术起来更加方便。它没有专门的层,但是哪里都有,让其他技术更方便。

Spring核心功能:

  • IoC/DI:控制反转/依赖注入
  • Aop:面向切面编程
  • 声明式事务

Spring框架runtime

  • test:Spring提供测试功能
  • Core Container:核心容器,Spring启动的基本条件
    • bean:负责创建类对象并进行管理
    • context:上下文参数,获取外部资源或者管理注解
    • SpEl:Spring表达式语言,是express包
  • Aop:实现Aop功能依赖的包
  • Aspect:切面Aop依赖的包
  • Data Access/Integration:封装数据访问层相关内容
    • JDBC:Spring对JDBC封装后的代码
    • ORM:封装持久层框架代码,如Hibernate。但是没有Mybatis,因为Spring出现的时候没有Mybatis。
    • Transaction:声明式事务实现,对应spring-tx包
  • 容器(Container):Spring可以当做一个大容器
  • ApplicationContext:BeanFactory子接口

IoC

什么是IoC

  • 控制:控制类的对象
  • 反转:转交给Spring
  • IoC:控制反转,Inversion of Control。将原先由程序员主动通过new实例化对象的事情,转交给Spring负责。
  • 作用:解耦,解除了对象管理和程序员之间的耦合。

Spring环境搭建

  1. 导入jar包
    commons-logging
    spring-beans
    spring-context
    spring-core
    spring-expression
  2. 在src下新建applicationContext.xml。
  • 文件名和路径可以换,但默认这么写。
  • Spring容器是ApplicationContext,applictaionContext.xml中配置信息最终会存储到ApplicationContext容器中。
  • Spring配置文件是基于schema的。
    • schema文件扩展名是.xsd,可以理解为DTD升级版,也是语法检查器。
    • schema具备比DTD更好的扩展性,每次引入一个xsd文件时,就能引入相应的功能。
  1. 案例:Spring管理People对象的创建
  • 配置文件
<?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.xsd">
    <!-- id表示获取到对象标识
    	 class 创建哪个类的对象
     -->
    <bean id="people" class="pojo.People"/>
</beans>
  • 测试类
public static void main(String[] args) {
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	People people=ac.getBean("people",People.class);
	System.out.println(people);
}

输出结果 People [id=0, name=null]

  • getBeanDefinitionNames():获取一个数组,存放spring管理的所有类的对象。

Spring创建对象的三种方法

  1. 构造方法创建

无参构造创建:默认情况
有参构造创建:需要明确配置

  • 有参构造
    name:属性名 index:属性索引,从0开始
    ref:属性值,会引用另一个对象
    value:属性值,常用该标签设置属性值,一般 是基本数据类型或者String等
    type:属性类型,区分关键字和封装类
    一般使用index+name属性,因为只设置name标签时候,会默认使用最后一个构造参数。
<bean id="people" class="pojo.People">
    <!-- 
    ref:引用另一个对象
    value:基本数据类型或String等
     -->
    <constructor-arg name="id" index="0" value="111"></constructor-arg>
    <constructor-arg name="name" index="1" value="tom"></constructor-arg>
</bean>
  1. 实例工厂

工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象。
实例工厂:需要先创建工厂,才能生产对象。

<bean id="factory" class="pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
  1. 静态工厂

只需要在工厂的产生对象方法前加上static,不需要创建工厂,就能生产对象。

<bean id="peo2" factory-bean="factory" factory-method="newInstance"></bean>

给Bean的属性赋值(注入)

  1. 通过构造方法设置值

<bean id="people" class="pojo.People">
    <constructor-arg name="id" index="0" value="111"></constructor-arg>
    <constructor-arg name="name" index="1" value="tom"></constructor-arg>
</bean>
  1. 设置注入(通过set方法)

  • 如果属性是基本数据类型或者String等简单类型
 <bean id="people" class="pojo.People">
    <property name="id" value="22"></property>
    <property name="name" value="tom"></property>
</bean>

也可这么写,两种写法完全等效。

<bean id="people" class="pojo.People">
    <property name="id">
    	<value>111</value>
    </property>
   <property name="name">
   	<value>tim</value>
   </property>
</bean>
  1. 属性值不同类型的写法

  • set<?>

<bean id="people" class="pojo.People">
    <property name="sets">
   	<set>
   	    <value>1</value>
   	    <value>2</value>
   	</set>
    </property>
</bean>
  • list

<bean id="people" class="pojo.People">
    <property name="list">
   	<list>
   	    <value>1</value>
   	    <value>2</value>
   	</list>
    </property>
</bean>

若采用另一种赋值方法,会认为list中只有一个值。
<property name="list" value="1"></property>

  • 数组

<bean id="people" class="pojo.People">
    <property name="list">
   	<array>
   	    <value>1</value>
   	    <value>2</value>
   	</array>
    </property>
</bean>
  • map

 <bean id="people" class="pojo.People">
    <property name="map">
   	<map>
   	    <entry key="a" value="apple"></entry>
   	    <entry key="b" value="bob"></entry>
   	</map>
    </property>
 </bean>

DI

  1. DI:即依赖注入,Dependency Injection。
  2. 什么是DI
  • DI和IoC是一样的。
  • 当一个类(A)中需要依赖另一个类(B)赋值时,将B的值赋给A。
<bean id="people" class="pojo.People">
    <property name="desk" ref="desk"></property>
</bean>
<bean id="desk" class="pojo.Desk">
    <property name="id" value="1"></property>
    <property name="price" value="88"></property>
</bean>

Spring整合Mybatis

在application.xml中配置属性

  1. 数据源 jdbc驱动类的name小写首字母,因为Get、Set方法会大写首字母。不需要被引用的类,不需要写id。
  2. org.mybatis.spring.SqlSessionFactoryBean来自于mybatis-spring包。dataSource需要的数据类型是DataSource,而上面封装数据源的时候,"org.springframework.jdbc.datasource.DriverManagerDataSource"继承了父类,父类实现了DataSource接口,所以这里使用ref引入上面封装好的数据源即可。

例:application.xml

 <!-- 数据源封装类 .数据源:获取数据库连接,spring-jdbc.jar中-->
    <bean id="dataSouce" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    	<property name="url" value="jdbc:mysql://localhost:3306/ssm"></property>
    	<property name="username" value="root"></property>
    	<property name="password" value="smallming"></property>
    </bean>
    <!-- 创建SqlSessionFactory对象 -->
    <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<!-- 数据库连接信息来源于dataSource -->
    	<property name="dataSource" ref="dataSouce"></property>
    </bean>
    <!-- 扫描器相当于mybatis.xml中 mappers下package标签,扫描com.bjsxt.mapper包后会给对应接口创建对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    	<!-- 要扫描哪个包 -->
    	<property name="basePackage" value="com.bjsxt.mapper"></property>
    	<!-- 和factory产生关系 -->
    	<property name="sqlSessionFactory" ref="factory"></property>
    </bean>
    <!-- 由spring管理service实现类 -->
    <bean id="airportService" class="com.bjsxt.service.impl.AirportServiceImpl">
    	<property name="airportMapper" ref="airportMapper"></property>
    </bean>