睁眼写BUG,闭眼改BUG。

Spring_入门

2020.03.02

上一篇 >> Spring_常用注解

下一篇 >> Spring_AOP

fighting!fighting!

Spring学习笔记

Spring框架简介及官方压缩包目录介绍

主要发明者:Rod Johnson

轮子理论推崇者:

轮子理论:不用重复发明轮子

It行业:直接使用写好的代码

Spring框架宗旨:不重新发明技术,让原有技术使用起来更加方便

Spring 几大核心功能

IoC/DI :控制反转/依赖注入

AOP:面向切面编程

声明式事务

Spring框架 runtime

test:spring提供测试功能

Core Container:核心容器.Spring启动最基本的条件

Beans:Spring 负责创建类对象并管理对象
Core :核心类
Context:上下文参数.获取外部资源或这管理注解等
SpEl:expression.jar

AOP:实现aop功能需要依赖

Aspects:切面 AOP依赖的包

Date Access/Integration:Spring封装数据访问层相关内容

JDBC:spring对JDBC封装后的代码
ORM:封装了一些持久层代码.列如Hibernate
transactions:对应 spring-tx.jar,声明事务使用

web:需要spring完成 web 相关功能时需要

列如:由tomcat加载 spring 配置文件时需要有 spring-web包

Spring 框架中重要概念

容器(Container):Spring 当作一个大容器

BeanFactory接口 老版本

新版中 ApplicationContext 接口,是BeanFactory子接口.Bean Factory的功能在ApplicationContext中都有

从Spring3开始把Spring框架的功能拆分成多个jar.

Spring2及以前就一个jar

IoC

中文名称:控制反转

英文名称:Inversion of Control

IoC 是什么?

IoC完成的事情原先 由程序员主动通过new实列化对象事情,转交给Spring 负责

控制反转中 控制 指的是:控制类的对象

控制反转中 反转 指的是:转交给Spring 负责

IoC最大的作用:解耦

程序员不需要管理对象,接触了对象管理和程序员之间的耦合

Spring环境搭建

  • 导入jar

    • 四个核心包一个日志包

  • 在 src 下新建applicationContext.xml

    • 文件路径自定义

    • 记住Spring 容器 ApplicationContext,applicationContext.xml 配置的信息最终存储到了 ApplicationContext 容器中

    • Spring的配置文件是基于 schema

      • schema 文件 扩展名.xsd
      • 把schema 理解成 DTD的升级版(语法检查器)
        • 比 DTD具备更好的扩展性.
      • 每次引入一个xsd文件是一个 namespace
    • 配置文件中只需要引入基本 schema

      • 通过标签创建对象
      • 默认配置文件被加载时创建对象
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="https://www.springframework.org/schema/beans"
          xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://www.springframework.org/schema/beans 
          	https://www.springframework.org/schema/beans/spring-beans.xsd">
          <!-- id表示获取到对象标识
          	class 创建那个类的对象 
          -->
          <bean id="people" class="work.idler.pojo.People"></bean>
      </beans>
      
    • 编写测试方法

      • getBean("标签id值",返回值类型);如果没有第二个参数,默认是Object
      • getBeanDefinitionNames(),Spring 容器中目前所有管理的所有对象
      	public static void main(String[] args) {
      //		People people = new People();
      		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
      		People people = ac.getBean("people",People.class);
      		System.out.println(people);
      
      		String[] names = ac.getBeanDefinitionNames();
      		for(String string : names) {
      			System.out.println(string);
      		}
      	}
      

Spring 创建对象的三种方式

通过构造方法创建

无参构造创建:默认 情况

有参构造创建: 需要明确配置

