纸上谈Spring
Updated:
高内聚、低耦合
- 内聚性:指一个模块内各元素之间紧密结合的程度
一个模块内各元素之间联系得越紧密,内聚性越高 - 低耦合:指一个系统中各模块之间紧密需要的程度
各模块间的联系越紧密,其耦合性越强,独立性越差
面向接口编程
- 在结构设计中的层次及调用关系:
每层只向外(上层)提供一组功能接口,各层之间仅依赖接口,而非依赖于接口的具体实现类 - 要求接口实现的变动不影响各层之间的调用
- 用接口定义对象,new它的实体类
1
OneInterface one = new OneInterfaceImpl;
IOC容器
- IOC :控制反转
指控制权的转移,使获得依赖对象的过程被反转(由自身管理变成了IOC容器的主动注入) - DI :依赖注入
IOC的实现方法,指在程序运行期间,动态地将某种依赖关系注入到容器当中 - 跟房屋中介的对比嘿嘿
Spring 的注入方式
- Spring 注入是指在启动 Spring 容器加载 bean 配置的时候,就完成对变量的赋值的行为
- 设值注入 :对应 set 方法
即 injectionService 中有一个 injectionDAO 的属性,然后当你有一个 setInjectionDAO 的方法时,spring 就会自动帮你把 injectionDAO 的值注入进去啦 - 构造注入 :对应构造器
同上,但此时要求 InjectionSercive 这个类里面要有一个参数为 injectionDAO(大小写必须完全一致)的构造器 - 注意注意:
property 中的 name 对应 injectionService 中该属性的名称;其 ref 对应该属性的类型在 bean 中的 id - 最后附上两种构造方式对应的java代码 :
bean : IOC容器中的对象
- bean 的配置项
- id :在整个IOC容器中bean的唯一标识
- class :具体要实例化bean的那个类
- scope :bean的范围,即作用域
- constructor argument :构造器参数
- properties :该个bean中所包含的属性
- autowiring mode :自动装载模式
- lazy-initialization mode :懒加载模式
- initialization method :初始化方式
- destruction method :销毁方式
- bean 的作用域
- singleton :单例,指一个bean容器中只存在一份该bean
- prototype :每次请求(使用)都会创建新的实例
- request / session :每次http请求都创建一个新实例,且仅在当前 request / session 内有效
- bean 的生命周期
- 定义 :在xml中配置的bean
- 初始化 :生成bean的实例
- 使用 :从bean容器中取出实例并使用
- 销毁 :销毁当前实例
- 注 :可以直接配置全局的初始化 & 销毁方法
别忘了在xml中配置完成之后还要写对应java代码中的方法哟 - 注2 :实现 InitialMethod 和 DestroyMethod 接口时,此间指定的方法要先于我们自己在 xml 中为个体 bean 配置的 init-method 和 destroy-method 执行;且均会覆盖全局性的默认方法
- bean 的自动装配
此时则不需要使用property或constructor-arg啦- no :不做任何操作
- byName :当将 auto-wire 属性设置为 byName 时,Spring 将尝试将该属性与配置文件中具有相同 id 的 beans 进行匹配和连接。若找到匹配项,则注入该 bean;反之,则抛出异常
- byType :跟 byName 差不多,只是将要查找的匹配的对象的范围从名称变成了类型(可以理解为从对应的 id 变成了 class )
- 类的自动检测及 bean 的注册
- 类的自动检测 :
- 使用过滤器进行自定义扫描 :
注:include-filter :”包含”过滤器;
exclude-filter :”排除”过滤器; - 使用注解定义 bean :
- 类的自动检测 :
- 使用 @Autowired 注解
- @Required 注解 :适用于 bean 属性的 setter 方法,该注解表示受影响的 bean 属性必须在配置时就被填充,即通过 bean 定义或通过自动装配得到一个明确的属性值
- @Autowired 注解 :
- 既可以用在 setter 方法上,又可以用在构造器上;
- 默认情况下若找不到合适的 bean,将会导致自动装配失败,抛出异常;
- 可以通过将其 required 属性标注为 false 来避免;
- 每个类只能有一个构造器被标记为 required=true,故想要装配的必要属性建议使用 @Required 注解
(别了)
- 对 List/Set 使用 @Autowired :
即将该接口的全部具体实现类依次装载进list
注:若希望数组有序,可使用 @Order(int) 注解 - 对 Map 使用 @Autowired :
key、value分别对应类的实例和该具体的类
- 终于到了 @Bean 注解
- 就和 < bean >< / bean > 是一样的
- @Bean(name=”xx”) 即对应 xml 配置中的 id
- 可以使用 @Scope 设置bean的作用范围
- @Configuration 标注在类上,相当于把该类作为 xml 配置文件中的
- @Bean 标注在方法上(但要注意是某个返回实例的方法),等价于 xml 配置中的 < bean >
或者参考这个来进行理解:
https://blog.csdn.net/javaloveiphone/article/details/52182899 - 当然啦,既然 @Bean 的作用是注册 bean 对象,那么完全可以使用 @Component、 @Controller、 @Service、 @Ripository 等注解,注意要配置 @ComponentScan 进行自动扫描
- spring 中的资源文件
- 首先来放一张图
property-placeholder : 对应一个资源文件
location : 对应资源文件的具体位置
整体作用 :即是用来加载资源文件的啦 - 这是使用配置文件的情况
- 这是使用注解的情况
- 首先来放一张图
AOP :面向切面编程
- AOP 的相关概念
- 切面(Aspect):
一个关注点的模块化,可以横切多个对象 - 连接点(Joinpoint):
程序执行过程中某个特定的节点 - 通知(Advice):
在切面的某个特定连接点上执行的动作 - 切入点(Pointcut):
用来匹配具体的连接点 - 引入(Introduction):
在类的外部为类添加新的方法和属性 - 目标对象(Target Object):
被一个或多个切面所通知的对象 - AOP代理(AOP Proxy):
AOP框架创建的对象,用来实现切面契约 - 切面契约(Aspect Contract):
可以用来通知方法的执行等 - 织入(Weaving):
将切面与具体的应用程序类型或对象相连接,并创建一个被通知的对象;分为:编译时织入、类加载时织入、执行时织入
- 切面(Aspect):
- Advice(通知)的类型
- 前置通知(Before advice):
在某连接点之前执行的通知 - 返回后通知(After returning advice):
在某连接点正常完成后所执行的通知 - 抛出异常后通知(After throwing advice):
在方法抛出异常退出时所执行的通知 - 后通知(After/Finally advice):
当某连接点退出的时候执行的通知(不论该连接点是正常返回还是异常退出,均会执行后通知) - 环绕通知(Around advice):
包围一个连接点(joinpoint)的通知
- 前置通知(Before advice):
- 配置切面 Aspect
- Spring 中所有的切面和通知器都必须放在一个< aop:config > 里面(可以配置包含多个 < aop:config > 元素),每一个 < aop:config > 中可以包含 pointcut、advisor 和 aspect 元素,但要注意的是它们必须按照这个顺序进行声明
- 比如这样子:
- 配置切入点 Pointcut
- 常用的切入点表达式:
- 其他的可以在需要用到的时候再查文档嘛
- 常用的切入点表达式:
- Advice的综合应用
- 前置通知的 xml 配置:
该通知对应的具体动作:
程序自然运行到切点处要执行的方法:
最终运行的结果: - 其他的就跟前置通知操作过程差不多了啦
- 啊对还有一个特殊的-Around advice :
其中,”obj = pjp.proceed();” 代表程序自然运行到切点处要执行的方法,然后我们就可以在它周围进行环绕,比如这样:
最后输出的结果为: - 另外还可以在通知里面使用参数
https://www.jianshu.com/p/ff8d0cd69a7e
- 前置通知的 xml 配置: