尚学堂Spring笔记.docx

上传人:b****5 文档编号:7643002 上传时间:2023-01-25 格式:DOCX 页数:22 大小:24.06KB
下载 相关 举报
尚学堂Spring笔记.docx_第1页
第1页 / 共22页
尚学堂Spring笔记.docx_第2页
第2页 / 共22页
尚学堂Spring笔记.docx_第3页
第3页 / 共22页
尚学堂Spring笔记.docx_第4页
第4页 / 共22页
尚学堂Spring笔记.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

尚学堂Spring笔记.docx

《尚学堂Spring笔记.docx》由会员分享,可在线阅读,更多相关《尚学堂Spring笔记.docx(22页珍藏版)》请在冰豆网上搜索。

尚学堂Spring笔记.docx

尚学堂Spring笔记

一、锲子...2

二、环境...2

三、环境搭建...2

四、关键技术...2

Ioc控制反转...2

AOP(面向切面编程)...3

spring对AOP的支持(采用Annotation的方式)...3

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

spring对AOP的支持(关于接口)...5

spring对AOP的支持(关于接口)二...6

Autowrire(自动装配)...6

根据名称自动装配...6

根据类型自动装配...6

Injection(依赖注入)...7

Proxy(代理)...9

静态代理...9

动态代理...10

springBean的作用域...11

五、整合...11

Spring+Hibernate.11

采用编程式事务...11

采用声明式事务...12

Spring+Struts.14

spring+struts的集成(第一种集成方案).14

spring+struts的集成(第二种集成方案).16

Spring+Struts+Hibernate(SSH)...17

六、写在最后...17

 

 

 

 

 

 

 

 

 

 

一、锲子

在前一段时间内学习了一些Spring的知识,感觉还是需要整理一下自己的东西,不然我感觉很是容易遗忘。

二、环境

本次学习用到了一些软硬件环境如下:

1.      MyEclipseEnterpriseWorkbench7.0Milestone-1(MyEclipse7.0M1)

2.      Spring2.5

3.      Struts1.2

4.      Hibernate3.2

5.      其他(SVN等)

三、环境搭建

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配置文件(applicationContext.xml)到src下

3、拷贝log4j配置文件(log4j.properties)到src下

提示:

上面的一些jar包如果在现在的MyEclipse环境里可以通过添加对Spring的支持自动添加,上面的一些配置文件都可以再Spring官方下载的Spring包中的例子程序中找到相应的一些文件,修改后就可以使用

四、关键技术

Ioc控制反转

springIoc容器的关键点:

   *必须将被管理的对象定义到spring配置文件中

   *必须定义构造函数或setter方法,让spring将对象注入过来

 

      

      

--构造方法注入-->

--set方法-->

       

 

后面通过读取配置文件,并新建工厂,通过工厂来获得bean

 

BeanFactoryfactory=newClassPathXmlApplicationContext("applicationContext.xml");

UserManageruserManager=(UserManager)factory.getBean("XX");

 

AOP(面向切面编程)

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定义切面

 

2、在Aspect定义Pointcut和Advice

 

4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中

 

注意:

在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点

即Advice中通过方法名引用这个切人点

 

AOP一些关键技术:

   *Crosscuttingconcern

   *Aspect

   *Advice

   *Pointcut

   *Joinpoint

   *Weave

   *TargetObject

   *Proxy

   *Introduction

 

注意使用AOP的时候一定要添加相应的类库(jar包)

建一个Annotations的类,然后通过添加Spring对AOP的支持,也就是在Spring的配置文件中加入

aspectj-autoproxy/>

就可以了

 

代码如下

packagecom.bjsxt.spring;

 

importorg.aspectj.lang.annotation.Aspect;

importorg.aspectj.lang.annotation.Before;

importorg.aspectj.lang.annotation.Pointcut;

 

/**

 *定义Aspect

 *@authorAdministrator

 *

 */

@Aspect

publicclassSecurityHandler{

        

        /**

         *定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,该方法只是一个

         *标识

         *

         *Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)

         */

        @Pointcut("execution(*add*(..))||execution(*del*(..))")

        privatevoidallAddMethod(){};

        

        /**

         *定义Advice,标识在那个切入点何处织入此方法

         */

        @Before("allAddMethod()")

        privatevoidcheckSecurity(){

                  System.out.println("----------checkSecurity()---------------");

        }

        

}

 

客户端代码不变

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、配置如下

   

config>

      

aspectid="security"ref="securityHandler">

          

pointcutid="allAddMethod"expression="execution(*com.bjsxt.spring.UserManagerImpl.add*(..))"/>

          

beforemethod="checkSecurity"pointcut-ref="allAddMethod"/>

      

aspect>

   

config>      

 

spring对AOP的支持(关于接口)

spring对AOP的支持

 

Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口

如果没有实现接口必须引入CGLIB库

 

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

参数值、方法名等等

 

代码

packagecom.bjsxt.spring;

 

importorg.aspectj.lang.JoinPoint;

 

