Spring框架IOC和AOP

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 控制反转)容器对象的创建和处理依赖对象关系。

  • Spring下IOC容器的DI(依赖注入dependency injection)

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方式注入

<bean name=”orderAction”class=com.pre.action.OrderAction>

     <property name=”orderService”ref=”orderService”></property>

</bean>

<bean name=”orderService”class=”com.pec.service.imp.OrderServiceImpl”></bean>

2、构造器注入:

Private OrderService orderService

Public OrderAction(OrderService orderService){

This.orderService=orderService

}

Spring配置XML文件:

<bean name=”orderAction” class=”com.pec.action.OrderAction”>

<constructor-arg ref=”orderService”></constructor-arg>

</bean>

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配置标签配置的拦截器、全注解

  1. 使用tx标签配置的拦截器:

深度剖析AOP技术实现原理:AOP技术是建立在Java反射机制与动态代理机制之上的。业务逻辑组件在运行过程中,AOP容器会动态创建一个代理对象供使用者调用,该代理对象已经按Java EE程序员的意图将切面成功切入到目标方法的连接点,从而使切面的功能与业务逻辑的功能同时得以执行。从原理上讲,调用者直接调用的其实是AOP容器动态生成的代理对象,再由对象调用目标对象完成原始的业务逻辑处理,而代理对象则已经将切面与业务逻辑方法进行合成。

展开阅读全文

没有更多推荐了,返回首页