spring的两大利器IOC和aop,谈谈对它们的理解

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实现

 

spring的两大利器IOC和aop,谈谈对它们的理解_第1张图片

 

Controller:

spring的两大利器IOC和aop,谈谈对它们的理解_第2张图片

测试一下:

spring的两大利器IOC和aop,谈谈对它们的理解_第3张图片

spring的两大利器IOC和aop,谈谈对它们的理解_第4张图片

 

通过打印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,

spring的两大利器IOC和aop,谈谈对它们的理解_第5张图片

 

FactoryBean是一个bean,一个特殊的bean,相当于一个工厂可以生产一个bean的实例,内部getObject()就是生产一个bean的具体实现。spring 在和mybatis整合的时候原理用的是jdk的动态代理然后返回一个bean的实例,就是用factorybean产生的。

spring的两大利器IOC和aop,谈谈对它们的理解_第6张图片

 

 

你可能感兴趣的:(spring)