Spring
Spring框架
基于JavaEE的轻量级框架,使用spring可以降低模块的耦合度,提高开发效率。
Spring框架的两大核心技术:
IOC
IOC:控制反转
DI:依赖注入
AOP
面向切面编程
Spring的模块划分:
Spring IOC
Spring AOP
SpringJDBC (Spring + MyBatis)
Spring事务
Spring作用
Dao层 (数据访问层)
数据库的JDBC操作
对应的框架:MyBatis 或 Hibernate(持久层框架)
Service层 (业务逻辑层)
具体的业务逻辑处理
目前没有合适的框架
Spring框架不是用来处理业务逻辑层的
Controller层 (控制层)
Servlet:接收请求、响应数据、请求转发等
对应的框架:SpringMVC
Spring框架:
Bean对象的实例化
配置管理
面向切面编程
自带服务:
定时调度(定时任务)
邮件发送
集成第三方框架
Quartz时钟框架(定时调度)
Spring Security 权限框架
Spring环境搭建
- 创建普通的Maven项目 (修改pom.xml配置文件)
- 在pom.xml中引入spring框架的依赖坐标
- 创建Bean对象
- 在resources目录下新建spring.xml配置文件,并设置bean标签
- 设置bean标签的id与class属性值 (id是bean对象的唯一标签,class是bean对象的类对象)
- 得到spring的上下文环境,通过getBean方法得到指定id的bean对象
Spring IOC容器Bean对象实例化模拟实现
- 工厂模式
- 反射 (得到指定方法 得到指定字段 调用方法 实例化类)
- XML解析 (dom4j + xpath)
- 单例模式
- 策略模式 (加载配置文件)
Spring IOC容器Bean对象实例化
构造器实例化
通过空构造进行Bean对象的实例化,要求Bean对象提供空构造
<bean id="唯一标识" class="类路径">
</bean>
静态工厂实例化 (了解)
-
定义静态工厂类 (普通类)
-
在类中定义静态方法,静态方法返回Bean对象的实例对象
-
在xml配置文件中通过静态工厂类得到实例化对象
<bean id="唯一标识" class="静态工厂类的类路径" factory-method="静态工厂类中的静态方法"> </bean>
实例工厂实例化(了解)
-
定义工厂类 (普通类)
-
在类中定义方法,方法返回Bean对象的实例对象
-
在xml配置文件中,先实例化工厂类
-
通过调用工厂类的方法,得到实例化对象
<bean id="工厂类的唯一标识" class="工厂类的类路径"></bean> <bean id="Bean对象的唯一标识" factory-bean="工厂类的唯一标识" factory-method="工厂类中的方法"></bean>
Spring IOC容器配置文件的加载
单配置文件加载
相对路径
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
BeanFactory ac = new ClassPathXmlApplicationContext("spring.xml");
绝对路径(了解)
ApplicationContext ac = new FileSystemXmlApplicationContext("配置文件的绝对路径");
多配置文件加载
可变参数
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml","配置文件名","");
import导入
在一个总的配置文件中导入其他需要加载的配置文件,加载配置文件时只需要加载总的配置文件
spring.xml
<bean id="" class=""></bean>
bean.xml
<bean id="" class=""></bean>
service.xml
<!-- 导入其他配置文件 -->
<import resource="spring.xml"/>
<import resource="bean.xml"/>
BeanFactory ac = new ClassPathXmlApplicationContext("service.xml");
Spring IOC注入
手动注入
set方法注入
需要提供set方法
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
设置属性字段的值
<bean id="userService" class="com.shsxt.service.UserService">
<!--
通过property标签设置字段的值
name:属性字段的名称 (setXXX)
ref:指定的bean标签的id
-->
<property name="userDao" ref="userDao" />
</bean>
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
构造器注入
通过构造器的参数注入
public class UserService {
private UserDao userDao;
// 带参构造
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
设置属性字段的值
<bean id="userService" class="com.shsxt.service.UserService">
<!--
通过constructor-arg标签设置字段的值
name:属性字段的名称
ref:指定的bean标签的id
-->
<constructor-arg name="" ref=""/>
</bean>
<bean id="userDao" class="com.shsxt.dao.UserDao">
</bean>
循环依赖问题
当两个或多个类需要互相注入时,构造器注入会出现循环依赖问题。可以通过set方法注入解决。