需要在类中提供有参构造方法
在 applicationContext.xml中设置调用那个构造方法创建对象
  • 如果设定的条件匹配多个构造方法执行最后的构造方法
  • index:参数的索引,从0开始
  • name:参数名
  • type:类型(区分开关键字和封装类 int 和 Integer
    <bean id="people" class="work.idler.pojo.People">
    	<!-- ref引用另一个bean value 基本数据类型或String 等 -->
    	<constructor-arg index="0" name="id" type="int" value="123"></constructor-arg>
    	<constructor-arg index="1" name="name" type="java.lang.String" value="张三"></constructor-arg>
    </bean>

实列工厂

工厂设计模式:帮助创建类对象.一个工厂可以生产多个对象

实列工厂:需要先创建工厂,才能生产对象

实现步骤:

必须要有一个实列工厂
public class PeopleFactory {
	public People newInstance() {
		return new People();
	}
}
在applicationContext.xml中配置工厂对象和需要创建的对象
    <bean id="factory" class="work.idler.pojo.PeopleFactory"></bean>
    <bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>

静态工厂

不需要创建工厂,快速创建对象

实现步骤:

编写一个静态工厂(在方法上添加static)
public class PeopleFactory {
	public static People newInstance() {
		return new People();
	}
}
在applicationContext.xml中
    <bean id="peo2" class="work.idler.pojo.PeopleFactory" factory-method="newInstance"></bean>

如何给 Bean 的属性赋值(注入)

通过构造方法设置值

设置注入(通过set方法)

如果属性时基本数据类型或String 等简单

	<bean id="peo" class="work.idler.pojo.People">
		<property name="id" value="222"></property>
		<property name="name" value="张三"></property>
	</bean>
等效于:
	<bean id="peo" class="work.idler.pojo.People">
		<property name="id">
			<value>456</value>
		</property>
		<property name="name">
			<value>张三年</value>
		</property>
	</bean>

如果属性是Set<?>

		<property name="sets">
			<set>
				<value>1</value>
				<value>2</value>
				<value>3</value>
				<value>4</value>
			</set>
		</property>

如果属性是List<?>

		<property name="list">
			<list>
				<value>1</value>
				<value>2</value>
				<value>3</value>
			</list>
		</property>
如果List 只有一个值
		<property name="list" value="1">
		</property>

如果属性是数组

如果数组中只有一个值 与 List 同理
		<property name="strings">
			<array>
				<value>1</value>
				<value>1</value>
				<value>1</value>
			</array>
		</property>

如果属性是 map

<property name="map">
			<map>
				<entry key="a" value="b">
				</entry>
				<entry key="c" value="d">
				</entry>
			</map>
		</property>

如果属性是 Property

		<property name="strings">
			<props>
				<prop key="key">value</prop>
                <prop key="key1">value1</prop>
			</props>
		</property>

DI

  • 中文名称:依赖注入

  • 英文名称:Dependency Injection

DI是什么?

  • DI和IoC 是一样的
  • 当一个类中需要依赖另一个类对象时,把 B 赋值给A 的过程就叫依赖注入

代码体现

	<bean id="peo" class="work.idler.pojo.People">
		<property name="desk" ref="desk"></property>
	</bean>
	
	<bean id="desk" class="work.idler.pojo.Desk">
		<property name="id" value="1"></property>
		<property name="price" value="12"></property>
	</bean>

使用 Spring 简化 MyBatis

  • 导入 mybatis所有jar 和sping 基本包 jdbc,tx,aop 以及一个spring整合mybatis包

编写 spring 配置文件 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.springframework.org/schema/beans 
    	https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 数据源封装类  数据源:获取数据库连接 spring-jdbc.jar中  -->	
	<bean id="dataSouce" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false&amp;serverTimezone=UTC"></property>
		<property name="username" value="root"></property>
		<property name="password" value="5211"></property>
	</bean>
	<!-- 创建SqlSessionFactory对象 -->
	<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean" >
		<!-- 数据库连接信息来源于dataSource -->
		<property name="dataSource" ref="dataSouce"></property>
	</bean>
	<!-- 扫描器 相当于mybatis.xml中mappers 下 package 标签,扫描work.idler.mapper包后给对应接口创建对象 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 和factory产生关系 -->
		<property name="basePackage" value="work.idler.mapper"></property>
		<property name="sqlSessionFactory" ref="factory"></property>
	</bean>
	<!-- 由spring管理service实现类 -->
	<bean id="airportService" class="work.idler.service.impl.AirportServiceImpl">
		<property name="airportMapper" ref="airportMapper"></property>
	</bean>
</beans>

编写代码

  • 正常编写 pojo

  • 编写mapper 包下时 必须使用接口绑定方案或注解方案(必须有接口)

  • 正常编写 Service 接口和 Service 实现类

    • 需要在Service 实现类中声明 Mapper 接口对象,并声成 get/set 方法
  • Spring 无法管理 Servlet