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); } }
- getBean("
-
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&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