AOP
aop面向切面编程是什么呢
我理解的aop是面向规则编程,定一个规则然后所有的bean都要遵守这个规则。
1.Aspect切面
就是相当于把所有的bean里面的都会调用的方法A,这个方法A就相当于一个切面。可以在一个类中定义切点。
2.JoinPoint连接点
通常作用方法,获取获得这个方法的参数啊,返回值啊。
3.PointCut切入点
这个就比较好理解了,就是规则的作用域,你想让你这个规则作用与哪个类,哪个包下。
4.advice通知
一个方法执行前后还有异常都会产生一个通知。
通知又分好几种:
1.Before
方法执行前的通知,你可以在方法执行前做一些处理
2.After
放在执行后的通知,你可以在方法执行后做一些处理
3.AfterReturn
方法执行后得到返回值的通知。
4.AfterThrowing
方法发生异常的通知
5.Around
环绕通知,方法完成前后通知
下面通过demo演示
Aop实现
Controller:
测试一下:
通过打印log我们可以看出AOP已经起了作用。
那么AOP能实现什么功能呢?
事物管理(Translation)
日志
权限
缓存
还有很多,我们可以在方法前后做很多东西根据你的业务做一些自定义功能。
以上就是AOP
关于bean的作用域和生命周期:
bean的作用域默认是单例singleton
主要有:
singleton:单例的,线程安全,如果没有指定的话默认是单例
protetype:当你从beanFactory.getBean()方法取出一个bean的实例都会产生一个新的实例,每次getbean相当于new bean()
request:每次http请求都会创建一个bean的实例,
session:同一个session共享一个bean的实例,不同session,bean的实例不同
globalSession:一般作用于portlet环境。
bean的生命周期:
首先从getBean方法开始
先创建bean的实例
如果bean实现了beanNameAware,会调用setBeanName方法
如果bean实现了BeanClassLoaderAware,会调用setBeanClassLoader方法
如果bean实现了BeanFactoryAware接口,会调用setBeanClassLoader方法
调用了其他Aware接口的话,会实现对应的方法
如果spring容器中有加载BeanPostProcessor对象,会调用beanProcessBeforeInitaliztion的方法,这里增强bean功能,这里的原理是使用了代理功能。,
如果bean实现了InitAlizingBean接口,会执行afterPropertiesSet方法
如果bean配置了init-method,会执行相应的方法
如果spring容器中有加载后置处理器BeanPostProcessor对象,会调用beanProcessafterInitaliztion的方法,这里改变bean的行为和上面一个不一样,一个是bean初始化前和bean初始化后,这里的原理也是使用了代理功能。,
如果bean实现了disposableBean接口,会执行destory方法
如果Bean配置了destory-method方法,会执行相应的方法
以上
BeanFactory和FactoryBean的区别,这也是面试遇到的问题之一。
我认为:
首先beanFactory是一个bean工厂,配置注册使用bean,可以看到源码里面的getBean()方法就是从ioc容器取出bean,
FactoryBean是一个bean,一个特殊的bean,相当于一个工厂可以生产一个bean的实例,内部getObject()就是生产一个bean的具体实现。spring 在和mybatis整合的时候原理用的是jdk的动态代理然后返回一个bean的实例,就是用factorybean产生的。