您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Spring个人学习笔记
Spring_beginningSpring最常用的特性利用Spring来创建对象(JavaBean工厂)利用Spring构建业务逻辑层管理依赖关系适应需求变更利用Spring创建数据访问对象(DAO)利用Spring进行事务处理环境搭建1、spring依赖库*SPRING_HOME/dist/spring.jar*SPRING_HOME/lib/jakarta-commons/commons-logging.jar*SPRING_HOME/lib/log4j/log4j-1.2.14.jar2、拷贝spring配置文件到src下applicationContext.xml3、拷贝log4j配置文件到src下log4j.properties4、在UserManagerImpl中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给我们5、让spring管理我们的对象创建和依赖,必须在spring配置中进行定义beanid=userDao4MySqlImplclass=com.bjsxt.spring.dao.UserDao4MySqlImpl/beanid=userDao4OracleImplclass=com.bjsxt.spring.dao.UserDao4OracleImpl/beanid=userManagerclass=com.bjsxt.spring.manager.UserManagerImpl!--构造方法注入constructor-argref=userDao4OracleImpl/--!--这种依赖关系,被放到了配置文件中,这样,只要需求有变更,只需要修改这种依赖关系即可,java代码本身不用任何变更--set方法注入propertyname=userDaoref=userDao4OracleImpl//bean6、编写客户端//获取BeanFactoryBeanFactoryfactory=newClassPathXmlApplicationContext(applicationContext.xml);//从容器中获取userManager对象UserManageruserManager=(UserManager)factory.getBean(userManager);userManager.save(伟超,1234);springIoc容器的关键点:*必须将被管理的对象定义到spring配置文件中*必须定义构造函数或setter方法,让spring将对象注入过来只需改动ApplicationContext.xml的配置,即可实现实际功能的切换IOC/DI控制反转(InversionofControl,IoC)与依赖注入(DependencyInjection)由容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫“控制反转”或“依赖注入”以上代码,已清楚阐述IOC/DI出现的原因,以及IOC的基本原理Spring框架的基本思想就是IOC/DISpring就是一个IOC容器IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想依赖注入的类型构造器注入通过类的构造方法注入依赖关系设值方法注入通过类的setter方法注入依赖关系第三种:接口注入(不常用)定义一个注入接口,在需要注入的类中实现此接口,由于这种方法具有侵入性,所以不常用2.Injection2.1spring的普通属性注入参见:spring文档3.3章节2.2什么是属性编辑器,作用?2.2.1自定义属性编辑器自定义属性编辑器:spring配置文件中的字符串转换成相应的对象进行注入心得:从此处可以看出,spring里面输入的都是字符串,但是可以更根据POJO设置的类型做相应的转换spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器2.2.2如何定义属性编辑器?①继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.javaSimpleDateFormatsdf=newSimpleDateFormat(format);setValue(d);②将属性编辑器注册到spring中,参见:applicationContext-editor.xmlbeanid=customEditorConfigurerclass=org.springframework.beans.factory.config.CustomEditorConfigurerpropertyname=customEditorsmapentrykey=java.util.Datebeanclass=com.tongji.spring.UtileDatePropertyEditorpropertyname=formatvalueyyyy/MM/dd/value2.3依赖对象的注入方式*ref属性propertyname=bean3ref=bean3/*ref标签propertyname=bean4refbean=bean4/*内部bean来定义如何将公共的注入定义描述出来?*通过bean标签定义公共的属性,指定abstract=truebeanid=obstractbeanabstract=truepropertyname=idvalue=1000/propertyname=namevalue=Jack//bean*具有相同属性的类在bean标签中指定其parent属性beanid=bean3parent=obstractbeanclass=com.tongji.spring.Bean3propertyname=passwordvalue=123/propertyname=namevalue=Tom//beanbeanid=bean4parent=obstractbeanclass=com.tongji.spring.Bean4/参见:applicationContext-other.xml2.4springBean的作用域:scope可以取值:*singleton:每次调用getBean的时候返回相同的实例*prototype:每次调用getBean的时候返回不同的实例3Spring对AOP(AspectOrientedProgramming)的支持3.1AOP相关AOP的关注点是Crosscuttingconcern,比如下面的检查安全性,在通过配置关注点,可以不影响主程序,Aspect包含Pointcut(切入点注册)和advice(具体怎么切、实现)3.2采用Annotation的方式3.3.1spring依赖库*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/*.jarSecurityHandler.java(2、3、4)3.3.2采用Aspect定义切面@AspectpublicclassSecurityHandler{@Pointcut(execution(*add*(..)))privatevoidallAddMethod(){};@Before(value=allAddMethod())privatevoidcheckSecurity(){System.out.println(----------checkSecurity()---------------);}}3.3.3在Aspect定义Pointcut和Advice/***定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,*该方法只是一个标识*Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)*/@Pointcut(value=execution(*add*(..)))privatevoidallAddMethod(){};/***定义Advice,标识在那个切入点何处织入此方法*/@Before(value=allAddMethod())privatevoidcheckSecurity(){System.out.println(----------checkSecurity()---------------);}3.3.4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中aop:aspectj-autoproxy/beanid=sercurityHandlerclass=com.bjsxt.spring.SecurityHandler/beanid=userManagerclass=com.bjsxt.spring.UserManagerImpl/即Advice中通过方法名引用这个切人点Client.javaUserManageruserManager=(UserManager)factory.getBean(userManager);AOP://这两个方法执行之前就会执行advice;userManager.addUser(张三,123);userManager.deleteUser(123);*Crosscuttingconcern*Aspect*Advice*Pointcut*Joinpoint*Weave*TargetObject*Proxy*Introduction3.3采用静态配置文件aop:configaop:aspectid=sercurityref=sercurityHandleraop:pointcutid=allAddMethodexpression=execution(*com.bjsxt.spring.UserManagerImpl.add*(..))/aop:beforemethod=checkSecuritypointcut-ref=allAddMethod//aop:aspect/aop:config3.4JointPoint参数介绍Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口,如果没有实现接口必须引入CGLIB库我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得参数值、方法名等等privatevoidcheckSecurity(JoinPointjp){Object[]args=(Object[])jp.getArgs();3.5JDK动态代理和CGLIB字节码生成(弱)1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换如何强制使用CGLIB实现AOP?*添加CGLIB库,SPRING_HOME/cglib/*.jar*在spring配置文件中加入aop:aspectj-autoproxyproxy-target-class=true/JDK动态代理和CGLIB字节码生成的区别?*JDK动态代理只能对实现了接口的类生成代理,而不能针对类*CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法最好不要声明成finalimportjava.lang.reflect.InvocationHand
本文标题:Spring个人学习笔记
链接地址:https://www.777doc.com/doc-4970081 .html