一、Spring概述
Spring 是分层的 Java SE/EE 应用full-stack 轻量级开源框架,以IOC(Inverse Of Control: 反转控制和 AOP(Aspect Oriented Programming:面向切面编程为内核,提供了展现层 SpringMVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术。
Spring 叫做EE开发的一站式框架。
Web层:SpringMVC
Service层:Spring的Bean管理、Spring声明式事务
Dao层:Spring的JDBC模板、Spring的ORM模块
二、IOC
什么是耦合?
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差
举个例子:
早期的JDBC操作,注册驱动时,我们并为使用DriverManager的register方法,而是采用Class.forName的方式。这是为什么呢?
因为:我们的类依赖了数据库的驱动类,如果这时候更换了数据库,需要修改源码更新数据库驱动。
public class JdbcDemo{
public static void main(String[] args) throws Exception {
//1.注册驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");
/*2.获取连接
3.获取预处理 sql 语句对象
4.获取结果集
5.遍历结果集*/
}
}
通过反射来注册驱动:
Class.forName("com.mysql.jdbc.Driver");//此处只是一个字符串
此时,我们的类中不再依赖具体的驱动类,此时就算删除 mysql 的驱动 jar 包,依然可以编译(但没有驱动是不可能运行成功的)。
但同时,mysql 驱动的全限定类名字符串是在 java 类中写死的,一旦要改还是要修改源码。
工厂模式解耦
实际开发中,我们把三层的对象都使用配置文件记下来,启动服务器应用的时候,让一个类的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用。这个读取配置文件,创建和获取三层对象的类就是工厂。
三层对象存放在哪里?
由于我们是很多对象,肯定要找个集合来存。这时候有 Map 和 List 供选择。因为存在查找需求,所以选 Map。因此,在应用加载时,创建一个Map,用于存放三层对象。我们把这个map称为容器`。
什么是工厂?
工厂就是负责从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
原来:我们在获取对象时,采用 new 的方式主动。
现在: 我们获取对象时,需要问工厂要,工厂为我们查找或者创建对象被动的。
控制反转(IOC),把创建对象的权利交给框架。其中最常见的方式叫做依赖注入(DI)
三、小例子
- 配置环境
- 创建项目,引入相关jar包
- 在类的根路径下创建 xml 文件:applicationContext.xml
给配置文件导入约束
<?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">
</beans>
- 创建接口和类
/**
* 用户管理DAO层接口
*/
public interface UserDao {
public void save();
}
/**
* 用户管理DAO实现类
*/
public class UserDaoImpl implements UserDao {
@override
public void save() {
System.out.println("UserDaoImpl执行");
}
}
- 将实现类交给Spring管理
在刚刚创建的applicationContext.xml文件beans标签中进行配置
<bean id="userDao" class="com.dao.UserDaoImpl"></bean>
- 编写类
public void demo() {
//创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.save();
}