spring总结
- 格式:doc
- 大小:130.00 KB
- 文档页数:40
Spring总结与思考1、Spring是什么?Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器(框架)。
它的主要⽬得是简化企业开发。
Spring 框架是⼀个分层架构,由 7 个定义良好的模块组成。
Spring 模块构建在核⼼容器之上,核⼼容器定义了创建、配置和管理 bean 的⽅式 .组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他⼀个或多个模块联合实现。
每个模块的功能如下:核⼼容器Spring Core:核⼼容器提供 Spring 框架的基本功能。
核⼼容器的主要组件是BeanFactory,它是⼯⼚模式的实现。
BeanFactory 使⽤控制反转(IOC)模式将应⽤程序的配置和依赖性规范与实际的应⽤程序代码分开。
Spring 上下⽂Spring Context:Spring 上下⽂是⼀个配置⽂件,向 Spring 框架提供上下⽂信息。
Spring 上下⽂包括企业服务,例如 JNDI、EJB、电⼦邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将⾯向切⾯的编程功能 , 集成到了 Spring 框架中。
所以,可以很容易地使 Spring 框架管理任何⽀持 AOP的对象。
Spring AOP 模块为基于 Spring 的应⽤程序中的对象提供了事务管理服务。
通过使⽤ Spring AOP,不⽤依赖组件,就可以将声明性事务管理集成到应⽤程序中。
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;Spring ORM:对现有的ORM框架的⽀持;Spring Web 模块:提供了基本的⾯向Web的综合特性,例如多⽅⽂件上传;Spring MVC 框架:提供⾯向Web应⽤的Model-View-Controller实现。
2、Spring 的优点?(1)spring属于低侵⼊式设计,代码的污染极低;(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;3)Spring提供了AOP技术,⽀持将⼀些通⽤任务,如安全、事务、⽇志、权限等进⾏集中式管理,从⽽提供更好的复⽤。
Springboot总结:核⼼功能和优缺点SpringBoot核⼼功能1、独⽴运⾏Spring项⽬Spring boot 可以以jar包形式独⽴运⾏,运⾏⼀个Spring Boot项⽬只需要通过java -jar xx.jar来运⾏。
2、内嵌servlet容器Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们⽆须以war包形式部署项⽬。
3、提供starter简化Maven配置spring提供了⼀系列的start pom来简化Maven的依赖加载,例如,当你使⽤了spring-boot-starter-web,会⾃动加⼊如图5-1所⽰的依赖包。
4、⾃动装配SpringSpringBoot会根据在类路径中的jar包,类、为jar包⾥⾯的类⾃动配置Bean,这样会极⼤地减少我们要使⽤的配置。
当然,SpringBoot只考虑⼤多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,⽽SpringBoot灭有提供⽀持,则可以⾃定义⾃动配置。
5、准⽣产的应⽤监控SpringBoot提供基于http ssh telnet对运⾏时的项⽬进⾏监控。
6、⽆代码⽣产和xml配置 SpringBoot不是借助与代码⽣成来实现的,⽽是通过条件注解来实现的,这是Spring4.x提供的新特性。
SpringBoot优缺点优点:快速构建项⽬。
对主流开发框架的⽆配置集成。
项⽬可独⽴运⾏,⽆须外部依赖Servlet容器。
-提供运⾏时的应⽤监控。
极⼤的提⾼了开发、部署效率。
与云计算的天然集成。
缺点:如果你不认同spring框架,也许这就是缺点。
SpringBoot特性创建独⽴的Spring项⽬内置Tomcat和Jetty容器提供⼀个starter POMs来简化Maven配置提供了⼀系列⼤型项⽬中常见的⾮功能性特性,如安全、指标,健康检测、外部配置等完全没有代码⽣成和xml配置⽂件SpringBoot CLISpringBoot CLI 是SpringBoot提供的控制台命令⼯具。
springboot学习心得SpringBoot是一个Java后端开发框架,它的出现极大地简化了项目的搭建和配置。
我在学习过程中,深刻体会到了SpringBoot的优势和便利性。
一、SpringBoot的特点SpringBoot具有以下几个显著特点:1. 简化的配置:SpringBoot采用约定大于配置的原则,减少了繁琐的配置,大部分情况下,你只需要一些简单的配置就可以运行一个站点或者服务。
2. 内嵌式Servlet容器:SpringBoot使用内嵌式Servlet容器(如Tomcat、Jetty等),使得运行Web应用变得更加简单,开发人员无需手动部署外部的Servlet容器。
3. 自动化配置:SpringBoot会根据项目中使用的依赖自动进行配置,无需手动配置。
当然,你也可以根据自己的需求进行定制化配置。
4. 准生产级别的监控:SpringBoot集成了大量的监控工具和健康检查机制,可以方便地监控应用的运行状态和健康情况。
二、学习过程中的收获在学习SpringBoot的过程中,我深刻体会到了以下几个方面的收获:1. 快速上手:相较于传统的Spring框架,SpringBoot的上手难度明显降低。
通过简单的配置和约定,可以快速搭建一个基本功能的应用程序。
2. 开发效率提升:SpringBoot的自动化配置使得开发过程更加高效。
通过减少繁琐的配置和重复的代码,开发人员可以更专注于业务逻辑的实现。
3. 生态丰富:SpringBoot与众多Spring家族的库和工具相互配合,拥有庞大的生态系统。
这使得我们可以很方便地集成各种功能和组件,如数据库访问、消息队列、缓存等。
4. 可维护性提升:SpringBoot的规范化配置和约定使得代码更加易读易维护。
项目的结构清晰,配置文件统一,便于团队协作和后续代码维护。
三、未来的学习计划在学习SpringBoot过程中,我发现了自己的不足和需要继续提升的地方。
因此,我在未来的学习计划中将重点提升以下几个方面:1. 深入学习SpringBoot的原理和内部机制,了解其背后的设计理念和实现方式。
spring整合mybatis出现的异常总结1.数据库版本及url配置问题,如图-20所⽰:问题分析:在url中追加时区配置(serverTimezone=GMT%2B8)2.数据库服务连接不上,如图-21所⽰:问题分析:检查数据库服务是否启动,连接数据库的⽤户名,密码是否正确.3.数据库版本或url配置问题,如图-22所⽰:问题分析:检查数据的服务是否已启动,连接数据的url配置是否正确,数据库版本与驱动是否匹配.4.访问的数据库不存在,如图-23所⽰:问题分析:检查url配置的数据库是否存在(数据库是否没创建)5.指定命名空间下的元素ID已经存在。
问题分析:可能是GoodsDao接⼝或映射⽂件对应的映射元素有重复。
6.MyBatis 绑定异常,如图-24所⽰问题分析:1. 检查接⼝类全名与映射⽂件中的命名空间是否不⼀致。
2. 检查接⼝⽅法名与映射⽂件中的元素是否不⼀致。
3. 查接⼝⽅法参数与映射⽂件可接收的参数不匹配。
4. 检查接⼝对应的映射⽂件路径是否配置不正确(mapper-locations)。
7.MyBatis 参数绑定异常,如图-25所⽰:问题分析:检查调⽤的dao⽅法参数与对应的SQL参数是否有映射关系.(SQL中的使⽤的ids参数可能没有使⽤@Param注解进⾏描述)8.运⾏时的SQL语法问题,图-26所⽰问题分析:1. 认真分析操作中提⽰的SQL语法问题,以及出现的⼤概位置。
2. 检测业务执⾏时传⼊的参数数据是否正常。
9.⽆限递归调⽤导致的栈内存溢出,如图-27所⽰:问题分析:基于错误检查⾃⼰写的类,哪⾥出现了循环递归调⽤。
10.JVM端⼝号被占⽤,如图-28所⽰其解决⽅案为:1. 关闭已启动的tomcat,重新启动。
2. 杀进程(windows)1. 查找进程id:netstat -ano|findstr "8080"2. 基于进程id杀进程:taskkill /f /pid 进程id11.URL响应资源不存在,如图-29所⽰:问题分析:检查tomcat启动是否OK,检查url对应的服务端资源是否匹配(客户端url与controller定义url),检查controller的包结构(所在包应在主启动类所在包的同包或⼦包中)。
SpringSPI机制总结1、概念:SPI(Service Provider Interface)服务提供接⼝,简单来说就是⽤来解耦,实现插件的⾃由插拔,具体实现⽅案可参考JDK⾥的ServiceLoader(加载classpath下所有META-INF/services/⽬录下的对应给定接⼝包路径的⽂件,然后通过反射实例化配置的所有实现类,以此将接⼝定义和逻辑实现分离)Spring在3.0.x的时候就已经引⼊了spring.handlers,很多博客讲Spring SPI的时候并没有提到spring.handlers,但是通过我⾃⼰的分析对⽐,其实spring.handlers也是⼀种SPI 的实现,只不过它是基于xml的,⽽且在没有boot的年代,它⼏乎是所有三⽅框架跟spring整合的必选机制。
在3.2.x⼜新引⼊了spring.factories,它的实现跟JDK的SPI就基本是相似的了。
spring.handlers和spring.factories我都把它归纳为Spring为我们提供的SPI机制,通过这两种机制,我们可以在不修改Spring源码的前提下,⾮常轻松的做到对Spring框架的扩展开发。
2、实现:2.1 先看看spring.handlers SPI在Spring⾥有个接⼝NamespaceHandlerResolver,只有⼀个默认的实现类DefaultNamespaceHandlerResolver,⽽它的作⽤就是加载classpath下可能分散在各个jar包中的META-INF/spring.handlers⽂件,resolve⽅法中关键代码如下://加载所有jar包中的META-INF/spring.handlers⽂件Properties mappings=PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);//把META-INF/spring.handlers中配置的namespaceUri对应实现类实例化NamespaceHandler namespaceHandler =(NamespaceHandler) BeanUtils.instantiateClass(handlerClass);DefaultNamespaceHandlerResolver.resolve()主要被⽤在BeanDefinitionParserDelegate的parseCustomElement和decorateIfRequired,所以spring.handlers SPI机制主要也是被⽤在bean的扫描和解析过程中。
SpringAOP⽰例与实现原理总结——传统springaop、基于切⾯注⼊、基于@Asp。
⼀、代码实践1)经典的Spring Aop经典的spring aop,是基于动态代理技术的。
实现⽅式上,最常⽤的是实现MethodInterceptor接⼝来提供环绕通知,创建若⼲代理,然后使⽤ProxyBeanFactory配置⼯⼚bean,⽣成拦截器链,完成拦截。
⽰例如下:1package demo.spring;23import org.aopalliance.intercept.MethodInterceptor;4import org.aopalliance.intercept.MethodInvocation;5import org.junit.Test;6import org.junit.runner.RunWith;7import org.springframework.beans.factory.annotation.Autowired;8import org.springframework.test.context.ContextConfiguration;9import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;1011 @RunWith(SpringJUnit4ClassRunner.class)12 @ContextConfiguration("classpath:spring-config.xml")13public class TraditionalSpringAopDemo {14 @Autowired15private Service proxy;1617 @Test18public void test() {19 proxy.execute("hello world!");20 }21 }2223interface Service {24void execute(String str);25 }2627class ServiceImpl implements Service {28 @Override29public void execute(String str) {30 System.out.println("execute invoke: " + str);31 }32 }3334class Interceptor1 implements MethodInterceptor {35 @Override36public Object invoke(MethodInvocation methodInvocation) throws Throwable {37 System.out.println("interceptor1,before invoke");38 Object ret = methodInvocation.proceed();39 System.out.println("interceptor1,after invoke");40return ret;41 }42 }4344class Interceptor2 implements MethodInterceptor {45 @Override46public Object invoke(MethodInvocation methodInvocation) throws Throwable {47 System.out.println("interceptor2,before invoke");48 Object ret = methodInvocation.proceed();49 System.out.println("interceptor2,after invoke");50return ret;51 }52 }xml⽂件配置:1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xmlns:context="/schema/context"5 xmlns:aop="/schema/aop"6 xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/context /schema/context/sprin 78<context:component-scan base-package="demo.spring"/>910<bean class="demo.spring.ServiceImpl" id="service"></bean>11<bean class="demo.spring.Interceptor1" id="interceptor1"></bean>12<bean class="demo.spring.Interceptor2" id="interceptor2"></bean>13<bean class="org.springframework.aop.framework.ProxyFactoryBean" id="proxy">14<property name="target" ref="service"/>15<property name="interceptorNames">16<list>17<value>interceptor1</value>18<value>interceptor2</value>19</list>20</property>21</bean>22</beans>结果:interceptor1,before invokeinterceptor2,before invokeexecute invoke: hello world!interceptor2,after invokeinterceptor1,after invoke可以看到拦截链的执⾏过程与拦截器顺序的关系。
springboot学习心得Spring Boot 学习心得在开发领域中,随着技术的日新月异,Spring Boot 作为一种开发框架,以其简化配置、快速开发和高效性能的特点逐渐受到广大开发者的青睐。
经过一段时间的学习和实践,我对 Spring Boot 有了深入的认识和理解,下面我将分享一些学习心得。
1. 了解 Spring BootSpring Boot 是由Spring框架衍生而来,用于简化Spring应用程序的搭建和开发过程。
它的特点是零配置,通过自动配置和约定大于配置的原则,可以快速搭建一个独立运行的、可部署的生产级应用。
学习 Spring Boot 的第一步就是要了解其核心思想和基本原理,掌握其提供的强大功能和特性。
2. 快速开发Spring Boot 提供了一系列的“Starter”依赖,可以根据不同的应用类型快速引入所需的依赖包,而无需手动配置。
这些 Starter 依赖不仅包含了常用的核心模块,还覆盖了常见的第三方组件,如数据库、消息队列等。
开发者只需要在项目中引入适当的 Starter 依赖,即可获得相应功能的自动配置。
这大大减少了开发人员的工作量,提高了开发效率。
3. 灵活可配置虽然 Spring Boot 的自动配置在大多数情况下能够满足需求,但有时也需要进行一些定制。
Spring Boot 提供了多种配置方式,开发者可以通过配置文件、注解、属性等方式对应用进行细粒度的配置。
同时,Spring Boot 还支持多个配置文件,可以根据环境不同加载不同的配置,方便在不同环境中进行部署和测试。
4. 强大的监控和管理Spring Boot 集成了各种监控和管理工具,例如 Spring Boot Actuator,它提供了对应用程序健康、度量、审计等方面的监控功能。
通过简单地引入相关依赖,即可在运行时了解应用的性能指标、请求情况等信息。
此外,Spring Boot 还提供了可视化的管理界面,方便管理者对应用进行监控和管理。
ssm框架总结SSM框架总结SSM框架是目前Java开发中使用最广泛的三大主流框架之一,它由Spring、SpringMVC和MyBatis三个独立的框架组成,各自承担不同的职责和功能。
在这篇文章中,我将对SSM框架进行总结和分析。
一、Spring框架Spring是一个轻量级的Java企业级应用开发框架,它提供了一站式的解决方案,能够简化开发过程并提高开发效率。
Spring框架的核心是控制反转(IoC)和面向切面编程(AOP)。
控制反转是指将对象的创建和依赖关系的管理交给Spring容器来完成,开发者只需要通过配置文件或注解来定义所需的Bean,然后从容器中获取即可。
这样的设计思想可以降低代码的耦合度,提高代码的可维护性。
面向切面编程是Spring框架的另一个重要特性,它通过在主业务逻辑上方插入横切关注点(如日志、事务管理等),实现了代码的模块化和重用性。
开发者可以通过定义切面来对代码进行横向扩展,而不必修改原有的业务逻辑代码。
二、SpringMVC框架SpringMVC是一种典型的MVC(Model-View-Controller)设计模式的实现框架,它基于Servlet容器并与Spring框架无缝集成,用于开发Web应用程序。
在SpringMVC框架中,Controller负责接收和处理用户请求,然后将处理结果封装成Model对象,最后通过View来展示给用户。
通过这种模式的划分,能够有效地分离前端与后端的责任,并提高开发效率。
SpringMVC框架提供了丰富的注解和标签库,开发者可以通过这些工具来简化开发过程,减少样板代码,并且可以与前端框架(如Bootstrap、jQuery等)无缝集成,提供更好的用户体验。
三、MyBatis框架MyBatis是一种基于Java的持久层框架,它利用了面向对象的编程方式来完成与数据库的交互。
通过XML配置和SQL映射文件,开发者可以轻松地实现与数据库的交互操作。
springboot学习心得SpringBoot 学习心得在完成对 SpringBoot 的学习之后,我深刻体会到了这个框架的强大和便利之处。
SpringBoot 是一个基于 Spring 框架的快速开发框架,通过自动配置和简化的约定,大大提高了开发效率。
下面是我对于 SpringBoot 学习的一些心得和总结。
一、简洁高效的开发体验使用 SpringBoot 可以极大地简化项目的配置和搭建过程。
通过使用 SpringBoot Starter 依赖,我们可以轻松地引入各种常用的依赖,而无需手动去配置。
同时,SpringBoot 的自动配置机制可以根据项目中引入的依赖,自动为我们配置相关的组件和功能。
这使得我们可以将更多的精力放在业务逻辑的实现上,而不需要过多关注繁琐的配置工作。
二、内嵌 Tomcat 使得部署更加方便SpringBoot 默认内嵌了 Tomcat 容器,这意味着我们可以将项目打包成一个独立的可运行的 JAR 文件,并直接通过命令行启动应用。
这种方式不仅方便了项目的部署,还减少了对外部服务器的依赖。
另外,SpringBoot 还支持通过 WAR 包的方式部署到外部容器中,这样可以更好地与传统的应用服务器集成。
三、强大的功能扩展能力SpringBoot 提供了大量的插件和扩展点,可以帮助开发者定制化自己的应用。
比如,我们可以通过自定义 Starter 来封装一些通用的组件和功能,方便之后的重复使用。
或者通过自定义 Starter 来封装一些通用的组件和功能,方便之后的重复使用。
或者通过自定义条件注解和条件类来实现一些特定环境下的自动配置。
这些功能扩展能力让我们在开发过程中能够更加灵活地满足自己的需求。
四、完善的监控和运维支持在生产环境中,监控和运维是非常重要的一环。
SpringBoot 提供了丰富的监控和运维支持,可以帮助我们更好地监控应用的运行状态和性能指标。
比如,我们可以通过 Actuator 模块来暴露应用的健康状态、运行信息和性能指标,方便运维人员进行监控和故障排查。
spring的用法总结大全Spring是一个开源的Java开发框架,可以用于构建企业级应用程序。
它提供了一系列的模块,如Spring Core、Spring MVC、Spring Security等,每个模块都有不同的用法。
以下是Spring的用法总结大全:1. Spring IOC(控制反转):Spring的核心功能之一。
IOC容器负责创建和管理应用程序中的对象。
通过配置文件或注解,对象之间的依赖关系由容器来管理。
常见的用法有使用XML配置文件和使用注解配置。
2. Spring AOP(面向切面编程):通过AOP,可以将横切关注点(如事务管理、日志记录等)与业务逻辑分离,提高代码的可维护性和灵活性。
常见的用法有使用XML配置文件和使用注解配置。
3. Spring MVC(模型-视图-控制器):用于构建Web应用程序的框架。
通过MVC模式将应用程序分为模型、视图和控制器三层,提供了处理HTTP请求和响应的功能。
常见的用法有使用XML配置文件和使用注解配置。
4. Spring Boot:用于快速构建基于Spring的应用程序的框架。
它提供了自动配置和约定优于配置的特性,使开发者能够更快速地搭建和部署应用程序。
5. Spring Security:用于身份验证和授权的框架。
它提供了一系列的安全特性,如用户认证、授权、密码加密等。
6. Spring Data:用于简化数据库访问的框架。
它提供了一系列的模块,如SpringData JPA、Spring Data JDBC等,使开发者能够更方便地进行数据库操作。
7. Spring WebSocket:用于实现WebSocket通信的框架。
它提供了基于事件的异步消息传递功能,使开发者能够更方便地实现实时通信。
8. Spring Cloud:用于构建分布式系统的框架。
它提供了一系列的模块,如服务注册与发现、负载均衡、断路器等,使开发者能够更方便地构建和管理分布式应用程序。
spring-ioc:控制反转* 控制反转:让组件之间的依赖关系通过抽象(接口或抽象类的变量)来建立,在组件运行期间,将组件依赖的实际对象,注入(填充)进来,并由组件内部包含的抽象变量来引用,从而,就可以解藕了- ioc是一种思想,真正的实现是DI (依赖注入-被动方式)*** 控制反转意味着在系统开发过程中,设计的类将交由容器去控制,而不是在类的内部去控* factory是一种伪单例模式,但是可以调整scope="prototype"*注入方式:setter:byName byType ;construtor构造方法注入*** ref时的对象名称必须在spring中已经注入过** spring没有实现orm,但是为其他orm 框架提供了整合方案* 使用IoC的情况下 ,对象是被动地接收依赖类而不是主动地查找public static void main(String[] args) {BeanFactory f = new ClassPathXmlApplicationContext(newString[]{"applicationContext.xml","applicationContextDao.xml","applicationContextService.xml","applicationContextAction.xml"});// BeanFactory f = new FileSystemXmlApplicationContext(newString[]{//"G:\\javaProject\\spring\\spring_03 \\src\\applicationContext.xml",// "applicationContextDao.xml", //"applicationContextService.xml",//"applicationContextAction.xml"} );TestAction t = (TestAction) f.getBean("testAction");t.test();}* 属性可以有几种方式:- List-Set-Map<bean name="user" class="com.zmx.action.TUser"><property name="username"><value>sdfds</value></property><property name="lst"><list><value>1</value><value>2</value><value>3</value><value>4</value></list></property><property name="set"><set><value>a</value><value>b</value></set></property><property name="map"><map><entry key="a" value="12345"/></map></property></bean>public static void main(String[] args) {BeanFactory f = new ClassPathXmlApplicationContext("appli cationContext.xml");TUser user = (TUser) f.getBean("user");// List lst = user.getLst();// Iterator it = lst.iterator();// while(it.hasNext()){// System.out.println(it.next()); // }Map map = user.getMap();System.out.println(map.get("a")); }* 注入方式:setter constructor byName byType* constructor构造方法注入:- 必须有构造方法设置参数public TUser(THome home){this.home = home;}- spring的配置中必须设置autowire="constructor"- 此属性可以不在配置中描述* byName按名称注入:- 此属性名称必须在spring中已经注入过- spring的配置中必须设置autowire="byName"- 此属性可以不在配置中描述* byType按类型注入:- 此属性类型必须在spring中已经注入过- spring的配置中必须设置autowire="byType"- 此属性可以不在配置中描述spring-aop:切面* Aop是施乐公司帕洛阿尔托研究中心在90年代发明的一种编程模式。
优点:操作简洁、改进性能可以使程序员用更少的时间重写相同的代码。
使程序具有更高的封装性* 代理:静态和动态代理jdk的动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。
* jdk动态代理InvocationHandler必须有接口public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println(System.currentTi meMillis());Object a = method.invoke(object, args);return a;}如果方法有参数args就为那个参数值,否则null如果方法有返回值那么直接返回当前的数值,否则null//生成代理类的字节码加载器ClassLoader classLoader = proxyObject.getClass().getClassLoader ();//需要代理的接口,被代理类实现的多个接口都必须在这里定义 (这是一个缺陷,cglib弥补了这一缺陷)//织入器,织入代码并生成代理类returnProxy.newProxyInstance(classLoader, proxyInterface, this); \使用newProxyInstance()方法就可以生成一个代理对象。
把这个方法的签名拿出来:/*** @param loader 类加载器,用于加载生成的代理类。
* @param interfaces 需要代理的接口。
这些接口的所有方法都会被代理。
* @param h 第一步中我们建立的Handler类的实例。
* @return 代理对象,实现了所有要代理的接口。
*/public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException使用代理后,这个方法将取代指定的所有接口中的所有方法的执行。
在本例中,调用adder.add()方法时,实际执行的将是invoke()。
所以为了有正确的结果,我们需要在invoke()方法中手动调用add()方法。
再看看invoke()方法的参数,正好符合反射需要的所有条件,所以这时我们马上会想到这样做:?1 Object returnValue = method.invoke(proxy, args);如果你真的这么做了,那么恭喜你,你掉入了jdk 为你精心准备的圈套。
proxy是jdk为你生成的代理类的实例,实际上就是使用代理之后adder引用所指向的对象。
由于我们调用了adder.add(1, 2),才使得invoke()执行,如果在invoke()中使用method.invoke(proxy, args),那么又会使invoke()执行。
没错,这是个死循环。
然而,invoke()方法没有别的参数让我们使用了。
最简单的解决方法就是,为MyHandler加入一个属性指向实际被代理的对象* 过滤器,拦截器都可以理解为一种AOP技术* 在spring中只支持方法作为连接点,不支持属性作为连接点,且如果方法为final则不能被通知(不能作为连接点)代理模式代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种:静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。
在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
代理类:/*** @(#)UserDaoProxy1.java* Description: TODO 填写文件作用简要说明* Version : 0.0.0* Copyright: Copyright (c) 科技有限公司版权所有* Create by: 张茂修 2007-5-7*/package com.zmx.action;importng.reflect.InvocationHandler; import ng.reflect.Method; import ng.reflect.Proxy;/*** TODO 填写功能说明* @author 张茂修*/public class UserDaoProxy1 implements InvocationHandler{// 目标对象private Object object;/**** TODO 绑定委托对象并返回一个目标对象的代理对象* @param object* @return*/public Object objProxy(Object object){System.out.println("ok");this.object = object;returnProxy.newProxyInstance(object.getClas s().getClassLoader(),object.getClass().getInterfaces(), this);}/*** @param proxy 接下来Proxy要为你生成的代理类的实例* @param method 调用的方法的Method 实例。