




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、北京传智播客教育 ,Spring3企业开发,讲师:刘洋,北京传智播客教育 ,第一章 开始spring之旅,北京传智播客教育 ,知识1:Spring介绍,Spring是一个非常活跃的开源框架;它是一个基于IOC和AOP来构架多层JavaEE系统的框架,它的主要目地是简化企业开发. Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring,北京传智播客教育 ,知识2:Spring模块介绍,Spring 框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块。这些模块分为Core Container、Data Acc
2、ess/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:,北京传智播客教育 ,知识3:理解控制反转(IOC),IOC就是 Inversion of Control public class Girl private Boy boy =new Boy(); public void kiss() System.out.println(boy.getBoyObject(); boy是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。
3、这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性。,北京传智播客教育 ,知识4:理解依赖注入(Dependency Injection),当我们把依赖对象交给外部容器负责创建,那么Girl类可以改成如下: public class Girl private Boy boy; public void kiss() System.out.println(boy.getBoyObject(); 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。,北京传智播客教育 ,知识点5:实现IOC,* org.springframewo
4、rk.asm-3.0.2.RELEASE.jar Spring独立的asm程序, Spring2.5.6的时候需要asmJar包,3.0开始提供他自己独立的asmJar。 * org.springframework.beans-3.0.2.RELEASE.jar 所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类 * org.springframework.context-3.0.2.RELEASE.jar Spring提供在基础IoC功能上的扩展服务,此外还
5、提供许多企业级服务的支持, 如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等。 * org.springframework.core-3.0.2.RELEASE.jar 包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。 * org.springframework.expression-3.0.2.RELEASE.jar Spring表达式语言 * mons.logging-1.1.1.jar(spring-framework-3.0.2.RELEASE-dependencies) 第三方的主要用于
6、处理日志,1 : 到/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下,北京传智播客教育 ,知识点5:实现IOC,2:创建java类,public class Boy public void display() System.out.println(随便); ,北京传智播客教育 ,知识点5:实现IOC,3:创建spring的配置模板, 该配置模版可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下。,北京传智播
7、客教育 ,知识点5:实现IOC,4:在spring的配置文件中增加如下配置,北京传智播客教育 ,知识点5:实现IOC,5:加载spring的配置文件测试,public class App public static void main(String args) /在类路径下,初始化spring容器 ApplicationContext ctx=new ClassPathXmlApplicationContext(beans.xml); /从spring容器中获取boy对象 Boy boy=(Boy)ctx.getBean(boy); /调用boy对象的display方法 boy.display
8、(); ,北京传智播客教育 ,知识点6:实现DI,1.创建girl类,public class Girl private Boy boy; public void setBoy(Boy boy) System.out.println(setBoy +boy); this.boy = boy; public void kiss() boy.display(); ,北京传智播客教育 ,知识点6:实现DI,2.在spring的beans.xml文件中增加如下配置,红色的为新增加的, ,北京传智播客教育 ,知识点6:实现DI,3.测试,public class App public static vo
9、id main(String args) /加载spring的xml文件,初始化spring容器 ApplicationContext ctx=new ClassPathXmlApplicationContext(cn/itcast/di/beans.xml); /从spring容器中获取Girl对象 Girl girl=(Girl)ctx.getBean(girl); /调用boy对象的display方法 girl.kiss(); ,北京传智播客教育 ,知识点7:从spring容器中得到bean,当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命周期,所以我
10、们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。从容器获取bean对象的代码如下: ApplicationContext ctx=new ClassPathXmlApplicationContext(beans.xml); Girl girl =(Girl)ctx.getBean(girl);,北京传智播客教育 ,知识点8:实例化spring容器的方式,实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new S
11、tringbeans.xml); 可以在整个类路径中寻找xml文件 * 通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下 * classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。 方法二: 在文件系统路径下寻找配置文件来实例化容器 ApplicationContext ctx = new FileSystemXmlApplicationContext(new String“d:beans.xml“); Spring的配置文件可以指定多个,可以通过String数组传入。,北京传智播客教育 ,知识点9:为何要使用Spring,至少
12、在我看来,在项目中引入spring立即可以带来下面的好处 降低组件之间的耦合度,实现软件各层之间的解耦。 可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。 容器提供单例模式支持,开发人员不再需要自己编写实现代码。 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。 容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。 Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等
13、,这样更便于应用的开发。,Controller,Service,DAO,北京传智播客教育 ,知识点9:使用Spring的好处,当使用spring时,我们可以使用容器提供的众多服务,北京传智播客教育 ,第二章 装配Bean,北京传智播客教育 ,知识点1:三种实例化bean的方式,1.使用类构造器实例化(默认无参数) 2.使用静态工厂方法实例化(简单工厂模式) public class PersonServiceFactory public static PersonService createPersonService() return new PersonServiceImpl(); 3.使用
14、实例工厂方法实例化(工厂方法模式): public class PersonServiceFactory public PersonService createPersonService() return new PersonServiceImpl(); ,北京传智播客教育 ,知识点2:Bean的作用域,* singleton(默认值) 在每个Spring IoC容器中一个bean定义只有一个对象实例(共享)。 默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如: 如果想
15、对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下: * prototype 允许bean可以被多次实例化(使用一次就创建一个实例) * request * session * global session(Portlet规范将portlet定义为一种“基于Java技术的web组件,由处理请求和生成动态内容的portlet容器管理”),北京传智播客教育 ,知识点3:指定Bean的初始化方法和销毁方法,Spring初始化bean或销毁bean时,有时需要作一些处理工作, 因此spring可以在创建和拆卸bean的时候调用bean的两个
16、生命 周期方法。 ,当bean被载入到容器的时候调用setup,当bean从容器中删除的时候调用teardown(scope= singleton有效),北京传智播客教育 ,知识点4:依赖注入,* 手工装配 * 使用xml配置文件 * 使用属性setter方法注入 4.1 * 使用构造器注入 4.2 * 使用注解 * autowired注解 4.3 * resource注解 4.4 * 自动装配 4.5 * byType:按类型装配 * byName:按名称装配 * constructor装配, * autodetect 不确定装配。 注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使
17、用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。,北京传智播客教育 ,知识点4:依赖注入,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,通过setter方法注入依赖 元素的子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean。,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 * 简单bean配置 配置bean的简单属性,基本数据类型和String。 ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter
18、方法注入依赖 引用其它bean(外部bean) ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 * 内部bean 这种方式的缺点是你无法在其它地方重用这个personClass实例,原因是它是专门为personService而用。,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,依赖注入-手工装配-XML方式,通过setter方法注入依赖 * 装配集合 若bean的属性是集合类型,按如下处理: A、装配List和数组:, obj1 obj2 , list1 l
19、ist2 ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 * 装配集合 B、 装配set: set使用方法和list一样,不同的是对象被装配到set中,而list是装配到 List或数组中装配。, set1 set2 ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 * 装配集合 C、 装配map: map中的的数值和以及的一样,可以使任何有效的属性元 素,需要注意的是key值必须是String的。, map0
20、1 map02 ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 * 装配集合 D、装配Properties:, prop1 prop2 ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过setter方法注入依赖 *装配集合(List) E、设置null:, ,4.1:手工装配 -使用xml配置文件-使用属性setter方法注入,北京传智播客教育 ,知识点4:依赖注入,通过构造函数注入依赖 通过参数的顺序:, 张三 56 ,4.2:手工装
21、配 -使用xml配置文件-通过构造函数注入,北京传智播客教育 ,知识点4:依赖注入,通过构造函数注入依赖 通过参数的类型:, 56 张三 ,4.2:手工装配 -使用xml配置文件-通过构造函数注入,北京传智播客教育 ,知识点4:依赖注入,. 在java代码中使用Autowired或Resource注解方式进行装配的前提条件是。 1、引入context命名空间 需要在xml配置文件中配置以下信息: 2、在配置文件中添加context:annotation-config标签 这个配置隐式注册了多个对注释进行解析处理的处理器 AutowiredAnnotationBeanPostProcessor,
22、CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor 注: Resource注解在spring安装目录的spring-framework-3.0.2.RELEASE-dependenciesjavax.annotationcom.springsource.javax.annotation1.0.0包下com.springsource.javax.annotation-1.0.0.jar,手工装配 -使用注解方式,北京传智播客教育
23、,知识点4:依赖注入,. 注意: * 如果使用jdk1.5,需要引入 com.springsource.javax.annotation-1.0.0.jar包 * 如果使用jdk1.6,不需要引入 com.springsource.javax.annotation-1.0.0.jar包 com.springsource.javax.annotation-1.0.0.jar 该jar包在spring-framework-3.0.2.RELEASE-dependenciesjavax.annotationcom.springsource.javax.annotation1.0.0包下,手工装配 -
24、使用注解方式,北京传智播客教育 ,知识点4:依赖注入,Autowired标注在字段上 * Autowired注解默认按类型进行装配 * 获取该注解标注的字段的类型-PersonDao类型 * 以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类型. * 找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值 * Qualifier(“personDao”)该注解以名字为条件查找依赖对象 * 以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的 值是personDao的
25、对象 * 找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值 如果不存在该名称,抛出异常,4.3:手工装配 -使用注解方式-autowired注解,Autowired private PersonDao personDao;/用于字段上 Autowired Qualifier(personDao) private PersonDao personDao;/用于字段上,北京传智播客教育 ,知识点4:依赖注入,Autowired public void setPersonDao(PersonDao personDao) /用于属性的set方法上 this.personDao
26、 = personDao; Autowired public void setPersonDao(Qualifier(personDao) PersonDao personDao) /用于属性的set方法上 this.personDao = personDao; ,4.3:手工装配 -使用注解方式autowired注解,Autowired标注在setter方法上 Autowired注解默认按类型进行装配 * 获取 setPersonDao()方法的参数的类型-PersonDao类型 * 以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类
27、型. * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao( PersonDao personDao)的形参. * Qualifier(personDao)该注解以名字为条件查找依赖对象 * 以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的 值是PersonDao的对象 * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao( PersonDao personDao)的形参. * 如果不存在该名称,抛出异常,北京传智播客教育 ,知识点4:依赖注入,Resource注解标注
28、在字段上 * Resource注解默认按名称装配。 * 如果没有指定name属性 * 获取该注解标注的字段值-personDao * 以该字段值为条件到spring容器(beans.xml)中去查找bean的id节点的值是 personDao的节点 * 找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值 * 如果没有找到.并且按照默认的名称找不到依赖对象时, Resource注解会回退到按类型装配 * 获取该注解标注的字段类型-PersonDao * 以该类型为条件到spring容器(beans.xml)中去查找bean的节点的类型是PersonDao类型 的对象 *
29、找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值 * 如果指定name属性 只能按名称装配 * 获取name属性的值 personDao * 以该值为条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象 * 找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值 * 如果不存在该名称,抛出异常,4.4:手工装配 -使用注解方式-resource注解,Resource(name=personDao) private PersonDao personDao;/用于字段上,北京传智播客教育 ,知识点4:依赖
30、注入,Resource(name=personDao) public void setPersonDao(PersonDao personDao) this.personDao = personDao; ,4.4:手工装配 -使用注解方式resource注解,resource注解标注在setter方法上 * Resource注解默认按名称装配。 * 如果没有指定name属性 * 获取setPersonDao()方法的属性名-personDao * 以该属性名为条件到spring容器(beans.xml)中去查找bean的id节点的值是personDao的节点 * 找到以后,获取该节点对应的对象
31、, 把该对象作为实参传递给该setPersonDao( PersonDao personDao)的形参. * 如果没有找到.并且按照默认的名称找不到依赖对象时,Resource注解会回退到按类型装配 * 获取setPersonDao()方法的参数类型-PersonDao * 以该类型为条件到spring容器(beans.xml)中去查找bean的节点的类型是PersonDao类型对象 * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao( PersonDao personDao)方法的形参 * 如果指定name属性 只能按名称装配 * 获取name属性的值 *
32、 以该值为条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象 * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao( PersonDao personDao)的形参. * 如果不存在该名称,抛出异常,北京传智播客教育 ,知识点4:依赖注入,对于自动装配,大家了解一下就可以了,实在不推荐大家使用。例子: autowire属性取值如下 * byType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。 * byName:按名称装配
33、,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null。 * constructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 * autodetect :首先尝试使用constructor来自动装配,然后使用byType方式。不确定性的处理与constructor方式和byType方式一致。,4.5:自动装配(了解知识),北京传智播客教育 ,知识点5:指定Bean的初始化方法和销毁方法(注解),Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此sp
34、ring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。 ,当bean被载入到容器的时候调用setup 注解方式下: PostConstruct 初始化,当bean从容器中删除的时候调用teardown(scope= singleton有效) 注解方式如下: PreDestroy 销毁,北京传智播客教育 ,知识点6:classpath自动扫描把组件纳入spring容器中管理,前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。 Spring3.
35、0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了Component、Service、Controller、Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。 要使用自动扫描机制,我们需要打开以下配置信息: 1、引入context命名空间 需要在xml配置文件中配置以下信息: ,北京传智播客教育 ,知识点6:classpath自动扫描把组件纳入spring容器中管理,2、在配置文件中添加context:component-scan标签 其中base-package为需要扫描的包(含子包)。 注: 1、在使用
36、组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检测并织入 - 所有这一切都不需要在XML中提供任何bean配置元数据。 2、功能介绍 Service用于标注业务层组件、 Controller用于标注控制层组件(如struts中的action)、 Repository用于标注数据访问组件,即DAO组件。 而Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。,北京传智播客教育 ,通过在classpath自动扫
37、描方式把组件纳入spring容器中管理,/Dao层 import org.springframework.stereotype.Repository; import com.itcast.dao.PersonDao; Repository(personDao) public class PersonDaoBean implements PersonDao /业务层 import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.itcast.dao.PersonDao; im
38、port com.itcast.service.PersonService; Service(personService) public class PersonServiceBean implements PersonService Resource(name=personDao) private PersonDao personDao; ,北京传智播客教育 ,第三章 面向切面编程,北京传智播客教育 ,知识点1:AOP-代理对象,代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,
39、一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。 真实主题角色:定义了代理角
40、色所代表地真实对象,代理对象 代理主题,目标对象 真实主题,客户端,代理模式示意图,北京传智播客教育 ,知识点2:JDK动态代理,import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JDKProxy implements InvocationHandler private Object targerObject;/代理的目标对象 /* * 创建代理对象 * param targerObject 目标对象
41、* return */ public Object createProxyInstance(Object targerObject) this.targerObject=targerObject; /* * 第一个参数设置代码使用的类加载器,一般采用跟目标类相同的类加载器 * 第二个参数设置代理类实现的接口,跟目标类使用相同的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会调用该参数指定对象的invoke方法 */ return Proxy.newProxyInstance( targerObject.getClass().getClassLoader(), targerObje
42、ct.getClass().getInterfaces(), this); ,北京传智播客教育 ,JDK动态代理,/* * param proxy 目标对象的代理类实例 * param method 对应于在代理实例上调用接口方法的Method实例 * param args 传入到代理实例上方法参数值的对象数组 * return 方法的返回值 没有返回值时是null */ public Object invoke(Object proxy, Method method, Object args) throws Throwable System.out.println(代理类实例 +proxy.
43、getClass(); System.out.println(方法名称 +method.getName(); if(args!=null ,北京传智播客教育 ,知识点3:AOP中的概念,Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容-它的功能、在何时和何地完成其功能 joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点. Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义. 通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.
44、Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能) Target(目标对象):代理的目标对象 Weaving(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象 Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.,北京传智播客教育 ,知识点4:代理总结,spring在运行期创建代理,不需要特殊的编译器. spring有两种代理方式: 1.若目标对象实现了若干接口,s
45、pring使用JDK的java.lang.reflect.Proxy类代理。 2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。 使用该方式时需要注意: 1.对接口创建代理优于对类创建代理,因为会产生更加松耦合的系统。 对类代理是让遗留系统或无法实现接口的第三方类库同样可以得到通知, 这种方式应该是备用方案。 2.标记为final的方法不能够被通知。spring是为目标类产生子类。任何需要 被通知的方法都被复写,将通知织入。final方法是不允许重写的。 spring只支持方法连接点:不提供属性接入点,spring的观点是属性拦截破坏了 封装。面向对象的概念是对象
46、自己处理工作,其他对象只能通过方法调用的得到的 结果。,北京传智播客教育 ,知识点5:使用CGLIB生成代理,CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 import java.lang.reflect.Method; import xy.Enhancer; import xy.MethodInterceptor; import xy.MethodProxy; public class UserManagerCglibProxy imp
47、lements MethodInterceptor private Object targerObject; /代理的目标对象 /* * 创建目标对象的代理对象 * param targerObject 目标对象 * return */ public Object createProxyInstance(Object targerObject) this.targerObject=targerObject; Enhancer enhancer=new Enhancer(); /该类用于生成代理对象 enhancer.setSuperclass(this.targerObject.getClas
48、s(); /设置父类 enhancer.setCallback(this); /设置回调用对象为本身 return enhancer.create(); /创建代理对象 ,北京传智播客教育 ,使用CGLIB生成代理,/* * param obj 目标对象代理类的实例 * param method 代理实例上调用父类方法的Method实例 * param args 传入到代理实例上方法参数值的对象数组 * param methodProxy 使用它调用父类的方法 * return * throws Throwable */ public Object intercept(Object obj,
49、Method method, Object args, MethodProxy methodProxy) throws Throwable System.out.println(代理类 +obj.getClass(); System.out.println(方法名称 +method.getName(); if(args!=null ,北京传智播客教育 ,使用Spring进行面向切面(AOP)编程,要进行AOP编程,首先我们要在spring的配置文件中引入aop命名空间: Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种: 基于XML配置方式进行AOP开发。 基于注解方式进行A
50、OP开发。,北京传智播客教育 ,使用Spring进行面向切面(AOP)编程,要进行AOP编程,需要引入的jar包 * .sf.cglib-2.2.0.jar cglib代理 * .aopalliance-1.0.0.jar * .aspectj.tools-1.6.6.RELEASE.jar * org.springframework.aop-3.0.2.RELEASE.jar spring的面向切面编程,提供AOP(面向切面编程)实现 * org.springframework.aspects-3.0.2.REL
51、EASE.jar spring提供对AspectJ框架的整合,北京传智播客教育 ,定义切面和通知,/切面 public class Security /通知 public void checkSecurity(JoinPoint point) System.out.println(进行安全性检查); System.out.println(point.getTarget() +point.getTarget(); /获取方法调用方法的名称 System.out.println(point.getSignature().getName() +point.getSignature().getName
52、(); /获取方法的参数 if(point.getArgs()!=null ,北京传智播客教育 ,知识点6:基于XML配置前置通知,配置文件如下 ,北京传智播客教育 ,知识点7:基于XML配置后置通知,public class Security public void checkSecurity(JoinPoint point,Object retval) System.out.println(进行安全性检查); /获取目标对象方法的返回值 System.out.println(retval返回值: +retval); 配置文件如下 ,北京传智播客教育 ,知识点8:基于XML配置异常通知,pu
53、blic class Security public void checkSecurity(JoinPoint point,Throwable ex) System.out.println(进行安全性检查); /获取异常 System.out.println(ex +ex); 配置文件如下 ,北京传智播客教育 ,知识点9:基于XML配置最终通知,配置文件如下 ,北京传智播客教育 ,知识点10:基于XML配置环绕通知,public class Security public Object checkSecurity(ProceedingJoinPoint point) System.out.pr
54、intln(进行安全性检查); /pg自己控制目标方法的调用 Object returnvalue=null; try returnvalue=ceed(); catch (Throwable e) e.printStackTrace(); System.out.println(returnvalue +returnvalue); return returnvalue; 配置文件如下 ,北京传智播客教育 ,基于注解方式,为了在Spring配置中使用AspectJ切面,你首先必须启用Spring对AspectJ切面配置的支持,并确保自动代理 (蓝色部分): ,北京传智播客教育
55、,知识点11:基于注解方式-前置通知,Aspect /声明切面 public class Security /* * Pointcut 用于声明切入点 * 在AspectJ注解风格的AOP中 一个切入点签名通过一个普通的方法来定义 * 1 作为切入点签名的方法必须返回void类型 * 2 方法没有参数 用private修饰 * 3 方法体为空 * 4 方法没有参数 * 切入点表达式的写法 * execution(主要)表示匹配方法执行的连接点 * 例如: * com.itcast.service.*.save*(.) * 1 * 表示方法的返回类型任意 * 2 com.itcast.servi
56、ce.* 表示service包及其子包中所有的类 * 3 .save、delete* 表示类中所有以save或者delete开头的方法 * 4 (.) 表示参数是任意数量 */ Pointcut(“execution(* cn.itcast.service.*.save*(.) private void perform() Pointcut(“execution(* cn.itcast.service.*.delete*(.) private void perform2(),北京传智播客教育 ,基于注解方式-前置通知,/* * Before 前置通知 在方法调用前执行 * perform()|
57、 perform2() 表示前面定义的切入点 */ Before(perform()|perform2() public void checkSecurity(JoinPoint point) System.out.println(进行安全性检查); System.out.println(point.getTarget() +point.getTarget(); /获取方法调用方法的名称 System.out.println(point.getSignature().getName() +point.getSignature().getName(); /获取方法的参数 if(point.getArgs()!=null ,北京传智播客教育 ,知识点12:基于注
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通过游戏促进幼儿认知发展计划
- 团队文化塑造的重要性计划
- 学校社团工作计划鼓励学生写诗
- 2025年羧甲淀粉钠项目合作计划书
- 七年级下册《一元一次不等式的应用》课件与练习
- 制冷空调培训课件
- 强化废弃物管理推动生物降解
- 构建系统耦合度控制与优化机制
- 关于员工培训的会议纪要及培训计划
- 功能、使用与维护指南
- 双溪漂流可行性报告
- 采购流程各部门关系图
- 力士乐工程机械液压培训资料(共7篇)课件
- 英语单词词根
- 问题学生转化策略课件
- GMP附录计算机化系统整体及条款解读
- 村光伏发电申请书
- 腰椎间盘突出症中医特色疗法课件
- 施工现场专项消防安全检查表
- 如何当好学校的中层干部
- 2022-2023学年广东省佛山市顺德区高三(下)模拟英语试卷
评论
0/150
提交评论