Spring
- 初识Spring
- Spring 家族
- spring.io
- Spring 已经形成了一种开发的生态圈,Spring 提供了若干个项目,每个项目用于完成特定的功能
- Spring FrameWork : 底层框架
- Spring Boot :提高快发速度
- Spring Cloud :分布式开发
Spring Framework 系统架构
-
是Spring 生态圈中最基础的项目,是其他项目的根基
- Core Container :核心容器
- AOP:面向切面编程
- Aspects:AOP思想实现
-
核心概念:
-
问题引发:代码的耦合度偏高如何解决?
使用对象时,在程序中不要主动使用 new 产生对象,转换为由外部提供对象
-
IoC(Inversion of Control) 控制反转
对象的创建控制权由程序转移到外部,这种思想称为控制反转
-
-
Spring 技术对IoC 思想进行了实现
- Spring 提供了一个容器,称为 IoC 容器,用来充当 IoC 思想中的 “外部”
- IoC 容器负责对象的创建,初始化等一系列工作,被创建或管理的对现在IoC 容器中统称为 Bean
-
DI(Dependency Injection)依赖注入
-
在容器中建立 bean 与 bean 之间的依赖关系的整个过程,被称为依赖注入
依赖注入(Dependency Injection, DI)是一种设计模式,也是Spring框架的核心概念之一。其作用是去除Java类之间的依赖关系,实现松耦合,以便于开发测试。
-
-
最终目标 =》 充分解耦
- 1、使用IoC 容器管理 bean(IoC)
- 2、在 IoC 容器内将有依赖关系的 bean 进行绑定关系 (DI)
-
最终实现了 :适用对象时不仅可以直接从 IoC 容器中获取,并且获取到的 bean 已经绑定了所有的依赖关系
知识补充
-
什么是依赖关系,一个类依赖另外一个类,没他不能活(会报错):依赖关系在Java 中 主要在变量,形参,静态方法的调用……
比如你想要喝水但 没有水杯装水 , 没有 手拿水,没有 嘴巴喝 。 那你就喝不成,这就是喝水的依赖
-
IoC 与 DI 入门
-
导入spring的坐标 spring-context
-
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency
-
-
管理配置对象 :bean
-
<bean id="catDao" class="com.wdc.dao.impl.CatDaoImpl"/>
-
id属性标示给bean起名字
class属性表示给bean定义类型
-
-
-
获取IoC容器
-
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
-
-
获取bean(根据bean配置id获取)
-
CatDao catDao = (CatDao) ctx.getBean("catDao");
-
以上就是 IoC 入门 ,而DI 是基于 IoC 来管理 bean 的,下面就是DI 入门
-
-
删除业务层中使用new的方式创建的dao对象
-
提供对应的set方法
-
作用:让 Spring 容器能够将相应的依赖对象注入到业务类中。
-
public void setCatDao(CatDao catDao) { this.catDao = catDao; } /* 1.Spring 容器在初始化 Bean 的过程中,会检查 Bean 中是否存在对应的 set 方法。 2.如果找到了与依赖对象类型匹配的 set 方法,Spring 就会通过反射机制调用这些方法。 3.调用 set 方法时,Spring 将所需的依赖对象作为参数传递给这些方法,从而完成注入。 */
-
-
配置service与dao的关系
-
<bean id="catService" class="com.wdc.service.impl.CatServiceImpl"> <!--7.配置service与dao的关系--> <!--property标签表示配置当前bean的属性 name属性表示配置哪一个具体的属性 ref属性表示参照哪一个bean--> <property name="catDao" ref="catDao"/> </bean>
-
bean 基础配置
-
bean 的别名
-
多个别名 (因为可能每个人的起名不一样)
-
<bean id="catDao" name = " dao catd" class="com.wdc.dao.impl.CatDaoImpl"/>
-
使用这些别名也可以成功引用, 中间可以使用 逗号、 分号、 空格
-
-
-
bean 的作用范围
-
scope=“singletor” 获取同一个对象(单例) - 默认
scope=“prototype” 获取的是不同的对象(非单例)
-
单例 让容器压力小,获取快
-
适合交给容器进行管理的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
-
不适合交给容器管理的bean
- 封装实体的域对象
-
-
bean 的实例化
-
bean 本质就是对象,创建bean 使用构造方法
-
-
使用构造方法(可写可不写)
如果它调用的构造方法不存在,将抛出 BeanCreationException
-
使用静态工厂、实例工厂 ,(了解)
-
使用 FactoryBean (掌握)
-
实现接口 FactoryBean
-
public class OrderDaoFactoryBean implements FactoryBean<OrderDao> { //代替原始实例创建对象的方法 @Override public OrderDao getObject() throws Exception { return new OrderDaoImpl(); } @Override public Class<?> getObjectType() { return OrderDao.class; } }
-
-
配置
-
<bean id="orderDao" class="com.wdc.factory.OrderDaoFactoryBean"/>
-
**注意:**这里配置出来的对象不是 OrderDaoFactoryBean 的对象,而是里面的方法 getObject() 中返回的对象
-
-
-
-
-