MVC模式: web运用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm工具被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否须要表单验证,如果须要就调用ActionForm的Validate()验证后选择将要求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个工具,然后调用Action的execute()方法。Execute()从ActionForm工具中获取数据,完成业务逻辑,返回一个ActionForward工具,ActionServlet再把客户要求 转发给ActionForward工具指定的jsp组件,ActionForward工具指定的jsp天生动态的网页,返回给客户。
2.拦截器和过滤器的差异?
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。3、拦截器只能对Action要求起浸染,而过滤器则可以对险些所有要求起浸染。4、拦截器可以访问Action高下文、值栈里的工具,而过滤器不能。5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
3.struts2框架的核心掌握器是什么?它有什么浸染?
1)Struts2框架的核心掌握器是StrutsPrepareAndExecuteFilter。 2)浸染: 卖力拦截由<url-pattern>/</url-pattern>指定的所有用户要求,当用户要求到达时,该Filter会过滤用户的要求。默认情形下,如果用户要求的路径 不带后缀或者后缀以.action结尾,这时要求将被转入struts2框架处理,否则struts2框架将略过该要求的处理。 可以通过常量\"大众struts.action.extension\"大众修正action的后缀,如: <constant name=\"大众struts.action.extension\"大众 value=\公众do\"大众/> 如果用户须要指定多个要求后缀,则多个后缀之间以英文逗号(,)隔开。<constant name=\"大众struts.action.extension\公众 value=\公众do,go\"大众/>
4.struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域工具?
方案一: HttpServletRequest request =ServletActionContext.getRequest(); HttpServletResponse response =ServletActionContext.getResponse(); HttpSession session= request.getSession(); ServletContext servletContext=ServletActionContext.getServletContext(); 方案二: 类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware 把稳:框架自动传入对应的域工具
5.ActionContext、ServletContext、pageContext的差异?
1)ActionContext是当前的Action的高下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的工具的引用; 2)ServletContext是域工具,一个web运用中只有一个ServletContext,生命周期伴随全体web运用; 3)pageContext是JSP中的最主要的一个内置工具,可以通过pageContext获取其他域工具的运用,同时它是一个域工具,浸染范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域工具中最小的。
6.描述Struts2的事情事理
客户端发送要求--》要求经由一系列过滤器->FilterDispatcher通过ActionMapper来决定这个Request须要调用哪个Action ->FilterDispatcher把要求的处理交给ActionProxy-> 通过ConfigurationManager讯问Struts配置文件(Struts.xml)找到须要调用的Action类->ActionProxy创建一个ActionInvocation的实例 ->调用Action->实行完毕,返回结果
7.result的type属性中有哪几种结果类型?
一共10种: dispatcher struts默认的结果类型,把掌握权转发给运用程序里的某个资源不能把掌握权转发给一个外部资源,若须要把掌握权重定向到一个外部资源, 该当利用 redirect结果类型 redirect 把相应重定向到另一个资源(包括一个外部资源) redirectAction 把相应重定向到另一个 Action freemarker、velocity、chain、httpheader、xslt、plainText、stream
8.拦截器的生命周期与事情过程?
1)每个拦截器都是实现了Interceptor接口的 Java 类; 2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对干系资源进行必要的初始化; 3)intercept(ActionInvocation invocation): 每拦截一个动作要求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 5)struts2中有内置了18个拦截器。
9.struts2如何完成文件的上传?
1、JSP页面: 1)JSP页面的上传文件的组件:<s: file name=”upload” />,如果须要一次上传多个文件, 就必须利用多个 file 标签, 但它们的名字必须是相同的,即: name=“xxx”的值必须一样; 2)必须把表单的enctype属性设置为:multipart/form-data; 3)表单的方法必须为post,由于post提交的数据在体中,而无大小限定。 2、对应的action: 1)在 Action 中新添加 3 个和文件上传干系的属性; 2)如果是上传单个文件, uploadImage属性的类型便是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文 件的文件名和文件类型,定义办法是分别是: jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)如果上上传多个文件, 可以利用数组或 List
10.值栈ValueStack的事理与生命周期?
1)ValueStack贯穿全体 Action 的生命周期,保存在request域中,以是ValueStack和request的生命周期一样。当Struts2接管一个要求时,会迅速创建ActionContext, ValueStack,action。然后把action存放进ValueStack,以是action的实例变量可以被OGNL访问。 要求来的时候,action、ValueStack的生命开始,要求结束,action、 ValueStack的生命结束; 2)action是多例的,和Servlet不一样,Servelt是单例的; 3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action工具默认保存在栈顶; 4)ValueStack实质上便是一个ArrayList; 5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前要求的要求参数 request : 该 Map 中包含当前 request 工具中的所有属性 session :该 Map 中包含当前 session 工具中的所有属性 application :该 Map 中包含当前 application 工具中的所有属性 attr:该 Map 按如下顺序来检索某个属性: request, session, application 6)利用OGNL访问值栈的内容时,不须要#号,而访问request、session、application、attr时,须要加#号; 7)把稳: Struts2中,OGNL表达式须要合营Struts标签才可以利用。如:<s:property value=\"大众name\公众/> 8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时利用的\"大众$\"大众,而不是#或者%;
11.Struts2中的拦截器有什么用?列举框架供应的拦截器名称?
1)拦截器是struts2核心组成部分,它供应了一种机制,使得开拓者可以定义一个特定的功能模块,这个模块会在Action实行之前或者之后实行也可以在Action实行之前阻挡Action实行。 2)常用的拦截器有: chain:在不同要求之间将要求参数在不同名字件转换,要求内容不变 fileUpload:供应文件上传。 i18n:记录用户选择的区域环境 logger:输出Action的名字 params:将要求中的参数设置到Action中去。
12.Struts2有哪些优点?
1)在软件设计上Struts2的运用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计; 2)拦截器,实现如参数拦截注入等功能; 3)类型转换器,可以把分外的要求参数转换成须要的类型; 4)多种表现层技能,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验可以对指定某个方法进行校验; 6)供应了全局范围、包范围和Action范围的国际化资源文件管理实现 7) 实现MVC模式,构造清晰,使开拓者只关注业务逻辑的实现。有丰富的tag可以用,大提高了开拓效率。(简要)
13.ActionContext和ValueStack什么时候创建?是否是线程安全的?
明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的差异是,struts1的动作类是单例的。在每次动作实行前,核心掌握器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack工具。且每次动作访问都会创建。 这两个工具存储了全体动作访问期间用到的数据。并且把数据绑定到了线程局部变量ThreadLocal上了。所以是线程安全的。
14.一个要求在Struts2框架中的处理大概分为几个步骤?
1) 客户端初始化一个指向Servlet容器(例如Tomcat)的要求2 )这个要求经由一系列的过滤器Filter这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对付Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 )接着FilterDispatcher被调用,FilterDispatcher讯问ActionMapper来决定这个请是否须要调用某个Action4 )如果ActionMapper决定须要调用某个Action,FilterDispatcher把要求的处理交给ActionProxy5 )ActionProxy通过Configuration Manager讯问框架的配置文件,找到须要调用的Action类6 )ActionProxy创建一个ActionInvocation的实例。7 )ActionInvocation实例利用命名模式来调用,在调用Action的过程前后,涉及到干系拦截器(Intercepter)的调用。 8 )一旦Action实行完毕,ActionInvocation卖力根据struts.xml中的配置找到对应的返回结果。返回结果常日是一个须要被表示的JSP或者FreeMarker的模版。在表示的过程中可以利用Struts2 框架中继续的标签。在这个过程中须要涉及到ActionMapper
15.先容一下Struts的ActionServlet类
ActionServlet继续自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是中央掌握器。它供应一个中央位置来处理全部的终端要求。掌握器ActionServlet紧张卖力将HTTP的客户要求信息组装后,根据配置文件的指定描述,转发到适当的处理器。按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述当用户向做事器端提交要求的时候,实际上信息是首先发送到掌握器ActionServlet,一旦掌握器得到了要求,其就会将要求信息传交给一些赞助类(help classes)处理。这些赞助类知道如何去处理与要求信息所对应的业务操作。在Struts中,这个赞助类便是org.apache.struts.action.Action。常日开拓者须要自己继续Aciton类,从而实现自己的Action实例。
16.Spring是什么?
他办理的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿全体系统运用。 Spring是一个轻量级的IoC和AOP容器框架。目的是办理企业运用开拓的繁芜性,利用基本的JavaBean来完成以前只可能由EJB完成的事情,并供应了更多的企业运用功能,Spring的用场不仅限于做事器真个开拓,从大略性、可测试性和松耦合的角度而言,任何Java运用都可以从Spring中受益。
17.说说Spring 的优点?
1.spring属于低侵入式设计,代码的污染极低;2.spring的DI机制降落了业务工具更换的繁芜性;3.容器供应了AOP技能,利用它很随意马虎实现如权限拦截,运行期监控等功能;4.降落了组件之间的耦合性 ,实现了软件各层之间的解耦; 5.容器供应单例模式支持;6.可以利用容器供应的浩瀚做事,如事务管理,做事等;7.容器供应了浩瀚的赞助类,能加快运用的开拓;8.spring对付主流的运用框架供应了集成支持,如hibernate,JPA,Struts等 9.独立于各种运用做事器 10.Spring的高度开放性,并不逼迫运用完备依赖于Spring,开拓者可以自由选择spring的部分或全部。
18.说说你对Spring的IoC与DI的理解
(1)IOC便是掌握反转。便是工具的创建权反转交给Spring,由容器掌握程序之间的依赖关系,浸染是实现了程序的解耦合,而非传统实现中,由程序代码直接操控。(依赖)掌握权由运用代码本身转到了外部容器,由容器根据配置文件去创建实例并管理各个实例之间的依赖关系,掌握权的转移,是所谓反转,并且由容器动态的将某种依赖关系注入到组件之中。BeanFactory 是Spring IoC容器的详细实现与核心接口,供应了一个前辈的配置机制,使得任何类型的工具的配置成为可能,用来包装和管理各种bean。2.最直不雅观的表达便是,IOC让工具的创建不用去new了,可以由spring自动生产,这里用的便是java的反射机制,通过反射在运行时动态的去创建、调用工具。spring便是根据配置文件在运行时动态的去创建工具,并调用工具的方法的。3.Spring的IOC有三种注入办法 : 第一是根据属性注入,也叫set方法注入; 第二种是根据布局方法进行注入; 第三种是根据表明进行注入。详细的说:IOC掌握反转:将工具交给容器管理,你只须要在spring配置文件总配置相应的bean,以及设置干系的属性,让spring容器天生类的实例工具以及管理工具。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化以及装置好,然后在你须要调用的时候,就把它已经初始化好的那些bean分配给你须要调用这些bean的类。便是将工具的掌握权反转给spring容器管理。DI机制(Dependency Injection,依赖注入):可以说是IoC的个中一个内容,在容器实例化工具的时候主动的将被调用者(或者说它的依赖工具)注入给调用工具。比如工具A须要操作数据库,以前我们总是要在A中自己编写代码来得到一个Connection工具,有了 spring我们就只须要见告spring,A中须要一个Connection,至于这个Connection怎么布局,何时布局,A不须要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像注射一样,注射到A当中,这样就完成了对各个工具之间关系的掌握。
19.阐明Spring支持的几种bean的浸染域
Spring容器中的bean可以分为5个范围:1.singleton:这种bean范围是默认的,这种范围确保不管接管到多少个要求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来掩护。2.prototype:原形范围与单例范围相反,为每一个bean要求供应一个实例。3.request:在要求bean范围内会每一个来自客户真个网络要求创建一个实例,在要求完成往后,bean会失落效并被垃圾回收器回收。4.Session:与要求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失落效。5.global-session:global-session和Portlet运用干系。当你的运用支配在Portlet容器中事情时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量须要存储在global-session中。全局浸染域与Servlet中的session浸染域效果相同。
20.BeanFactory 接口和 ApplicationContext 接口有什么差异 ?
BeanFactory和ApplicationContext是Spring的两大核心接口,而个中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的容器,天生Bean实例的,并管理容器中的Bean。1.BeanFactory:是Spring里面最底层的接口,供应了最大略的容器的功能,卖力读取bean配置文档,管理bean的加载与实例化,掩护bean之间的依赖关系,卖力bean的生命周期,但是无法支持spring的aop功能和web运用。2.ApplicationContext接口作为BeanFactory的派生,因而具有BeanFactory所有的功能。而且ApplicationContext还在功能上做了扩展,以一种更面向框架的办法事情以及对高下文进行分层和实现继续,相较于BeanFactorty,ApplicationContext还供应了以下的功能: ①默认初始化所有的Singleton,也可以通过配置取消预初始化。②继续MessageSource,因此支持国际化。③资源访问,比如访问URL和文件。④事宜机制。⑤同时加载多个配置文件。⑥以声明式办法启动并创建Spring容器。⑦载入多个(有继续关系)高下文 ,使得每一个高下文都专注于一个特定的层次,比如运用的web层。BeanFactroy采取的是延迟加载形式来注入Bean的,即只有在利用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能创造一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次利用调用getBean方法才会抛出非常。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以创造Spring中存在的配置缺点,这样有利于检讨所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你须要的时候,你就不用等待,由于它们已经创建好了。相对付基本的BeanFactory,ApplicationContext 唯一的不敷是占用内存空间。当运用程序配置Bean较多时,程序启动较慢。BeanFactory常日以编程的办法被创建,ApplicationContext还能以声明的办法创建,如利用ContextLoader。BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的利用,但两者之间的差异是:BeanFactory须要手动注册,而ApplicationContext则是自动注册。
21.请阐明Spring Bean的生命周期?
首先说一下Servlet的生命周期:实例化,初始init,吸收要求service,销毁destroy; Spring高下文中的Bean生命周期也类似,如下:1.实例化一个Bean也便是我们常说的new;2.按照Spring高下文对实例化的Bean进行配置也便是IOC注入;3.如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处通报的便是Spring配置文件中Bean的id值;4.如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)通报的是Spring工厂自身可以用这个办法来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以;5.如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring高下文同样这个办法也可以实现步骤4的内容,但比4更好,由于ApplicationContext是BeanFactory的子接口,有更多的实现方法6.如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor常常被用作是Bean内容的变动,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被运用于内存或缓存技能;7.如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。8.如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;注:以上事情完成往后就可以运用这个Bean了,那这个Bean是一个Singleton的,以是一样平常情形下们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton。9.当Bean不再须要时,会经由清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个实在现的destroy()方法;10.末了,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。 其余我们这里描述的是运用Spring高下文Bean的生命周期,如果运用Spring的工厂也便是BeanFactory的话去掉第5步就Ok了。
22.先容下Spring的紧张模块?
Spring AOP:Spring的关键组件之一是AOP框架。AOP在Spring中利用:供应声明性的企业做事,特殊是作为EJB声明式做事的替代品。最主要的做事是声明式事务管理,它建立在Spring的事务抽象之上。许可用户实现自定义的切面,补充他们利用AOP的OOP的利用。Spring ORM:ORM包与数据库访问有关。它为盛行的工具关系映射api供应集成层,包括JDO、Hibernate和iBatis。Spring Web:web运用程序开拓堆栈,个中包括Spring MVC。Spring DAO:Spring的DAO(Data Access Object)支持紧张用于利用JDBC、Hibernate或JDO等技能标准化数据访问事情。Spring Context:此包构建在bean包之上,以增加对源的支持和不雅观察者的设计模式支持,以及运用程序工具利用同等的API得到资源的能力。Spring Web MVC:这是为web运用程序供应MVC实现的模块。Spring Core:核心包是Spring框架中最主要的组件。该组件供应依赖性注入特性。BeanFactory供应了一种工厂模式,它将诸如初始化、创造和访问工具与实际程序逻辑的访问分离开来。
23.Spring事务的种类和各自的差异?
spring支持编程式事务管理声明式事务管理两种办法:1.编程式事务管理利用TransactionTemplate或者直策应用底层的PlatformTransactionManager。对付编程式事务管理,spring推举利用TransactionTemplate。2.声明式事务管理建立在AOP之上的。实在质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在实行完目标方法之后根据实行情形提交或者回滚事务。声明式事务最大的优点便是不须要通过编程的办法管理事务,这样就不须要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做干系的事务规则声明或通过基于@Transactional表明的办法便可以将事务规则运用到业务逻辑中。3.显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开拓办法。声明式事务管理使业务代码不受污染,一个普通的POJO工具,只要加上表明就可以得到完备的事务支持。和编程式事务比较,声明式事务唯一不敷地方是,后者的最细粒度只能浸染到方法级别,无法做到像编程式事务那样可以浸染到代码块级别。
24.说说spring的事务传播行为?
spring事务的传播行为说的是当一个方法调用另一个方法时,事务该如何操作。1.PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。2.PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务实行。‘3.PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出非常。4.PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。5.PROPAGATION_NOT_SUPPORTED:以非事务办法实行操作,如果当前存在事务,就把当前事务挂起。6.PROPAGATION_NEVER:以非事务办法实行,如果当前存在事务,则抛出非常。7.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内实行。如果当前没有事务,则实行与PROPAGATION_REQUIRED类似的操作。
25.Spring事务的实现办法和实现事理
1.划分处理单元——IOC:由于spring办理的问题是对单个数据库进行局部事务处理的,详细的实现首相用spring中的IOC划分了事务处理单元。并且将对事务的各种配置放到了ioc容器中设置事务管理器,设置事务的传播特性及隔离机制。2.AOP拦截须要进行事务处理的类:Spring事务处理模块是通过AOP功能来实现声明式事务处理的,详细操作比如事务实施的配置和读取,事务工具的抽象,用TransactionProxyFactoryBean接口来利用AOP功能,天生proxy代理工具,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。 读取ioc容器事务配置属性,转化为spring事务处理须要的内部数据构造TransactionAttributeSourceAdvisor转化为TransactionAttribute表示的数据工具。 3.对事物处理实现事务的天生、提交、回滚、挂起:spring委托给详细的事务处理器实现。实现了一个抽象和适配。适配的详细事务处理器:DataSource数据源支持、hibernate数据源事务处理支持、JDO数据源事务处理支持,JPA、JTA数据源事务处理支持。这些支持都是通过设计PlatformTransactionManager、AbstractPlatforTransaction一系列事务处理的支持。为常用数据源支持供应了一系列的TransactionManager。结合:PlatformTransactionManager实现了TransactionInterception接口,让其与TransactionProxyFactoryBean结合起来,形成一个Spring声明式事务处理的设计体系。
26.Spring AOP是什么?
AOP:面向切面编程AOP技能利用一种称为“横切”的技能,解剖封装的工具内部,并将那些影响了多个类的公共行为封装到一个可重用模块,这样就能减少系统的重复代码,降落模块间的耦合度,并有利于未来的可操作性和可掩护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的紧张流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们常常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。
27.说说AOP实现事理
AOP:这里的AOP指的是面向切面编程思想,而不是Spring AOP紧张的的实现技能紧张有Spring AOP和AspectJ。1、AspectJ的底层技能。 AspectJ的底层技能是静态代理,即用一种AspectJ支持的特定措辞编写切面,通过一个命令来编译,天生一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对付下面说的运行时增强,编译时增强的性能更好。Spring AOPSpring AOP采取的是动态代理,在运行期间对业务方法进行增强,以是不会天生新类,对付动态代理技能,Spring AOP供应了对JDK动态代理的支持以及CGLib的支持。JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。须要得到被目标类的接口信息(运用Java的反射技能),天生一个实现了代理接口的动态代理类(字节码),再通过反射机制得到动态代理类的布局函数,利用布局函数天生动态代理类的实例工具,在调用详细方法前调用invokeHandler方法来处理。CGLib动态代理须要依赖asm包,把被代理工具类的class文件加载进来,修正其字节码天生子类。但是Spring AOP基于表明配置的情形下,须要依赖于AspectJ包的标准表明,但是不须要额外的编译以及AspectJ的织入器,而基于XML配置不须要。
28.请描述JDK动态代理和CGLI代理的差异?
1.JDK动态代理此时期理工具和目标工具实现了相同的接口,目标工具作为代理工具的一个属性,详细接口实现中,可以在调用目标工具相应方法前后加上其他业务处理逻辑。代理模式在实际利用时须要指定详细的目标工具,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道详细类的话,若何实现代理模式呢?这就引出动态代理。JDK动态代理只能针对实现了接口的类天生代理。2.CGLIB代理CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,紧张是对指定的类天生一个子类,覆盖个中的所有方法,以是该类或方法不能声明称final的。如果目标工具没有实现接口,则默认会采取CGLIB代理;如果目标工具实现了接口,可以逼迫利用CGLIB实现代理添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=\公众true\"大众/>)
29.若何用表明的办法配置Spring?
Spring在2.5版本往后开始支持用表明的办法来配置依赖注入。可以用表明的办法来替代XML办法的bean描述,可以将bean描述转移到组件类的内部,只须要在干系类上、方法上或者字段声明上利用表明即可。表明注入将会被容器在XML注入之前被处理,所往后者会覆盖掉前者对付同一个属性的处理结果。表明装置在Spring中是默认关闭的。以是须要在Spring文件中配置一下才能利用基于表明的装置模式。如果你想要在你的运用程序中利用关于表明的方法的话,参考如下的配置。<beans> <context:annotation-config/></beans>在 <context:annotation-config/>标签配置完成往后,就可以用表明的办法在Spring中向属性、方法和布局方法中自动装置变量。下面是几种比较主要的表明类型:@Required:该表明运用于设值方法。@Autowired:该表明运用于有值设值方法、非设值方法、布局方法和变量。@Qualifier:该表明和@Autowired表明搭配利用,用于肃清特定bean自动装置的歧义。JSR-250 Annotations:Spring支持基于JSR-250 表明的以下表明,@Resource、@PostConstruct 和 @PreDestroy。
30.如何在Spring中注入一个Java Collection?
• <list> : 该标签用来装置可重复的list值。 <!-- java.util.List --> <property name=\"大众customList\公众> <list> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>UK</value> </list> </property>• <set> : 该标签用来装置没有重复的set值。 <!-- java.util.Set --> <property name=\"大众customSet\公众> <set> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>UK</value> </set> </property>• <map>: 该标签可用来注入键和值可以为任何类型的键值对。 <!-- java.util.Map --> <property name=\公众customMap\"大众> <map> <entry key=\"大众1\公众 value=\"大众INDIA\"大众/> <entry key=\"大众2\"大众 value=\"大众Pakistan\"大众/> <entry key=\"大众3\"大众 value=\公众USA\"大众/> <entry key=\"大众4\公众 value=\公众UK\"大众/> </map> </property>• <props> : 该标签支持注入键和值都是字符串类型的键值对。 <!-- java.util.Properties --> <property name=\"大众customProperies\"大众> <props> <prop key=\"大众admin\"大众>admin@nospam.com</prop> <prop key=\"大众support\公众>support@nospam.com</prop> </props> </property>
以上架构师进阶专题:资料获取办法关注+转发后,私信关键词 【口试】即可获取!
私信关键词 【口试】即可获取!
私信关键词 【口试】即可获取!
主要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!