Spring Framework官网文档:
https://spring.io/projects/spring-framework
下载地址:https://repo.spring.io/release/org/springframework/spring/
优点:
IOC/AOP的学习重在学习注解开发,xml配置的方法 简单看下即可。
IoC控制反转(实现方法是依赖注入)
Inversion of Control
IOC容器:用于解耦,方便代码的修改,而不会由于改一个地方导致很多相关的地方都要改。
参考博客,便于理解IOC思想:https://segmentfault.com/a/1190000019280079
例子:
serviceImpl:
使用IOC前:
使用IOC之后:
依靠set动态注入的对象,来进行userDao的初始化;
有IOC后,不用再new对象,交给Spring来创建对象;
Test.java里:
增加多个impl之后,后面调取处选择即可
Hello Spring
class(entity):
beans.xml(类在里面注册):
main函数测试:
Spring配置(beans.xml)
- beans (上方)
- alias 别名,类似数据库的as
- import (多人开发时产生多个beans.xml,运行时用总的就可以了)
依赖注入 DI
构造器注入(见上方代码) c命名空间注入
Set方式注入(重点) p命名空间注入
bean对象的创建+属性的注入==》依赖容器
bean.xml手动装配:(老方法)
@Scope作用域(bean)
singleton单例【Spring默认】(对象全局唯一,所有创建的bean共享)
prototype原型(每一个bean都会产生自己的对象)(多线程可用)
对象的hashcode不一样
request 在请求中创建&生效;session在会话中活着;application在全局中活着;
Bean 隐式装配
Spring会在上下文中自动寻找,并自动给bean装配属性
Spring注解开发
做法:
1.预先配置(xml中配置是旧方法,新方法完全用config.java+@Configuration(含@Conponent)+@Bean来):
1)在beans.xml里面导入约束:(springframework)
2)beans.xml配置注解的支持:
指定要扫描的包:
3)要使用注解开发,必须保证aop的maven包导入了:
?
2.然后直接在domain属性上使用、或者在set方法上使用:
1)@Autowired自动装配Bean
@Autowired
private Dog dog;
2)@Component 说明Spring自动扫描整个包的bean
@Value 用于注入属性的值
3)@Conponent的几个功能一样的注解:
上面三个是和component都是一样的(IOC),表示某个类 注册到Spring容器中装备Bean。
表明有IOC:
JavaConfig
xml中配置是旧方法,新方法完全用config.java+@Configuration(含@Conponent)+@Bean来:
实体类包括其中的注解不变,
config.xml替换为config.java:
AOP
代理模式:
- 静态代理
- 动态代理(重点)
动态代理
动态代理(基于反射),代理的类是动态生成的,不是直接写好的
分为:基于接口 /基于类 的动态代理
需要了解2个类:
Proxy:是一个静态方法,用于创建动态代理类和实例
InvocationHandler 调用处理程序
准备面试的时候,再把“动态代理”仔细看下
AOP名词概念
https://blog.csdn.net/sggtgfs/article/details/85338011
横切关注点:
跨越多个模块的方法或功能,与我们的业务逻辑无关。
如:日志、安全、缓存、事务。。。
切面 Aspect:是一个类
Advice 通知 切面中要完成的 方法
切入点 PointCut:切面方法执行的地点
代理 proxy:目标对象被通知后创建的对象
使用Spring AOP需要 织入包 aspectjweaver
配置方式 实现AOP:
在?applicationContext.xml里:
说明:这里的aspect ref后面跟的是,横切关注点(例如log/secure/cache/transaction)
<aop:config>
可以多个切面: <aop:aspect ref=...> 此处写多个切入点: <aop:pointcut id="point3" expression="execution(* com.kuang.service.Impl.*(..))" 此处写多个Action(方法对应到切入点): <aop:before method="before" pointcut-ref="point3"> <aop:after method="after" pointcut-ref="point3"> <aop:b...> </aop:aspect ref=...>
Aspect切面里分层:
一层是切入点PointCut(执行点)
一层是Advice(执行方法)
注解实现AOP
注解实现的劣势是:没有像xml注册那样使用 "切入点+Advice"两层结构,导致切入点不能复用,可能会多次书写同样的切入点,导致不易管理;
但是注解真的很方便:在写Advice方法的时候就直接写上对应的切入点了。
Spring整合Mybatis事务
终极简化版:
SqlSessionDaoSupport
调用getSqlSession()得到SqlSessionTemplate
Spring声明式事务(交给容器管理事务,不会改变原有代码)
(事务的作用是保持数据ACID特性;要么都成功,要么都失败;)
关键是xml配置(之前已经写好了CRUD)
1.transactionManager
2.Advice(执行方法):
propagation = REQUIRED:如果当前没有事务,就新建一个事务;如果有事务就用当前事务;
3.PointCut(切入点):