spring源码
参观工厂内部,学会找入口
IOC
1、定位资源(定位查找配置文件)
2、加载(已经找到配置文件)
3、注册(已经记载好配置文件解析出来,并封装成BeanDefintion)
对于bean的说明而已,bean还没真正的产生
spring中do开头的都是干活的
beanFactory和FactoryBean:
写在后面的是主语,
是由spring工厂生产出的bean,所以叫FactoryBean,不是你自己new出来的
依赖注入:
1、读取DeanDefinition中信息,获取其依赖关系
2、实例化(代理对象)
3、注入:设值
createBeanInstance,创建实例,放入IOC容器中
populateBean 注入方法
list,map,父类,接口
如果使用了演示,依赖注入这个动作发生在调用getBean方法的时候
启动的时候放在容器中,用的时候只要取就可以了
ClassPathApplication,本身就是一个工厂,这个是我们自己new出来的,就意味着,我们可能再多线程环境中使用
beanFactory针对于genBean的动作而言
FactoryBean是对bean进行管理以及维护,代理以后的实例
代理以后,相当于是把类名都改了。
Bean IOC 收到实现FactoryBean
BeanPostProcessor 有后置处理,也有前置处理
类似于模板模式(有一部分自己实现,得到一个回调)
为了AOP的实现做了铺垫,有了基础了
最核心的2个jar包:spring-bean,spring-context
spring-bean定义的是规范
spring-context 工厂的实现,DI的实现
core是最顶层的,所有的项目都要依赖
spring-aop是spring-aspect的上层建筑
定义接口
targetClass MethodInvoiker
从IOC中取得代理以后的对象,对每个方法进行重写
加入一些切面调用所需要的东西
do开头的方法都是具体干活的方法
AOP通知
触发器,tigger
主动调用(专门监听的定时器)
自动注入,注解编程@AutoWring
自动识别,自动转型
声明的是接口,自动找到该接口的实现类(前提是接口只有一个实现类)
根据BeanId来自动装配
spring的单例是用map实现的,一定要保证线程安全,spring中默认都是单例,除非手动声明scope,Prototype:每get一次,就new一个
spring IOC中,判断,如果被代理的类实现了接口,么默认用jdk代理,如果被代理的对象没有实现任何接口,那就默认使用cglib
springAOP如何制定规则?
一个切面,就代表着N个bean的一个集合
这N个bean他们都拥有共同点,所以他们组成一个切面
事务管理的时候,就用到了切面的定义
切面在代码中比较抽象
bean切面是可以交叉的
归类了
在切面中bean他们之间的关联点
事物管理为例
异常可以自定义,只会监听sql异常
利用了IOC中的后置处理
切点:
方法拦截器,这是在AOP里独有的
在切面中,耨一个具体的bean中的某一个具体的方法
目标对象:
先包名再类名,再找方法
AOP代理:
jdk的proxy,CGLIB
持有被代理对象的引用,在调用被代理对象的方法时,在调用之前加点东西,在调用之后加点东西,中间就用我们自己保存的对象引用去调用具体方法
目标对象就是代理对象所持有的引用
通知机制:
前置后置使用了模板方法模式
具体的事情在这个切面里面定义
方法调用之前做什么?调用之后做什么,跑了异常做什么,得到一个通知
APO的存在是为了解耦
AOP到底能干嘛?
权限,缓存,调试,日志,事物,监听,拦截器,内容传递
监听的缓存结果,第一次调用的时候,就把结果存到缓存中,就不再调用那个实际的方法
直接调用before就返回去了
做事物代理的时候
tracationManager来管理事物操作(切面)
DataSource,sessionFactory(Datasource)
DataSource 包含了连接的信息
通过连接点是可以获取到方法(切点)具体操作哪个DataSource
通过切面通知类型,去执行DataSource的功能方法
完全裸露,一丝不挂
具体的方法就是切点
如何定义一个具体的方法
权限修饰符(public/private/protected)可省略
参数列表的不同和什么有关?
1、参数的个数
2、参数的顺序
3、参数的类型
跟参数的名字没有任何关系
如果一个方法用final修饰了,就意味着这个方法不能被重写
也就意味着我们的子类不能对这个方法进行扩展
代理是无法实现的
返回值(void/自定义类型,用*表示返回任意类型,必填) 属于哪个包哪个类.方法名称(参数列表) throws 异常类型
借鉴了URL的语法 cd(change directory)当前目录cd …
execution(public * )