文章目录
Spring入门
1.Spring简介
1.1Spring是什么?
Spring是一个开源的分层的JavaSE/EE应用轻量级框架。Spring包含两个核心,IOC和AOP。
1.2 Spring结构体系
详情看图片资料
1.3 Spring的发展历史
查阅资料查找EJB和Spring的关系。以及Spring的发展历史。
1.4S pring的优点
方便解耦,简化开发
方便集成各种第三方框架
方便程序的测试
AOP编程的支持
声明式事务的支持
2.IOC
2.1 耦合和内聚
程序编写的时候讲究:高内聚,低耦合。其实就是同一个模块内各个元素之间要高度紧密(高内聚),但是各个模块之间的依赖不要过分紧密(低耦合)
2.2 IOC的简介
IOC(Inversion of Control):控制反转。由Spring反向控制(创建,注入)应用程序中所需要使用的外部资源。
Spring控制的资源全部放置到Spring容器中,此容器可以称之为IOC容器。
2.3 IOC的入门程序
2.3.1 需求
模拟Service层需要一个Dao
2.3.2 创建项目导入Jar=
注意:使用Spring5.1.9的版本
2.3.3 编写各层的代码
详情看代码资料
2.3.4 配置Spring文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 创建Spring控制的资源 -->
<!-- 创建对象 -->
<!-- 下面的配置相当于Java中 UserDap userdao = new UserDao(); -->
<bean id="userdao" class="com.lxk.dao.UserDao"></bean>
</beans>
2.3.5 编写测试类
public class SpringTest {
public static void main(String[] args) {
//测试Spring创建对象是否成功
//1.加载配置文件
//ApplicationContext:Spring的容器
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取资源
UserDao a = (UserDao)act.getBean("userdao");
//3.测试
a.findAll();
}
}
2.4 IOC配置
2.4.1 bean标签
作用:定义Spring中的资源(Java对象),受到此标签定义的资源将受到Spring的控制
格式:
<beans>
<bean></bean>
</beans>
<!--和Java中的new是一样的。需要借助构造方法-->
基本属性:
<bean id="userdao" class="com.lxk.dao.UserDao" name="ud1,ud2"></bean>
<!--id:bean的名称,可以通过id获取bean-->
<!--class:bean的类型-->
<!--name:bean的名称。可以通过name获取bean。用于多人使用bean开发。一般很少使用-->
作用范围属性:
<bean id="userdao" class="com.lxk.dao.UserDao" scope="singleton"></bean>
<!--scope:定义bean的作用范围
singleton:设定创建的对象保存在Spring容器中,是一个单例的对象
prototype:设定创建的对象保存在Spring容器中,是一个多例的对象
request,session,application:设定创建的对象放置在web容器对应的位置
-->
bean的生命周期:
声明周期属性:init-method和destroy-method
作用:定义bean对象在处理化和销毁时完成的工作
注意事项:
创建时:
当scope=singleton时,Spring容器有且对一个对象只创建一次。容器处理化的时候执行。
当scope=prototype时,Spring容器会创建多个此类型的对象,每一次对象的创建都执行一次init。
销毁时:
当scope=singleton时,关闭容器会导致bean实例的销毁。destroy方法执行一次。
当scope=prototype时,对象的销毁交由垃圾回收机制gc来控制(destroy方法不会被执行)
2.4.2 bean的其他创建方式(了解)
<bean id="ud1" class="com.lxk.factory.UserDaoFactory" factory-method="getuserdao"></bean>
public class UserDaoFactory {
public static UserDao getuserdao() {
return new UserDao();
}
}
2.5 DI
DI:依赖注入。应用程序运行依赖的资源由Spring来提供。资源(对象)进入应用程序的方式称之为注入。
2.5.1 set注入(主流)
property标签
作用:使用set方法的形式为bean提供资源
<bean id="userdao" class="com.lxk.dao.UserDao">
<!-- set注入。所以需要被注入的类中存在封装的set方法 -->
<property name="name" value="张三"></property>
</bean>
<!-- 把userdao注入到service -->
<!-- 创建了一个UserService对象 -->
<bean class="com.lxk.service.UserService" id="userService">
<property name="userDao" ref="userdao"></property>
</bean>
基本属性:
name:对应bean中的属性名。要求该属性名必须提供可访问的set方法。
value:设定非引用类型属性对应的值。不能和ref同时出现
ref:设定引用类型属性对应的bean的id。不能和value同时出现
注意细节:一个bean中可以存在多个property属性
2.5.2 构造器注入(了解)
constructor-arg标签:
作用:使用构造方法的形式为bean提供资源。(为了兼容早期系统遗留的升级工作)
<bean class="com.lxk.service.UserService" id="userService">
<constructor-arg name="userDao" ref="userdao"></constructor-arg>
<constructor-arg name="empdao" ref="empdao"></constructor-arg>
</bean>
基本属性:
name:对应bean中的构造方法的参数名
value:设定非引用类型属性对应的值。不能和ref同时出现
ref:设定引用类型属性对应的bean的id。不能和value同时出现
2.5.3 p命名空间(了解)
<bean id="userService" class="com.lxk.service.UserService"
p:userdao-ref="userdao"
p:empdao-ref="empdao"/>
2.5.4 使用SpEL(了解)
<bean class="com.lxk.service.UserService" id="userService">
<property name="userDao" value="userdao.findAll()"></property>
<property name="empdao" value="#{empdao}"></property>
<!--
常量:#{3.1415},#{'qwer'}
引用bean:#{bean的id}
引用bean的属性:#{beanID.propertyName}(#{userDao.name})
引用bean的方法:beanID.methodName()
引用运算符:#{3==4}
-->
</bean>
2.6 集合数据类型的注入
可以使用property或constructor-arg两种标签注入
2.6.1 List
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 创建需要的emp对象 -->
<bean id="emp1" class="com.lxk.bean.Emp">
<property name="name" value="王二"></property>
</bean>
<bean id="emp2" class="com.lxk.bean.Emp">
<property name="name" value="麻子"></property>
</bean>
<bean id="empdao" class="com.lxk.dao.EmpDaoImpl">
<property name="lists">
<list>
<value>张三</value>
<value>李四</value>
</list>
</property>
<property name="listemp">
<list>
<ref bean="emp1"/>
<ref bean="emp2"/>
</list>
</property>
</bean>
</beans>
public class EmpDaoImpl implements EmpDao {
private List<String> lists;
private List<Emp> listemp;
private int arr [];
private Set<String> sets;
private Map<Integer,String> maps;
//省略了set方法
}
2.6.2 array
<property name="arr">
<array>
<value>123</value>
<value>456</value>
</array>
</property>
2.6.3 set
<property name="sets">
<set>
<value>张三</value>
<value>李四</value>
</set>
</property>
2.6.4 map
<property name="maps">
<map>
<entry key="123" value="张三"></entry>
<entry key="456" value="李四"></entry>
</map>
</property>
2.7 解析资源文件
UserController------->UserService---------->UserMapper----------->数据源
Spring提供了读取外部资源(properties)文件的机制。使用读取的数据可以作为bean的数据值。
2.7.1 编写资源文件
2.7.2 开启context支持
2.7.3 配置加载资源文件
<!-- 加载外部资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 使用加载的数据 -->
<bean id="empdao" class="com.lxk.dao.EmpDaoImpl">
<property name="driverName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
2.8 导入配置文件
import标签:
作用:在当前配置文件中导入其他配置文件
<import resource="spring_my.xml"/>
<import resource="spring_fc.xml"/>
Spring容器中bean定义的冲突问题
1.同id的bean,后定义的会覆盖先定义
2.导入配置文件可以理解为将导入的配置文件的内容赋值到导入的位置
3.导入配置文件的顺序和位置会导致最终的运行结果不同
2.9 ApplicationContext
1.ApplicationContext是一个接口,提供了访问Spring容器的API
2.ClassPathXmlApplicationContext是一个类,实现了ApplicationContext中描述的功能
3.ApplicationContext的最底层接口时BeanFactory
4.BeanFactory定义bean的相关的基本操作
5.ApplicationContext在BeanFactory基础上丰富了一些功能
BeanFactory和ApplicationContext的区别:
1.ApplicationContext创建的bean默认采用立即加载
2.BeanFactory创建bean采用延迟加载。使用的时候才创建
2.10 第三方资源配置
<!-- 加载资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
3.Spring和Mybatis整合
整合思路:
非Spring环境
1.实体类和表
2.业务层的接口和实现
3.持久化层的接口
4.Mybatis核心配置文件
5.Mybatis的映射文件
6.测试类
Spring环境
1.实体类和表
2.业务层的接口和实现(使用Spring注入的方式获取持久化层对象)
3.持久化层的接口
4.Mybatis核心配置文件(交给Spring管理。该配置废弃)
5.Mybatis的映射文件
6.测试类
7.Spring核心配置文件
3.1 创建项目和结构
3.2 导入相关依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
3.3 编写接口和类
3.4 编写配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 加载资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置druid数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<!--资源文件不能使用username当成key,否则会读取系统名称-->
<property name="username" value="${user}"></property>
<property name="password" value="${password}"></property>
</bean>
<!-- Spring整合Mybatis后,Spring控制链接对象 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.lxk.bean"></property>
</bean>
<!-- 创建mapper对象 扫描整个包 批量创建mapper的实现类。名字(id)就是接口名-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lxk.mapper"></property>
</bean>
<!-- Spring把dao注入到service层 -->
<bean id="empServiceImpl" class="com.lxk.service.impl.EmpServiceImpl">
<property name="empmapper" ref="empMapper"></property>
</bean>
</beans>