本次关于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>