spring 的那些基本要知道的额 01

    xiaoxiao2024-12-28  68

    本次关于Spring 的 浅谈 共分为 4篇 :

    ======== 欢迎准备入门 spring框架 的 小伙伴 搬好小板凳 ========

    我是 来自 西安 的 java 爱好者 小封

    spring 的设计的技术的选型 :

    Full-stack : 全栈 开发 : 提供了javaEE的三层的 解决方案

    表现层 : SpringMVC 服务层 :spring 持久层 :Spring JDBCTemplate SpringData

    sprig 基于sun的开发的规范 EJB

    ======== spring 优势 7=========

    1: ioc 反向依赖 解耦 简化开发

    2: AOP 面向切片的 方法的befor 与after 与环绕 等片段

    3: 声明式事务---->AOP


    4: 集成

    5: Junit 测试

    6: 模板 降低使用难度 :

    7: java源码的学习

    OIC 控制反转 : 把 对象的 创建 叫给Spring 做 控制反转 把 对象的 创建 叫给Spring 做 : 然后逻辑层 里 就会 使用 ====== 解耦 了 /

    ========= spring体系 =============

    体系结构 :2个 核心 IOC 与 AOP 集成   底层:Core —IOC AOP、 DAO ,ROM J,avaEEweb spJE

    ========= 07编写jdbc的工程代码用于分析程序的耦合 ============= 面向对象 的开闭 原则 : 程序的修改是 关闭的 程序的扩展的开放 需求 : 项目经理 : 要换的 不同的 使用 比如他爱用的是 springTemplate 的 ( 效率低 ) 用了 spring 解决的方案的 : 小改 到 xml 配置文件 即可

    ioc 是什么 轻量级的框架 的 核心实现 基于 EJB

    即可 问问度娘

    自定义IOC 的 模拟 :

    反射+ 配置文件 xml 与注解 —— factory工厂(读取 配置: 通过反射 创建对象) 思路 : 解决 业务层 与 持久层 的 耦合 //通过 key 获取全类名 没有明确的 对象 是 :Object 调用配置 4: 在需要实例的地方 使用 工厂创建对象

    最后只需要 在配置文件 修改即可

    耦合 解除 : 在不修改源码 的

    使用 基于反射的factory 工厂创建对象.PNG

    ====== spring 的 API :

    BeanFactory 的 子接口 ApplicationContext 不一样的是

    BeanFactory : 用的时候 在实现 : ApplicationContext 作为子接口 实现 具体实现的 就会直接创建 的 :

    ApplicationContext 的 3个实现类的里 ;

    理解 3种实现类 名称

    ClassPathApplicationContext :## ====== 类 路径 ClassPath…

    跟着服务器 走的 类路径 也就是程序构成 的类文件 走的 ==== 常用 日常开发 最 扩展的 的方式

    FileSystemXMLApplicationContext ======= 系统文件本地到xml : FileSystemXml…

    本地的 硬盘里的======= 系统 文件的里的xml 的内容来解析的

    AnnotationConfigApplicationContext : ======用于注解 的额 下回分晓

    注解 的 配置 内容======= AnnotationConfig......

    ====== spring 的getBean( ):重载 方法 里

    常用的是 入参的是 字符串 : 通用 还有通过 getClass()来过去 仅有一个的情况下才可以 否则有bug :

    通过 getClass()来过去 仅有一个的情况下才可以 否则有bug :

    ========= spring 程序开发的入门流程步骤

    正如上图的 引入 坐标就 已经 集成 所需 的 这些

    =============

    1: maven 的导入坐标 : spring5 的版本 :spring -text ---- 这里有一大堆 :aop benas 2: 编写Dao 的接口 (或其实现类 ***** 但是有MyBatis ====代理就行) 或者再来一套 :UserTemplate 的实现类 3: xml 配置文件 : -----bean id =“方法名” class =“全类名” : 4: 测试类 里要进行的是 : ClassPathXmlApplicationContext:类路径配置

    spring容器 :就是一个Map : 里面 的key 就是 bean 的id: value:是 全类名的 -----对象

    spring的对象 就是 Bean

    如果项目经理要换做SpringTemplate的 时候你只需改xml 配置文件 的 bean 配置的 class即可
    spring 的xml 配置文件 使用 :

    主要是id 的唯一的标识 的 就是 不得重复是的 ; bean : 无参构造

    IOC 中 bean 标签和管理对象细节

    bean标签的 作用 : 就是 让Spring IOC 来创建 的

    用无参构造方法 : 属性 : id 唯一来确定找到该对象 class : 该累的 字节码 权限定类名 scope : 对象的作用域 : ---- :默认时singleton 单例 ---- :prototype : 多例 我们就在java里写的 下面暂时不用 不常用 3个常用域 ---- :request ---- :session ---- : global session

    1 单例与多例:

    property : 多例 2个域 : 相当于 调用的

    javaGC 机制中 :与单例 与 多例

    多例 不受 GC 的影响 多 每次都会创建一个新的 意味者 内存开销
    单例 会有GC 的回收 : 因为太少 只有一个 反复使用,节省内存

    生命周期的 2个 属性 : init -Method : 对象创建的 时执行 destroy : 在对象被 销毁之前执行 已经创建 为什么没有销毁 没有来得及 .PNG 要关闭 需要父类转子类

    实例化 Bean 的三种方式 怎样 造 豆豆

    无参构造 与 工厂 ,工厂有静态工厂 与 实现类工厂

    常用 1:无参构造 就是基于默认 的

    2:****静态方法 :

    <bean id="accountService" class="com.fhw.factory.StaticFactory" factory-method="createAccountService"></bean>

    3:实现类的方法

    <!-- 此种方式是: 先把工厂的创建交给 spring 来管理。 然后在使用工厂的 bean 来调用里面的方法 factory-bean 属性: 用于指定实例工厂 bean 的 id。 factory-method 属性:用于指定实例工厂中创建对象的方法。 --> <bean id="instancFactory" class="com.fhw.factory.InstanceFactory"></bean> <bean id="accountService" factory-bean="instancFactory" factory-method="createAccountService"> </bean>

    spring 的依赖注入 DI

    1 依赖注入的概念 依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。 ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

    ======== ( 最常用 常用) set 注入 ====================--------

    pojo 类中 的 set 方法

    <!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式 涉及的标签: property 属性: name:找的是类中 set 方法后面的部分 ref:给属性赋值是其他 bean 类型的 value:给属性赋值是基本数据类型和 string 类型的 实际开发中,此种方式用的较多。 --> <bean id="accountService" class="com.fhw.service.impl.AccountServiceImpl"> <property name="name" value="test"></property> <property name="age" value="21"></property> <property name="birthday" ref="now"></property> </bean> <bean id="now" class="java.util.Date"></bean>
    ======== set 再有的 另一种 xml中导入 p名称空间,使用 p冒号

    不常用 大家 很少这样写

    p:成员属性名 来注入数据 ====================--------

    配置文件代码: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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"> <bean id="accountService" class="com.fhw.service.impl.AccountServiceImpl4" p:name="test" p:age="21" p:birthday-ref="now"/> </beans>
    . =========== 注入集合属性 ==========-----------
    不常用 作用得在框架 里

    是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。 我们这里介绍注入数组

    ======== 构造函数注入 (不常用 : 了解)====================--------

    以类 为单位 的注入 用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置 的方式,让 spring 框架来为我们注入

    数组 与 各种 集合 都用一遍 public class AccountServiceImpl implements IAccountService { private String[] myStrs; private List<String> myList; private Set<String> mySet; private Map<String,String> myMap; private Properties myProps; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMyProps(Properties myProps) { this.myProps = myProps; } @Override public void saveAccount() { System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); System.out.println(myProps); } } <!-- 注入集合数据 List 结构的: array,list,set Map 结构的 map,entry,props,prop --> <bean id="accountService" class="com.fhw.service.impl.AccountServiceImpl"> <!-- 在注入集合数据时,只要结构相同,标签可以互换 --> <!-- 给数组注入数据 --> <property name="myStrs"> <set> <value>AAA</value> <value>BBB</value> <value>CCC</value> </set> </property> <!-- 注入 list 集合数据 --> <property name="myList"> <array> <value>AAA</value> <value>BBB</value> <value>CCC</value> </array> </property> <!-- 注入 set 集合数据 --> <property name="mySet"> <list> <value>AAA</value> <value>BBB</value> <value>CCC</value> </list> </property> <!-- 注入 Map 数据 --> <property name="myMap"> <props> <prop key="testA">aaa</prop> <prop key="testB">bbb</prop> </props> </property> <!-- 注入 properties 数据 -->

    构造函数的方式 ( 不太用的)

    <!-- 使用构造函数的方式,给 service 中的属性传值 要求: 类中需要提供一个对应参数列表的构造函数。 涉及的标签: constructor-arg 属性: index:指定参数在构造函数参数列表的索引位置 type:指定参数在构造函数中的数据类型 name:指定参数在构造函数中的名称 用这个找给谁赋值 =======上面三个都是找给谁赋值,下面两个指的是赋什么值的============== value:它能赋的值是基本数据类型和 String 类型 ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean --> <bean id="accountService" class="com.fhw.service.impl.AccountServiceImpl"> <constructor-arg name="name" value=" 张三 "> </constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <constructor-arg name="birthday" ref="now"></constructor-arg> </bean> <bean id="now" class="java.util.Date"></bean>
    最新回复(0)