黑马程序员技术交流社区
标题: 【郑州校区】三大框架之Bean的属性注入-9 [打印本页]
作者: 我是色色 时间: 2017-12-19 11:11
标题: 【郑州校区】三大框架之Bean的属性注入-9
本帖最后由 我是色色 于 2017-12-20 10:34 编辑
在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
经典的基于代理的AOP开发(了解)基本的jar包
1. bean
2. core
3. context
4. expression
5. aop
6. 需要aop联盟的依赖jar包
第一步:编写目标(target)
第二步增强(advice)
第三步在applicationContext.xml文件中配置
第四 测试
基于aspectJ切点传统开发第一步:在spring的配置文件中定义目标与通知
第二步:使用<aop:xxx>标签来完成切面与切点声明
注意1:需要在xml配置文件中导入aop声明
注意2:因为我们使用aspectj的切面声明方式 需要在导入aspectj的jar包
传统spring aop开发总结第一步:编写目标对象(target)
第二步:编写通知(advice)
传统的aop开发中,通知是需要实现指定接口。
第三步 在配置文件中配置切面(切面=切点+通知)
<aop:config>来声明要对aop进行配置
<aop:pointcut>它是用于声明切点(简单说就是对哪些方法进行拦截)
<aop:advisor> 定义传统的aop的切面,传统的aop切面它只能包含一个切点与一个增强
<aop:aspect>定义aspectj框架的切面.,它可以包含多个切点与多个通知
关于切点表达式写法这个语法源于aspectJ的语法,spring中aop开发,对aspectj不是完全支持,只支持部分语法。
在开发中使用的比较多的是execution语法.
关于execution语法常用:
1. execution(public * *()) 所有的public的方法
2. execution(* cn.itheima.aop.*(..)) 所有的aop包下的所有类的方法(不包含子包)
3. execution(* cn.itheima.aop..*(..)) 所有的aop包及其子包下的所有类的方法
4. execution(* cn.itheima.aop.IOrderService.*(..)) IOrderService接口中定义的所有方法
5. execution(* cn.itheima.aop.IOrderService+.*(..)) 匹配实现特定接口所有类的方法
6. execution(* save*(..)) 区配所有的以save开头的方法
Spring整合aspectj框架实现的aop在现在的开发中使用这种方案比较多.
在spring2.0以后它支持jdk1.5注解,而整合aspectj后可以使用aspectj语法,可以简化开发。
Aspect:切面 =切点+通知(多个切点与多个通知的组合)
AspectJ 它是一个第三方框架,spring从2.0后可以使用aspectJ框架的部分语法.
AspectJ框架它定义的通知类型有6种
1. 前置通知Before 相当于BeforeAdvice
2. 后置通知AfterReturning 相当于AfterReturningAdvice
3. 环绕通知 Around 相当于MethodInterceptor
4. 抛出通知AfterThrowing 相当于ThrowAdvice
5. 引介通知DeclareParents 相当于IntroductionInterceptor
6. 最终通知After 不管是否异常,该通知都会执行
相比spring 的传统AOP Advice多了一个最终通知
基于xml配置方案第一步:创建目标(target)第二步:创建通知(增强 advice)注意:在aspectj中它的增强可以不实现任何接口,只需要定义出增强功能(方法)
第三步:在spring的xml 配置文件中来配置<aop:config>下的<aop:aspect>是aspectJ框架用来声明切面的。
前置通知
后置通知
环绕通知
异常抛出
注意:目标行为只有抛出了异常后才会执行这个增强方法
最终通知
无论是否有异常,最终通知都会执行.
关于通知上的参数1. 在前置通知上可以添加JoinPoint参数
通过它可以获取目标相关的信息
使用前置通知可以完成日志记录,权限控制
2. 在后置通知上添加的参数
第二个参数val它可以获取目标方法的返回值
注意:需要在配置文件中配置
3. 环绕通知上的参数
它是我们开发中应用最多的,可以完成日志操作,权限操作,性能监控,事务管理
4. 抛出异常通知上的参数
第二个参数Throwable它是用于接收抛出的异常
注意:需要在配置文件中声明
5. 最终通知上的参数
可以使用最终通知完成资源释放
关于代理方式选择在spring的aop开发中,它使用的是代理方案,代理实现有两种:
1. jdk的proxy
2. cglib
spring框架默认情况下,会对有接口的类使用proxy代理。没有接口的类使用cglib代理
Proxy-target-class的值默认是false,它代表有接口使用proxy代理
问题:如果现在对目标要使用cglib代理(不考虑是否有接口)?
只需要将proxy-target-class设置为true.
{:8_507:}
三大框架之Spring课堂笔记-8
三大框架之Hibernate事务管理7(下)
三大框架之Hibernate注解开发-7(上)
三大框架之Hibernate持久化类与主键生成策略-6
三大框架之Hibernate常用API-5
Java三大框架学习之Hibernate的配置详解-4(下)
JavaEE三大框架课堂笔记之Hibernate快速入门-4(上)
三大框架之Struts2-3
三大框架之Struts2-2
三大框架之Struts2-1
线程精进指南之线程池进阶15个顶级Java多线程面试题及答案
Java String 面试题以及答案
Java IO流学习总结
14个你可能不知道的JavaScript调试技巧
Spring多个AOP执行先后顺序
认识JavaScript中的this
作者: 我是楠楠 时间: 2017-12-19 16:54
楼主棒棒哒
作者: 我是色色 时间: 2017-12-19 17:09
{:8_507:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |