首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring的一些小结

2012-10-06 
Spring的一些总结一、1.spring依赖库*SPRING_HOME/dist/spring.jar*SPRING_HOME/lib/jakarta-commons/commo

Spring的一些总结
一、1.spring依赖库
   *SPRING_HOME/dist/spring.jar
   *SPRING_HOME/lib/jakarta-commons/commons-logging.jar
   *SPRING_HOME/lib/log4j/log4j-1.2.14.jar
    2.拷贝spring配置文件到src下(samples\jpetstore\war\WEB-INF\applicationContext.xml留住beans)
    3.拷贝log4j配置文件到src下(同上目录)

  *加提示:windows-Preferences-MyEclipse-Files and Editors-XML-XML Catalog-add-Key Type选中URI location选           中filesystem,找到dist\resources\spring-beans-2.0.xsd打开,Key Type改成Schema Location,Key后面           加上spring-beans-2.0.xsd

    4.在UserManager中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给我们
    5.让spring管理我们的对象创建和依赖,必须在spring配置中进行定义
    6.编写客户端
spring Ioc容器的关键点:
       *必须将被管理的对象定义到spring配置文件中
       *必须定义构造函数或setter方法,让spring将对象注入过来


二、1.spring的普通属性注入
      参见:spring文档3.3章节

     什么是属性编辑器,作用?
         *自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
         *如何定义属性编辑器?
            *继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java
            *将属性编辑器注册到spring中,参见:applicationContext-editor.xml
     
     依赖对象的注入方式,可以采用:
         *ref属性
         *<ref>标签
         *内部<bean>来定义

     如何将公共的注入定义描述出来?
         *通过<bean>标签定义公共的属性,指定abstract=true
         *具有相同属性的类在<bean>标签中指定parent属性

    2.spring Bean的作用域:
     
       scope可以取值:
            *singleton:每次调用getBean的时候返回相同的实例
            *prototype:每次调用getBean的时候返回不同的实例

    3.根据名称自动装配
      *default-autowire="byName"
      根据类型自动装配
      *default-autowire="byType"


三、spring对AOP的支持(采用Annotation的方式)

    1.spring依赖库
      *SPRING_HOME/dist/spring.jar
      *SPRING_HOME/lib/jakarta-commons/commons-logging.jar
      *SPRING_HOME/lib/log4j/log4j-1.2.14.jar
      ** SPRING_HOME/lib/aspectj/*.jar
    2.采用Aspect定义切面
    3.在Aspect定义Pointcut和Advice
    4.启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中
   
      注意:在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点,即Advice中通过方法名引用这个切入点

   AOP:
       *Cross cutting concern(横切性切入点)
       *Aspect(切面)
       *Advice(切入点的实现)
       *Pointcut(应用范围)
       *Joinpoint(执行的那个点,spring支持方法)
       *Weave(支入,advice应用的过程)
       *Target Object(目标对象)
       *Proxy(代理)
       *Introduction(增加方法)


    spring对AOP的支持(采用配置文件的方式)

    1.spring依赖库
      *SPRING_HOME/dist/spring.jar
      *SPRING_HOME/lib/jakarta-commons/commons-logging.jar
      *SPRING_HOME/lib/log4j/log4j-1.2.14.jar
      ** SPRING_HOME/lib/aspectj/*.jar
    2.配置如下:
      <aop:config>
           <aop:aspect id="security" ref="securityHandler">
                <aop:pointcut id="allAddMethod" expression="execution(* com.bjsxt.spring.UserManagerImpl.add*(..))"/>
                <aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
           </aop:aspect>
      </aop:config>


spring对AOP的支持

Aspect默认情况下不用实现接口,但对于目标对象(类),在默认情况下必须实现接口,如果没有实现接口必须引入CGLIB库

我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值、方法名等等。


1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3.如果目标对象没有实现接口,必须采用CGLIB库,spring会自动再JDK动态代理和CGLIB之间转换。


  如何强制使用CGLIB实现AOP?
       *添加CGLIB库,SPRING_HOME/cglib/*.jar
       *在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>


JDK动态代理和CGLIB字节码生成的区别?
      *JDK动态代理只能实现了接口的类生成代理,而不能针对类
      *CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final

热点排行