1.简要介绍一下Spring框架
Spring是一个轻量级框架,设计原则是非侵入性的,核心是IOC容器和AOP模块。
通过IOC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。
IOC(控制反转)是一种编程思想,主要用来管理控制对象的生命周期和对象与对象之间的关系,通过配置文件注入,更好实现对象与对象之间的解耦。
控制的是对象的创建和销毁,即控制对象的整个生命周期;反转则表示,我们之前常用new来创建对象,现在只需要将对象的控制权交给IOC容器,由它来创建管理控制对象即可。
IOC工作原理:(工厂模式加反射机制)
IOC实现了工厂模式;通过读取application.xml配置文件中<bean>标签下的类,通过构造方法或者set方法注入到IOC容器中,产生BeanFactory,BeanFactory再通过getBean方法获取对象。
IOC的一个重点是:
在系统运行中,动态的向某个对象提供它所需要的其他对象。而这一点是通过DI(依赖注入)实现的。
2.Spring 依赖注入实现方式有四种:
1.接口注入(由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。);
2.setter方法注入(容器通过调用无参构造器或者无参static工厂方法,实例化bean之后,调用该bean的setter方法实现);
3.构造方法(容器通过触发一个类的构造器实现,该类有一系列参数,每个参数代表一个对其他类的依赖。);
4.注解注入(在代码中加入@Autowired(默认按类型装配)或者@Resource(默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配)等注解实现,并且需要在application.xml配置文件中配置一段特定的模版代码:)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 开启注解式事务支持 -->
<tx:annotation-driven transaction-manager="myTransaction"/>
</beans>
这里引申出来一个新问题:
3.setter方法和构造方法的区别
首先:setter方法可以将依赖部分注入,而构造方法则是将依赖全部注入;
其次:构造方法注入被称为创建实例的第一选项,即:如果为同一属性提供Setter和构造方法注入,Setter注入将覆盖构造方法注入。但是构造方法注入不能覆盖setter注入值。
最后:对于构造方法注入,当出现A和B对象相互依赖(循环依赖):A依赖于B,B也依赖于A。此时创建对象A或者B时,Spring会抛出ObjectCurrentlyInCreationException
。所以Spring可以通过setter注入,解决循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。
总结:setter方法注入和构造方法注入都可用,但是最好的解决方案就是:采用setter注入实现可选依赖,使用构造注入实现强制依赖。
AOP(面向切面编程)是对OOP(面向对象编程)的一种补充。用于将那些与业务逻辑无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,即“切面(Aspect)”。减少了系统中的重复代码,降低了模块之间的耦合度,同时也提高了系统的可维护性。一般用于日志记录、事务处理、异常处理、安全控制等。
AOP采用动态代理实现,而动态代理又是通过反射来完成(反射:在系统运行状态中,对于任意一个类都能够知道它的所有属性和方法;对于任意一个对象,都能调用其任意的方法和属性。这种动态的获取信息及动态调用对象方法的功能称为Java的反射机制。)
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。
4.Spring提供了五种类型通知:
(1)<aop:before>(前置通知)
在目标方法被调用之前调用通知;
(2)<aop:after>(后置通知)
在目标方法完成之后调用通知;
(3)<aop:after-returning>(正常返回通知)
在目标方法成功执行之后调用通知;
(4)<aop:after-throwing>(异常返回通知)
在目标方法抛出异常后调用通知;
(5)<aop:around>(环绕通知)
在目标方法被调用前后调用通知;
(5.Bean的生命周期:)
6.Spring中bean的scope
目前scope的取值有五种:
(1)singleton (单例-默认): 在Spring IOC 容器中只有一个实例,在初始化IOC容器的时候被创建。
(2)prototype (原型): 在Spring IOC 容器中有多个实例,在使用到此对象时被创建。
(3)request : 每HTTP 请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的request。
(4)session : 在一个HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的Session。
(5)global session : 在一个全局的HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效,相当于Servlet中的Application。
7.Spring注入bean方式:
(1)@ComponentScan + @Component
(2)@Configuration + @Bean
(3)@Import 配合接口进行导入
(4)使用FactoryBean
(5)实现BeanDefinitionRegistryPostProcessor进行后置处理
有三种方式为Spring容器声明Bean:(1)基于XML配置文件<bean>标签;(2)基于注解配置@service...;(3)基于JAVA配置(configuration@bean)
8.Spring基于xml注入bean有四种方式:
(1)setter方法注入;
(2)构造方法注入;
(3)静态工厂方法注入(可以直接通过类调用);
(4)实例工厂方法注入(需要有一个实例对象,才能调用它的工厂方法)
详细可参考【转载】: