1.BeanFactory和FactoryBean有什么区别
- BeanFactory:IoC容器顶层接口,给IoC容器提供了一套完整的规范。以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。
- FactoryBean:也是一个工厂类接口,用户可以通过该接口定制实例化Bean的逻辑,Spring自身就提供了70多个FactoryBean的实现,他们隐藏了一些实例化复杂Bean的细节,从而给上层应用带来便捷。
2.@Autowired注解和@Resource注解有什么区别
- Resource默认按 byName自动注入。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略.
- @Autowired同样实现了bean注入功能。只不过他是默认按照byType进行装配,如果匹配类型是多个直接抛出异常、当然这个问题是可以解决的那就是@Qualifier注解进行匹配
3.谈谈Spring中Bean的作用域
Spring中Bean的作用域指的是Bean在容器中的存在范围,Spring框架支持以下五种Bean的作用域 :
- singleton:在每个Spring IoC容器中只有一个Bean实例。
- prototype:一个Bean的定义可以有多个实例。
- request:在Web应用中,为每个HTTP请求创建一个Bean实例。
- session:在Web应用中,为每个HTTP会话创建一个Bean实例。
- global session:在基于portlet的Web应用中,为每个全局HTTP会话创建一个Bean实例。
这些作用域都是通过在Bean定义中使用作用域属性来指定的。如果没有指定作用域,则默认为singleton。
4.谈谈你对ioc的理解
ioc可以直译为控制反转,传统的应用程序组件的创建、组装、销毁都是要程序员控制的,这样子维护这些对象就很耗费程序员精力,在IoC模式下,控制权发生了反转,所有组件不再由程序员创建和配置,而是由IoC容器负责,也就是说程序员不在new一个对象,而是注入一个对象因此,IoC又称为依赖注入(DI:Dependency Injection),它解决了一个最主要的问题:将组件的创建+配置与组件的使用相分离,并且,由IoC容器负责管理组件的生命周期。
Soring有两个核心接口,BeanFactory和ApplicationContext,都可以当做 ioc容器。区别在于,BeanFactory的实现是按需创建,即第一次获取Bean时才创建这个Bean,而ApplicationContext会一次性创建所有的Bean。实际上,ApplicationContext接口BeanFactory接口的子类,并且,ApplicationContext提供了一些额外的功能,包括国际化支持、事件和通知机制等。通常情况下,我们总是使用ApplicationContext,很少会考虑使用BeanFactory。
因为大部分情况都是使用ApplicationContext,因此我就讲一下它的工作流程吧。首先@ComponentScan注解会扫描指定包下面所有的Class文件,底层就是Java的ClassLoader机制可以在指定的Classpath中根据类名加载指定的Class,创建bean的三种方法:第一个是@Component,第二个是@Configuration+@Bean,FactoryBean的工厂模式,当一个Bean实现了FactoryBean接口后,Spring会先实例化这个工厂,然后调用getObject()创建真正的Bean。Spring创建Bean默认使用Singleton,也就是单例。
5.谈谈你对AOP的理解
AOP也叫面向切面编程,是基于动态代理来实现的,通过代理原始类来增加额外功能,我们可以将额外功能一次定义然后配合切面达到多次使用的效果,比如记录日志,事物管理等等,提高了代码复用性,开发效率。
AOP有五类通知,通知就是在目标方法执行前或者执行后要做的动作:
- 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
- 正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
- 异常返回通知[After throwing advice]:在连接点抛出异常后执行。
- 返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
- 环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
spring使用了两种代理机制:
第一种也就是JDK自带的动态代理
1.JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,也就是代理实例,在代理实例中会织入代码,它是基于接口的。
第二种也就是Cglib的动态代理
2.Cglib是动态代理采用底层的字节码技术,在运行时创建子类的代理对象。Cglib是基于继承父类生成的代理类.
在Spirng当中动态代理的使用
1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理来实现AOP
2.如果目标对象实现了接口,也可以强制使用CGlib来实现AOP
3.如果目标对象没有实现接口,必须采用Cglib库,Spirng会自动在JDK和CGlib用切换
JDK和动态代理和CGlib字节码的生成区别?
1.JDK动态代理制能对实现了接口的类生成代理,而不是针对类
2.CGLIB是针对类实现代理,主要对指定的类生成一个子类,覆盖其中的方法,添加额外功能,因为是继承,所以该类方法不能用final来声明.