Spring核心技术之Ioc和AOP

1、Spring应用环境的配置:
 1. 在classpath中添加如下包:
    1) SPRING_HOME/dist/spring.jar、
    2) SPRING_HOME/lib/jakarta-commons/commons-logging.jar
    3) SPRING_HOME/lib/log4j/log4j-1.2.xx.jar
 2.在classpath中添加Spring的配置文件:applicationContext.xml
    在SPRING_HOME/samples/jpetstore/war/WEB-INF目录下有样板文件。 spring

2、IoC容器:
 1. IoC概念:反向控制、控制反转。对象不须要主动去查找依赖类的实例。而是由其它应用给它注入。
    DI:依赖注入。
 2. Spring对IoC的支持:Spring 提供了BeanFactory和ApplicationContext这两种IoC容器,来帮助你管理Bean、Bean之间的依赖关系以及Bean的生命周期。 express

3、Spring中IoC:
 1. Bean装配:在Spring配置文件中用<bean>标记来装配一个Bean.
    <bean id="Bean在Spring容器中的惟一标识" class="Bean类的全限定名">...</bean> 编程

 2. 用setter方法注入它的依赖类:
    1) 在Bean中针对依赖类属性添加一个setter方法。
    2) 在Bean的配置中经过<bean>标记的子标记<property>来注入这个属性。注入的能够是值,也但是容器中另外一个Bean的引用。
    <bean id="..." class="...">
       <property name="属性名" value="值" />
       <property name="属性名" ref="另外一个bean的标识" />
    </bean> 安全

 3. 用构造器注入它的依赖类: session

 4. 自动装配:<bean>标记有一个autowire属性来指定自动装配的方式。建议少用。
   1) byName 2) byType 3) coustructor 4) autodetect app

 5. 指定bean的生存范围:<bean>标记有一个scope属性来指定:
   1) sigleton:一个Spring容器一个实例(默认值)
   2) prototype:使用一次就建立一个实例
   3) request、session、global-session :在Web ApplicationContext中才有效。 框架

 6. 指定Bean的初始化和销毁: 使用<bean>标记的如下两个属性:
  1) init-method
  2) destroy-method 模块化

 7. 装配Bean的继承:使用<bean>标记的parent属性来指定它的父类Bean的标识。
    默认状况下,父类Bean的属性会使用父类Bean的装配。子类的属性使用子类的。能够在子类中对父类的属性进行从新装配。 this

4、AOP:面向切面编程
  1.AOP:把交叉功能模块化,把应用服务和业务逻辑彻底分离。
  2.术语:
     a) 切面(Aspect):就是指你要实现的交叉功能。如:日志记录、事务管理、安全验证()。
     b) 链接点(Joinpoint):应用程序执行过程当中能够插入切面的地点。如某方法调用时或者处理异常时。Spring只支持方法链接点
     c) 通知(Advice):在特定的链接点,AOP框架要执行的动做。 切面的功能被叫作通知。通知有各类类型,其中包括“around”、“before”和“after”等。如:向日志文件写日志、开启事务、提交事务。
     d) 切入点(Pointcut):定义了须要注入advice的位置。一般使用一些表达式来匹配链接点。
     e) 目标对象(Target Object):被一个或者多个切面所通知的对象。
     f) 代理对象(Proxy): 向目标对象应用通知以后被建立的对象。 spa

     g) 织入(Weaving):把切面应用到目标对象来建立新的代理对象的过程。Spring的切面是在程序运行的某个时刻被织入的。

  3.要使用Spring的完整AOP功能,须要添加:cglib包,AspectJ的包(2个)。
  4. 配置文件方式实现AOP
    1) 定义一个切面类。这个类中定义各个通知方法。声明到Spring的配置文件中:
 <bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
 <aop:config>
   <!-- 配置一个切面 -->
   <aop:aspect id="logAspect" ref="logAspectBean">
     ...
   </aop:aspect>
 </aop:config>
    2) 定义切入点:经过一个AspectJ的切入点表达式来定义选择哪些类的哪些方法须要切入通知。
 <bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
 <aop:config>
   <!-- 配置一个切面 -->
   <aop:aspect id="logAspect" ref="logAspectBean">
     <!-- 定义切入点 -->
     <aop:pointcut id="allMethod" expression="execution(* com.qiujy.service.*.*(..))"/>
         ...
   </aop:aspect>
 </aop:config>


    3) 声明通知:
  <bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
  <aop:config>
     <!-- 配置一个切面 -->
     <aop:aspect id="logAspect" ref="logAspectBean">
         <!-- 定义切入点 -->
         <aop:pointcut id="allMethod" expression="execution(* com.qiujy.service.*.*(..))"/>
         <!-- 配置通知 -->
         <aop:before method="start" pointcut-ref="allMethod" />
         <aop:after-returning method="end" pointcut-ref="allMethod"/>
         <aop:after method="back" pointcut-ref="allMethod"/>
         <aop:after-throwing method="exception" pointcut-ref="allMethod"/>
     </aop:aspect>
  </aop:config>

 

  5. Annotation方式实现AOP
    1) 配置Spring对AspectJ注解的支持:<aop:aspectj-autoproxy/>
    2) 使用注解定义切面、切入点、通知:
@Aspect  //声明一个切面类
public class LogAspect {
 private Log log = LogFactory.getLog(this.getClass());

 //定义了一个切入点(使用表达式来选择链接点)  @Pointcut("execution(* com.qiujy.service.*.*(..))")  private void bbb(){}    //声明前置通知  @Before("execution(* com.qiujy.service.*.add*(..))")  public void start(JoinPoint call) {      String className = call.getTarget().getClass().getName();   String methodName = call.getSignature().getName();      log.info(className + "类的" + methodName + "方法开始了");  }  //声明返回后通知  @AfterReturning("bbb()")  public void end() {   log.info("方法正常结束了");  }    //声明方法退出后通知  @After("bbb()")  public void back(){   log.info("方法返回了");  }    //声明异常抛出后通知  @AfterThrowing("bbb()")  public void exception() {   log.info("方法执行出异常了");  } }

相关文章
相关标签/搜索