publicclassSecurityHandler{

   

   privatevoidcheckSecurity(JoinPointjoinPoint){

      Object[]args=joinPoint.getArgs();

      for(inti=0;i

          System.out.println(args[i]);

      }

      

      System.out.println(joinPoint.getSignature().getName());

      System.out.println("----------checkSecurity()---------------");

   }

   

}

客户端代码不变

 

spring对AOP的支持(关于接口)二

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

 

如何强制使用CGLIB实现AOP?

   *添加CGLIB库,SPRING_HOME/cglib/*.jar

   *在spring配置文件中加入

aspectj-autoproxyproxy-target-class="true"/>

   

JDK动态代理和CGLIB字节码生成的区别?

   *JDK动态代理只能对实现了接口的类生成代理,而不能针对类

   *CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法

    因为是继承,所以该类或方法最好不要声明成final  

      

Autowrire(自动装配)

根据名称自动装配

在Spring的配置文件头中加入default-autowire="byName"

其中bean里面的id一定与你的bean类名字一样,不然找不到并装配不了

根据类型自动装配

在Spring的配置文件头中加入default-autowire="byType",Spring默认装配方式

其中bean里面的id可以与你的bean类名字不一样,可以通过class来查找你需要注入的属性

 

Injection(依赖注入)

spring的普通属性注入   

   

   

什么是属性编辑器,作用?

   *自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入

   spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器

   

   *如何定义属性编辑器?

      *继承PropertyEditorSupport类,覆写setAsText()方法

 

packagecom.bjsxt.spring;

 

importjava.beans.PropertyEditorSupport;

importjava.text.ParseException;

importjava.text.SimpleDateFormat;

importjava.util.Date;

 

/**

 *java.util.Date属性编辑器

 *@authorAdministrator

 *

 */

publicclassUtilDatePropertyEditorextendsPropertyEditorSupport{

 

   privateStringformat="yyyy-MM-dd";

   

   @Override

   publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{     

      SimpleDateFormatsdf=newSimpleDateFormat(format);

      try{

          Dated=sdf.parse(text);

          this.setValue(d);

      }catch(ParseExceptione){

          e.printStackTrace();

      }

   }

 

   publicvoidsetFormat(Stringformat){

      this.format=format;

   }

 

}

 

      *将属性编辑器注册到spring中

      

--定义属性编辑器-->     

   

      

          

             

                 

                    

                 

             

          

      

   

   

依赖对象的注入方式,可以采用:

   *ref属性

   *标签

   *内部来定义

   

如何将公共的注入定义描述出来?

   *通过标签定义公共的属性,指定abstract=true

   *具有相同属性的类在标签中指定其parent属性

   

      

      

          

  

  

--     -->

      

         

  

  

 

 

Proxy(代理)

静态代理

静态代理只需写一个静态代理类就可以了

packagecom.bjsxt.spring;

 

publicclassUserManagerImplProxyimplementsUserManager{

   

   privateUserManageruserManager;

   

   publicUserManagerImplProxy(UserManageruserManager){

      this.userManager=userManager;

   }

   

   publicvoidaddUser(Stringusername,Stringpassword){

      checkSecurity();

      this.userManager.addUser(username,password);

   }

 

   publicvoiddeleteUser(intid){

      checkSecurity();

      this.userManager.deleteUser(id);

   }

 

   publicStringfindUserById(intid){

      returnnull;

   }

 

   publicvoidmodifyUser(intid,Stringusername,Stringpassword){

   }

   

   privatevoidcheckSecurity(){

   System.out.println("----------checkSecurity()---------------");

}

   

}

 

客户端代码

                  UserManageruserManager=newUserManagerImplProxy(newUserManagerImpl());

                userManager.addUser("张三","123");

 

 

 

动态代理

动态代理的话就要写一个Handler,通过Handler来生成管理类的代理

packagecom.bjsxt.spring;

 

importjava.lang.reflect.InvocationHandler;

importjava.lang.reflect.Method;

importjava.lang.reflect.Proxy;

 

publicclassSecurityHandlerimplementsInvocationHandler{

 

        privateObjecttargetObject;

        

        publicObjectnewProxy(ObjecttargetObject){

                  this.targetObject=targetObject;

                  returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),

                                                                                    targetObject.getClass().getInterfaces(),

                                                                                    this);

                                              

        }

        

        publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)

                           throwsThrowable{

                  checkSecurity();

                  Objectret=null;

                  try{

                           ret=method.invoke(this.targetObject,args);

                  }catch(Exceptione){

                           e.printStackTrace();

                           thrownewjava.lang.RuntimeException(e);

                  }

                  returnret;

        }

 

        privatevoidcheckSecurity(){

                  System.out.println("----------checkSecurity()---------------");

        }

        

}

 

 

客户端代码

 

                  SecurityHandlerhandler=newSecurityHandler();

                  UserManageruserManager=(UserManager)handler.newProxy(newUserManagerImpl());

                  

                  userManager.addUser("张三","123");

springBean的作用域

scope可以取值:

   *singleton:

每次调用get

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1