【郑州校区】JavaEE三大框架课堂笔记之Spring-day09(上)
Bean的属性注入在spring中bean的属性注入有两种 构造器注入Setter方法注入关于ref属性作用 使用ref来引入另一个bean对象,完成bean之间注入 集合属性的注入在spring中对于集合属性,可以使用专门的标签来完成注入例如:list set map properties等集合元素来完成集合属性注入. List属性注入如果属性是数组类型也可以使用list完成注入 Set属性注入 Map属性注入 Properties属性注入Java.util.Properties是java.utilsMap的实现类,它的key与value都是String类型. 名称空间p和c的使用Spring2.0以后提供了xml命名空间。 P名称空间 C名称空间 首先它们不是真正的名称空间,是虚拟的。它是嵌入到spring内核中的。 使用p名称空间可以解决我们setter注入时<property>简化 使用c名称空间可以解决我们构造器注入时<constructor-arg>简化 使用setter注入
在applicationContext.xml文件中添加p名称空间简化setter注入 使用c名称空间来解决构造器注入 在applicationContext.xml文件中添加c名称空间 注:如果c或p名称空间操作的属性后缀是”-ref”代表要引入另一个已经存在的bean,例如 SpElspring expression language 是在spring3.0以后的版本提供 它类似于ognl或el表达式,它可以提供在程序运行时构造复杂表达式来完成对象属性存储及方法调用等。 Spel表达式的格式 #{表达式} 示例1:完成bean之间的注入 示例2 支持属性调用及方法调用 Spring注解开发在spring中使用注解,我们必须在applicationContext.xml文件中添加一个标签 <context:annotation-config/>作用是让spring中常用的一些注解生效。 要使用contex名称空间,必须在applicationContext.xml文件中引入 完成bean注册操作@Component 测试时报错 原因:如果你使用的是spring3.x那么不会出现这个错误,如果使用的是spring4.x会报错,原因是缺少jar包。 导入jar后运行还有错误 我们在applicationContext.xml文件中使用了一个标签 <context:annotation-config />,它代表的是可以使用spring的注解,但是我们在类上添加的注解,spring不知道位置。 要解决这个问题,我们可以使用<context:component-sacn base-package=””> @Rpository 用于DAO层 @Service 用于service层 @Controller 用于表现层 对于我们的bean所处在的位置可以选择上述三个注解来应用,如果你的bean不明确位置,就可以使用@Component. 属性依赖注入1. 简单的属性注入 2. 复杂的属性注入 注意:如果要扫描多个包下的注解可以写成以下: 或 注意:@Value @Autowired它们可以修饰属性,也可以修饰setter方法,如果写在属性上,就不需要提供setter方法。 @Autowired它默认是根据类型进行注入。 如果与@Qualifier一起使用,就可以根据名称来进行注入。 我们也可以使用下面的方式来根据名称进行属性注入 其它注解@Scope它以描述bean的作用域。 它相当于init-method=”myInit 它相当于是destroy-method=”myDestroy” 注意:对于销毁的方法它只对bean的scope=singleton有效。 Spring在web开发中的应用1.,在web项目中要使用spring需要导入一个jar包 2.在web.xml文件中配置Listener 这个ContextLoaderListener它实现了ServletContextListener 在这个listener中,当服务器启动时,将ApplicationContext对象,其实是它的一个实现类 WebApplicationContext,对象存入到了ServletContext中。 3.我们还需要在web.xml文件中配置applicationContext.xml文件的位置 默认情况下会在WEB-INF目录 下查找applicationContext.xmls 如果applicationContext.xml文件不是在默认位置,我们可以在web.xml文件中配置 Classpath:applicationContext.xml 它代表的是在当前工程的类路径下(可以理解成是在src)下来查找applicationContext.xml文件。 contextConfigLocation它是在listener中声明的一个常量,描述的就是spring配置文件的位置。 Spring整合junit4测试Spring整合junit4可以方便我们的测试。 1. 需要导入一个spring-test.jar包 2. 可以在测试类上如下操作 Spring AOPAOP概述在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点,spring2.0之后整合AspectJ第三方AOP技术。 AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 主要功能日志记录,性能统计,安全控制,事务处理,异常处理等等 主要意图将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。 AOP与OOP区别 OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。 换而言之,OOD/OOP面向名词领域,AOP面向动词领域。 AOP相关术语目标对象target指的是需要被增强的对象,由于spring aop是通过代理模式实现,从而这个对象永远是被代理对象。 连接点(join point)所谓连接点是指那些被拦截到的点,在spring中这些点指的是方法,因为spring只支持方法类型的连接点 切入点(pointcut)表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方 简单说切入点是指我们要对哪些连接点进行拦截的定义 通知(advice)所谓通知是指拦截到连接点之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知 Advice 定义了在 pointcut 里面定义的程序点具体要做的操作 引介introduction引介是一种特殊的通知,在不修改类代码的前提下,introduction可以在运行期为类动态地添加一些方法或属性 切面aspect是切入点和通知的结合 织入weaving织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期,类装载期,运行期进行。 Spring采用动态织入,而aspectj采用静态织入 代理Proxy一个类被AOP织入增强后,就产生一个结果代理类 AOP底层实现AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOP。Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术) JDK动态代理在运行 ,在JVM内部动态生成class字节码对象(Class对象) Jdk动态代理只针对于接口操作 第一个参数:目标类的类加载器对象 第二个参数:目标类的实现接口的Class[] 第三个参数:InvocationHandler它是一个接口,它的作用是是代理实例的调用处理程序 实现的接口,接口中定义了一个方法 目标Target 代理工厂 CGLIB动态代理CGLIB(Code Generation Library)是一个开源项目 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类 如果你要单独使用CGLIB,那么需要导入cglib的jar包还需要一个asm相关jar包,但是spring框架的spring-core.jar包中已经集成了cglib与asm 注意:jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。 Cglib动态代理 setCallback传递的参数是Callback类型,我们使用的是MethodInterceptor 注意:cglib它可以为没有实现接口的类做代理,也可以为接口类做代理. 问题:spring采用的是哪一种动态机制: 如果目标对象,有接口,优先使用jdk动态代理 如果目标对象,无接口,使用cglib动态代理。 Spring AOP编程Spring的传统aop编程讲解的目的是为了更好的理解aop。 在传统的spring aop开发中它支持增强(advice)有五种: 1. 前置通知 目标方法执行前增强 org.springframework.aop.MethodBeforeAdvice 2. 后置通知 目标方法执行后增强 org.springframework.aop.AfterReturningAdvice 3. 环绕通知 目标方法执行前后进行增强 org.aopalliance.intercept.MethodInterceptor 4. 异常抛出通知 目标方法抛出异常后的增强 org.springframework.aop.ThrowsAdvice 5. 引介通知 在目标类中添加一些新的方法或属性(不讲解) org.springframework.aop.IntroductionInterceptor 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|