Ⅰ、简介
即——Spring框架是一个轻量级、一站式、企业级应用、模块化、非侵入式的框架。
轻量级:其实代码量很大,但是因为它是模块化的框架,所以说它是轻量级框架;
一站式:一步到位,提供全方位服务,spring提供开发整个web企业项目所需要的所有模块;
企业级应用:企业JavaWeb项目开发;
非侵入式:不会因为引入spring框架而影响已经写好的业务逻辑。
相关模块
Ⅱ、核心容器IOC 0
一、简述
控制反转(Inversion of control),自定义类的权力交给IOC容器,由spring容器来创建类,从而降低类与类之间的联系,松耦合性。
举例说明——
今天穿鞋子的时候,有一支袜子找不到了,于是,“妈,你看到我另一支袜子没有,帮我找一找。没找到就再帮我买几双好看的袜子。” 放学回家,看见鞋柜上放着一盒袜子,我又问我妈妈,“妈,袜子没找到吗?这是又买了几双哦。”到此结束,整个过程中我没关心怎么找的,没找到(异常)的情况下又是怎么买的(处理异常)。
控制反转(IOC)一样的道理,将主动权交出(交给我妈妈,我需要好看的袜子,她就帮我买好看的袜子,具体是不是自己想要的好看的袜子,这个就……),过程是什么样子的其实不怎么不关心(怎么找的,在哪找的,找了多久,怎么买的……),只需要得到结果(没找到,买了新的袜子)即可。如果结果不好,可以再次申请(比如,袜子比较老气,我可以送给我爸爸,再请求我妈妈重新购买青春活力的好看的袜子)
疑惑——
1、管理流程是什么样的?
创建实例——>初始化实例——>容器中获取实例——>使用
2、哪些实例对象需要交给IOC?
全局实例对象,需要放在容器中。服务器关闭时,自动销毁(应用在javaWeb中,类似域对象Application(ServletContext),整个服务器内有效,服务器关闭时失效)。
3、spring整合其他框架是什么意思?
将其他框架(工具类)交给IOC管理。
初次接触spring IOC,下面使用案例来说明
pom.xml
<!--测试springIOC,3个jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.7.RELEASE</version>
</dependency>
StudentDaoImpl.java
public class StudentDaoImpl implements StudentDao {
@Override
public void insertStudent() {
System.out.println("添加学生成功");
}
}
springConfig.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"
xmlns:aop="http://www.springframework.org/schema/aop"
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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="studentDao" class="com.hbw.dao.StudentDaoImpl"></bean>
</beans>
测试
@Test
public void test1(){
//使用IOC提供的API读取配置文件,完成初始化实例
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
//获取实例,并使用
StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao");
studentDao.insertStudent();
}
二、IOC中常用的API 0
BeanFactory:核心API,提供了创建并管理所有实例。
*ApplicationContext:是BeanFactory的子接口,提供了创建并管理(生命周期),程序员自定义的所有实例。
其中三个实现类:
*ClassPathXMlApplication:根据类路径(Resources、Classes文件夹)解析配置文件,初始化容器(实例化)。
FileSystemXMlApplication:根据文件路径(D://…)解析配置文件。
AnnotationConfigApplication:通过读取注解配置,初始化容器。
提供close方法,但是不会手动调用,全局对象在服务器关闭时自动销毁(应用在javaWeb中类似域对象Application(ServletContext),整个服务器内有效,服务器关闭时失效)。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springConfig.xml");
三、IOC原理
1)👇使用一般的实例化,当该类发生变化时,实例化的地方都需要改变TestDaoImpl tdi = new TestDaoImpl();
。耦合性高。
2)👇使用接口编程的思想实例化,当该类发生改变时,只需要改变TestDao td = new TestDaoImpl();
实例化的一部分。耦合性较高。
3)👇使用第三方类(工厂类)实例化需要的类TestDao td = new TestFactory().getTestDaoImpl()
,当实例化的类发生改变时,只需要修改工厂里面的部分内容即可。
TestFactory.java
public class TestFactory {
public StudentDao getStudentDaoImpl(){
return new StudentDaoImpl();
}
}
测试
@Test
public void test2(){
StudentDao studentDao = new TestFactory().getStudentDaoImpl();
studentDao.insertStudent();
}
4)👇上分使用工厂类只能创建一种类,需要创建其他类时,又需要创建新的工厂,效率比较低。所以创建一个生产任意类的工厂,但是在使用该工厂实例化时,需要传入需要实例化类的全类名(反射)进行硬编码,使用时比较麻烦(每次都要传入全类名)。
TestFactory.java
/*获取任意实例*/
public Object getObjectImpl(String impl){
Object object = null;
try {
//获取字节码文件
Class clazz = Class.forName(impl);
//实例化
object = clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace()