Spring框架专题:面试问题相关
Spring框架式一个开源框架,spring是2003年兴起的轻量级java框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来,它为了解决企业应用开发的复杂性二建立的,Spring基本使用的是JavaBean来完成以前之后EJB完成的事情。然而Spring用途不仅仅是服务器端的开发,从简单性和松耦合角度而言,任何Java应用都可以从spring中受益,简单来说,Spring是一个轻量级控制反转(IOC Inversion of control)和面向切面编程(AOP Aspect of programming)的容器框架
Spring包含六大模块:DAO、ORM、AOP、J2EE、WEB、CORE
Spring Dao:Spring提供了对JDBC的操作支持,例如JdbcTemplate 模板工具类
Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供了HibernateDaoSupport工具类,简化了hibernate操作。
Spring Web :spring提供了对Struts、springMvc的支持,支持web开发,与此同时spring自身也提供了基于MVC解决方案。
Spring Aop:Spring面向切面的编程,可以给某一层提供事务管理,例如service层添加事务控制。
Spring JEE:J2EE开发规范的支持,例如EJB。
Spring Core;提供IOC(inversion of control 控制反转)容器对象的创建和处理依赖对象关系。
IOC容器:就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器适合实例化、定位、配置应用程序中的对象以及建立这些对象的依赖。通常new一个对象,控制权在程序员手里,而“控制反转”是指new一个对象的工作交给了spring容器来做,在spring中BeanFactory是IOC容器的实际代表着。
DI(dependency injection 依赖注入):在容器创建对象后,处理对象的依赖关系。
依赖注入Spring的注入方式:
Set注入
静态工厂注入
构造方法注入
基于注解
1、Set注入:
控制层代码:
private OrderServiceImp orderService;
public void setOrderService(OrderServiceImp orderService) {
this.orderService = orderService;
}
Spring配置XML文件。其中配置声明OrderAction类存在属性OrderService。程式运行时,会将已经实例化的orderService对象调用setOrderService方式注入
2、构造器注入:
Private OrderService orderService
Public OrderAction(OrderService orderService){
This.orderService=orderService
}
Spring配置XML文件:
3.基于注解的方式(一直使用,草超级方便)
@Autowired
Private OrderService orderService
注解方式注入依赖注解:
@Component 把对象加入IOC容器,对象引用名称是一个类名,第一个字母小写
@Component(“name”) 把指定名称的对象没加入IOC容器
@Repository 主要用于标识加入容器的对象是一个持久层的组件(类)
@Service 主要用于标识加入容器的对象是一个业务逻辑层组件
@Controller 主要用于标识加入容器的对象是一个控制层组件
@Resource 注入属性(DI)会从容器中找对象注入到@Resource修饰的对象
@Autowired 注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上
三:Spring下面向切面编程(AOP)和事务管理配置
AOP是纵向编程,如业务1和业务2都需要一个共同的操作,预期在每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。在日常有订单管理、商品管理、资金管理、库存管理等业务,AOP把所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再有容器动态织入这些代码。
日志切面-授权切面-事务切面
AOP涉及名称:
切面(ASpect):其实就是共有功能的实现,如日至切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。
通知(Advice):是切面的具体实现。以目标方法为参照法点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5中。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,通常在通知中指定。
连接点:(JoinPoint) :就是程序正在运行过程中插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。
切入点:(PointCut)用于定义通知应该切入到那些连接点上。不同的通知通常需要切入到不同的连接点,这种精确的匹配是由切入点的正则表达式来定义的。
目标对象:(Target)就是那些即将切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码,所有的共有代码等待AOP容器切入。
代理对象:(Proxy)将通知应用到目标对象之后被动态创建的对象,可以理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者·而言是透明的,是程序运行过程的产物。
织入(weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译器、类装载期及运行期,当然不同的发生地点有着不同的前提条件。譬如发生在编译器的话,就要求有一个支持这种AOP实现的特殊编辑器,发生在类加载期,就要求有一个支持AOP实现的特殊类加载器,只能发生在运行期,则可以直接通过Java语言的反射机制与动态代理机制来动态实现。
Spring使用AOP配置事务管理三个部分组成,分别是DataSource、TransactionManage和代理机制三个部分。一般变化的只是代理机制这部分。DataSource、TransactionManage这两部分只是会根据访问方式有所变化,比如使用Hibernate进行数据访问,DataSource实际为SessionFactory,TransactionManage的实现为HibernateTransactionManager。
Spring事务配置的五种方式:每个Bean都有一个代理、所有Bean共享一个代理基类、使用拦截器、使用tx配置标签配置的拦截器、全注解
深度剖析AOP技术实现原理:AOP技术是建立在Java反射机制与动态代理机制之上的。业务逻辑组件在运行过程中,AOP容器会动态创建一个代理对象供使用者调用,该代理对象已经按Java EE程序员的意图将切面成功切入到目标方法的连接点,从而使切面的功能与业务逻辑的功能同时得以执行。从原理上讲,调用者直接调用的其实是AOP容器动态生成的代理对象,再由对象调用目标对象完成原始的业务逻辑处理,而代理对象则已经将切面与业务逻辑方法进行合成。