当前位置: 首页 > news >正文

小型项目外包网站网站建设多少钱一年

小型项目外包网站,网站建设多少钱一年,网络营销外包推广定制公司,wordpress主题科技类1. 什么是spring? Spring是一个轻量级Java开发框架#xff0c;最早有Rod Johnson创建#xff0c;目的是为了解决企业级应用开发的业务 逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack#xff08;一站式#xff09;轻量级开源框架#xff0c; 为开…1. 什么是spring? Spring是一个轻量级Java开发框架最早有Rod Johnson创建目的是为了解决企业级应用开发的业务 逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack一站式轻量级开源框架 为开发Java应用程序提供全面的基础架构支持。Spring最根本的使命是解决企业级应用开发的复杂性即简化Java开发。Spring可以做很多事情它为企业级开发提供给了丰富的功能但是这些功能的底层都依赖于它的两个核心特性也就是依赖注入dependency injectionDI和面向切面编程aspect-oriented programmingAOP。为了降低Java开发的复杂性Spring采取了以下4种关键策略 基于POJO的轻量级和最小侵入性编程通过依赖注入和面向接口实现松耦合基于切面和惯例进行声明式编程通过切面和模板减少样板式代码。 2. Spring框架的设计目标设计理念和核心是什么? Spring设计目标Spring为开发者提供一个一站式轻量级应用开发平台 Spring设计理念在JavaEE开发中支持POJO和JavaBean开发方式使应用面向接口开发充分支持 OO面向对象设计方法Spring通过IoC容器实现对象耦合关系的管理并实现依赖反转将对象之 间的依赖关系交给IoC容器实现解耦 Spring框架的核心IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系通过 AOP以动态非侵入的方式增强服务。 3. Spring的优缺点是什么 优点 方便解耦简化开发Spring就是一个大工厂可以将所有对象的创建和依赖关系的维护交给Spring管理。AOP编程的支持可以方便的实现对程序进行权限拦截、运行监控等功能。声明式事务的支持只需要通过配置就可以完成对事务的管理而无需手动编程。方便程序的测试Spring对Junit4支持可以通过注解方便的测试Spring程序。方便集成各种优秀框架Spring不排斥各种优秀的开源框架其内部提供了对各种优秀框架的直接支持如Struts、Hibernate、MyBatis等。降低JavaEE API的使用难度Spring对JavaEE开发中非常难用的一些APIJDBC、JavaMail、远程调用等都提供了封装使这些API应用难度大大降低。 缺点Spring明明一个很轻量级的框架却给人感觉大而全。Spring依赖反射反射影响性能。使用门槛升高入门Spring需要较长时间。 4.Spring由哪些模块组成 Spring 总共大约有 20 个模块 由 1300 多个不同的文件构成。 而这些组件被分别整合在 核心容器 Core Container 、 AOPAspect Oriented Programming和设备支持Instrmentation 、 数据访问与集成Data Access/Integeration 、 Web 、 消息Messaging 、 Test 等 7 个模块中 spring core提供了框架的基本组成部分包括控制反转Inversion of ControlIOC和依赖 注入Dependency InjectionDI功能。spring beans提供了BeanFactory是工厂模式的一个经典实现Spring将管理对象称为 Bean。spring context构建于 core 封装包基础上的 context 封装包提供了一种框架式的对象访问方 法。spring jdbc提供了一个JDBC的抽象层消除了烦琐的JDBC编码和数据库厂商特有的错误代码解 析 用于简化JDBC。spring aop提供了面向切面的编程实现让你可以自定义拦截器、切点等。spring Web提供了针对 Web 开发的集成特性例如文件上传利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。spring test主要为测试提供支持的支持使用JUnit或TestNG对Spring组件进行单元测试和集成 测试。 5.Spring 框架中都用到了哪些设计模式 工厂模式BeanFactory就是简单工厂模式的体现用来创建对象的实例单例模式Bean默认为单例模式代理模式Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术模板方法用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate观察者模式定义对象键一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的 对象都会得到通知被制动更新如Spring中listener的实现–ApplicationListener。 6.Spring框架中有哪些不同类型的事件 上下文更新事件ContextRefreshedEvent在调用ConfigurableApplicationContext 接口中 的refresh()方法时被触发上下文开始事件ContextStartedEvent当容器调用ConfigurableApplicationContext的 Start()方法开始/重新开始容器时触发该事件上下文停止事件ContextStoppedEvent当容器调用ConfigurableApplicationContext的 Stop()方法停止容器时触发该事件上下文关闭事件ContextClosedEvent当ApplicationContext被关闭时触发该事件。容器被 关闭时其管理的所有单例Bean都被销毁请求处理事件RequestHandledEvent在Web应用中当一个http请求request结束触发 该事件。如果一个bean实现了ApplicationListener接口当一个ApplicationEvent 被发布以后 bean会自动被通知。 7.Spring 应用程序有哪些不同组件 接口定义功能。Bean 类它包含属性setter 和 getter 方法函数等。Bean 配置文件包含类的信息以及如何配置它们。AOP提供面向切面编程的功能。用户程序它使用接口。 8.什么是Spring IOC 容器 控制反转即IoC (Inversion of Control)它把传统上由程序代码直接操控的对象的调用权交给容器通 过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移从程序代 码本身转移到了外部容器。Spring IOC 负责创建对象管理对象通过依赖注入DI装配对象配置对象并且管理这些对象的整个生命周期。 9.控制反转(IoC)有什么作用 管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事在对象关系比较复杂时如 果依赖关系需要程序猿来维护的话那是相当头疼的。解耦由容器去维护具体的对象。托管了类的产生过程比如我们需要在类的产生过程中做一些处理最直接的例子就是代理如果 有容器程序可以把这部分处理交给容器应用程序则无需去关心类是如何完成代理的。 10.IOC的优点是什么 IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。 11.Spring IoC 的实现机制 Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 interface Fruit {public abstract void eat();}class Apple implements Fruit {public void eat() {System.out.println(Apple);}}class Orange implements Fruit {public void eat() {System.out.println(Orange);}}class Factory {public static Fruit getInstance(String ClassName) {Fruit f null;try {f (Fruit) Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}class Client {public static void main(String[] a) {Fruit f Factory.getInstance(io.github.dunwu.spring.Apple);if (f ! null) {f.eat();}}}12.Spring 的 IoC支持哪些功能 依赖注入依赖检查自动装配支持集合指定初始化方法和销毁方法支持回调某些方法但是需要实现 Spring 接口略有侵入 13.BeanFactory 和 ApplicationContext有什么区别 BeanFactory和ApplicationContext是Spring的两大核心接口都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 依赖关系 BeanFactory是Spring里面最底层的接口包含了各种Bean的定义读取bean配置文档管理bean的加载、实例化控制bean的生命周期维护bean之间的依赖关系。 ApplicationContext作为BeanFactory的派生除了提供BeanFactory所具有的功能外还提供了 更完整的框架功能 1继承MessageSource因此支持国际化 2统一的资源文件访问方式 3提供在监听器中注册bean的事件 4同时加载多个配置文件 5载入多个有继承关系上下文 使得每一个上下文都专注于一个特定的层次比如应用的web层。加载方式 BeanFactroy采用的是延迟加载形式来注入Bean的即只有在使用到某个Bean时(调用getBean())才对该Bean进行加载实例化。这样我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。 ApplicationContext它是在容器启动时一次性创建了所有的Bean。这样在容器启动时我们就可以发现Spring中存在的配置错误这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean通过预载入单实例bean ,确保当你需要的时候你就不用等待因为它们已经创建好了。创建方式 BeanFactory通常以编程的方式被创建 ApplicationContext还能以声明的方式创建如使用ContextLoader。注册方式 BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用但两者之间的区别是BeanFactory需要手动注册而ApplicationContext则是自动注册。 14.Spring 如何设计容器的 Spring 中设计了两个接口 BeanFactory 和 ApplicationContext 用以表示容器。 BeanFactory 简单粗暴可以理解为就是个 HashMapKey 是 BeanNameValue 是 Bean 实例。通常只提供注册put获取get这两个功能。我们可以称之为 “低级容器”。 ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。例如资源的获取支持多种消息例如 JSP tag 的支持对BeanFactory 多了工具级别的支持等待。所以你看他的名字已经不是 BeanFactory 之类的工厂了而是 “应用上下文” 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法此方法是用于刷新整个容器即重新加载/刷新所有的 bean。 15.ApplicationContext通常的实现是什么 FileSystemXmlApplicationContext 此容器从一个XML文件中加载beans的定义XML Bean 配置文件的全路径名必须提供给它的构造函数。 ClassPathXmlApplicationContext此容器也从一个XML文件中加载beans的定义这里你需要正确设置classpath因为这个容器将在classpath里找bean配置。 WebXmlApplicationContext此容器加载一个XML文件此文件定义了一个WEB应用的所有bean。 16.什么是Spring的依赖注入 控制反转IoC是一个很大的概念可以用不同的方式来实现。其主要实现方式有两种依赖注入和依赖查找。 依赖注入相对于IoC而言依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入 Dependency Injection即组件之间的依赖关系由容器在应用系统运行期来决定也就是由容器 动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件不做定位查询 只提供普通的Java方法让容器去决定依赖关系。 17.依赖注入的基本原则是什么 依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该 由IoC容器负责“查找资源”的逻辑应该从应用组件的代码中抽取出来交给IoC容器负责。容器全权负 责组件的装配它会把符合依赖关系的对象通过属性JavaBean中的setter或者是构造器传递给需要 的对象。 18.依赖注入有什么优势 查找定位操作与应用代码完全无关。不依赖于容器的API可以很容易地在任何容器以外使用应用对象。不需要特殊的接口绝大多数对象可以做到完全不必依赖容器。 19.依赖注入实现方式有哪些 依赖注入是时下最流行的IoC实现方式依赖注入分为接口注入Interface InjectionSetter方法注入Setter Injection和构造器注入Constructor Injection三种方式。其中接口注入由于在灵活性和易用性比较差现在从Spring4开始已被废弃。 构造器依赖注入构造器依赖注入通过容器触发一个类的构造器来实现的该类有一系列参数每个参数代表一个对其他类的依赖。 Setter方法注入Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后调用该bean的setter方法即实现了基于setter的依赖注入。 20.构造器依赖注入和 Setter方法注入的区别 两种依赖方式都可以使用构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依 赖setter方法实现可选依赖。 21.什么是Spring beans Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化装配和管 理。这些beans通过容器中配置的元数据创建。比如以XML文件中 的形式定义。 22.一个 Spring Bean 定义 包含什么 一个Spring Bean 的定义包含容器必知的所有配置元数据包括如何创建一个bean它的生命周期详情 及它的依赖。 23.如何给Spring 容器提供配置元数据 XML配置文件。基于注解的配置。基于java的配置。 24.Spring配置文件包含了哪些信息 Spring配置文件是个XML 文件这个文件包含了类信息描述了如何配置它们以及如何相互调用。 25.Spring基于xml注入bean的几种方式 Set方法注入构造器注入①通过index设置参数的位置②通过type设置参数类型静态工厂注入实例工厂 26.怎样定义类的作用域 以通过bean 定义中的scope属性来定义。如当Spring要在需要的时候每次生产一个新的bean实例bean的scope属性被指定为prototype。另一方面一个bean每次使用的时候必须返回同一个实例这个bean的scope 属性 必须设为 singleton。 27.Spring支持的几种bean的作用域 singleton : bean在每个Spring ioc 容器中只有一个实例。prototype一个bean的定义可以有多个实例。request每次http请求都会创建一个bean该作用域仅在基于web的Spring ApplicationContext情形下有效。session在一个HTTP Session中一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。global-session在一个全局的HTTP Session中一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 注意 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考因为频繁创建和销毁 bean 会带来很大的性能开销。 28.Spring框架中的单例bean是线程安全的吗? 不是Spring框架中的单例bean不是线程安全的。spring 中的 bean 默认是单例模式spring 框架并没有对单例 bean 进行多线程的封装处理。实际上大部分时候 spring bean 无状态的比如 dao 类所有某种程度上来说 bean 也是安全的但如果 bean 有状态的话比如 view model 对象那就要开发者自己去保证线程安全了最简单的就是改变 bean 的作用域把“singleton”变更为“prototype”这样请求 bean 相当于 new Bean()了所以就可以保证线程安全了。 有状态就是有数据存储功能。无状态就是不会保存数据。 29.Spring如何处理线程并发问题 在一般情况下只有无状态的Bean才可以在多线程环境下共享在Spring中绝大部分Bean都可以声 明为singleton作用域因此Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理解决线程安全问题。 ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换 空间”的方式仅提供一份变量不同的线程在访问前需要获取锁没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象在编写多线程代码时可以把不安全的变量封装进ThreadLocal。 30.Spring框架中bean的生命周期有哪几个阶段 Spring Bean的生命周期只有这四个阶段实例化 - 属性赋值 - 初始化 - 销毁实例化和属性赋值对应构造方法和setter方法的注入初始化和销毁是用户能自定义扩展的两个阶段。每个阶段的工作为 实例化创建一个Bean对象填充属性为属性赋值初始化 1如果实现了 xxxAware 接口通过不同类型的Aware接口拿到Spring容器的资源 2如果实现了BeanPostProcessor接口则会回调该接口的postProcessBeforeInitialzation 和 postProcessAfterInitialization 方法 3如果配置了 init-method 方法则会执行 init-method 配置的方法销毁 1容器关闭后如果Bean实现了 DisposableBean 接口则会回调该接口的 destroy 方法 2容器关闭后如果配置了 destroy-method 方法则会执行 destroy-method 配置的方法。 31.bean生命周期有哪些重要的方法 bean 有两个重要的生命周期方法 1setup它是在容器加载bean的时候被调用。 2teardown它是在容器卸载类的时候被调用。 bean 标签有两个重要的属性init-method和destroy-method。用它们你可以自己定制初始化和注销方法。它们也有相应的注解PostConstruct和PreDestroy。 32.什么是Spring的内部bean什么是Spring inner beans 在Spring框架中当一个bean仅被用作另一个bean的属性时它能被声明为一个内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现内部bean通常是匿名的它们的Scope一般是prototype。 33.什么是bean装配 是指在Spring 容器中把bean组装到一起前提是容器需要知道bean的依赖关系如何通过依赖注入来把它们装配到一起。 34.什么是bean的自动装配 在spring中对象无需自己查找或创建与其关联的其他对象由容器负责把需要相互协作的对象引用赋 予各个对象使用autowired来配置自动装载模式。 35.spring 自动装配 bean 有哪些方式 在Spring框架xml配置中共有5种自动装配 no默认的方式是不进行自动装配的通过手工设置ref属性来进行装配bean。byName通过bean的名称进行自动装配如果一个bean的 property 与另一bean 的name 相同就进行自动装配。byType通过参数的数据类型进行自动装配。constructor利用构造函数进行装配并且构造函数的参数通过byType进行装配。autodetect自动探测如果有构造方法通过 construct的方式自动装配否则使用 byType的 方式自动装配。 36.使用Autowired注解自动装配的过程是怎样的 使用Autowired注解来自动装配指定的bean。在使用Autowired注解之前需要在Spring配置文件进行配置context:annotation-config /。 在启动spring IoC时容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器当容器扫描到Autowied、Resource或Inject时就会在IoC容器自动查找 需要的bean并装配给该对象的属性。在使用Autowired时首先在容器中查询对应类型的bean 如果查询结果刚好为一个就将该bean装配给Autowired指定的数据如果查询的结果不止一个那么Autowired会根据名称来查找如果上述查找的结果为空那么会抛出异常。解决方法时使用requiredfalse。 37.自动装配有哪些局限性 重写你仍需用 和 配置来定义依赖意味着总要重写自动装配。基本数据类型你不能自动装配简单的属性如基本数据类型String字符串和类。模糊特性自动装配不如显式装配精确如果有可能建议使用显式装配。 38.可以在Spring中注入一个null 和一个空字符串吗 可以 39. FactoryBean 和 BeanFactory有什么区别 BeanFactory是Bean的工厂ApplicationContext 的父类IOC容器的核心负责生产和管理Bean。 FactoryBean是 Bean可以通过实现 FactoryBean 接口定制实例化 Bean 的逻辑通过代理一个Bean对象对方法前后做一些操作。 40. 什么是循环依赖 循环依赖是一个或多个对象实例之间存在直接或间接的依赖关系这种依赖关系构成了一个 环形调用其实就是一个死循环的过程。循环依赖的三种情况 1自己依赖自己的直接依赖 2两个对象之间的直接依赖 3多个对象之间的间接依赖 41.循环依赖的N种场景 单例的setter注入 Service publicclass TestService1 {Autowiredprivate TestService2 testService2;public void test1(){} }Service publicclass TestService2 {Autowiredprivate TestService1 testService1;public void test2(){} } 这是一个经典的循环依赖但是它能正常运行得益于spring的内部机制三级缓存 让我们根本无法感知它有问题。多例的setter注入 Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) Service publicclass TestService1 {Autowiredprivate TestService2 testService2;public void test1(){} }Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) Service publicclass TestService2 {Autowiredprivate TestService1 testService1;public void test2(){} } 如果只有上面两个多例循环依赖的话程序是能够正常启动的因为多例对象不会被提前初始化bean 所以程序能够正常启动。如果在定义一个单例的类在它里面注入TestService1这时候就会出现循环依赖 的报错并且这种报错问题是无法解决的因为它没有用缓存每次都会生成一个新对象。 Service publicclass TestService3 {Autowiredprivate TestService1 testService1; }构造器注入 Service publicclass TestService1 {public TestService1(TestService2 testService2) {} }Service publicclass TestService2 {public TestService2(TestService1 testService1) {} } 出现循环依赖报错构造器注入没能添加到三级缓存也没有使用缓存所以也无法解决循环依赖问题。单例的代理对象setter注入 Service publicclass TestService1 {Autowiredprivate TestService2 testService2;Asyncpublic void test1(){} }Service publicclass TestService2 {Autowiredprivate TestService1 testService1;public void test2(){} } 这种通过Async注解的场景会通过 AOP 自动生成代理对象在bean初始化完成之后后面还有一步去检查 第二级缓存中的对象 和 原始对象 是否相等因为生成的是代理对象与原始对象不相等所以报错。DependsOn循环依赖 DependsOn(value testService2) Service publicclass TestService1 {Autowiredprivate TestService2 testService2;public void test1(){} }DependsOn(value testService1) Service publicclass TestService2 {Autowiredprivate TestService1 testService1;public void test2(){} } 在 AbstractBeanFactory 类的 doGetBean 方法中会检查dependsOn的实例有没有循环依赖 如果有循环依赖则抛异常。42.spring三级缓存是什么 一级缓存singletonObjects用于保存实例化、属性注入、初始化都完成的bean实例保存的是成品 。二级缓存earlySingletonObjects是对三级缓存的过渡性处理通过 getObject() 方法从三级缓存的BeanFactory中取出Bean这个Bean虽然已实例化但是没有进行属性填充还没有完成初始化是一个不完整的对象再将这个不完整的对象put到二级缓存 。三级缓存singletonFactories在实例化对象之后会为其创建一个 Bean 工厂并将此工厂的ObjectFactory对象加入到三级缓存中。所以三级缓存中保存的是原材料工厂以便于后面扩展创建代理对象。 43.Spring是怎么解决循环依赖的 Spring 解决循环依赖有两个前提条件 不全是构造器方式的循环依赖必须是单例 本质上解决循环依赖的问题就是三级缓存通过三级缓存提前拿到未初始化的对象。 第三级缓存用来保存一个对象工厂提供一个匿名内部类用于创建二级缓存中的对象 第二级缓存用来保存实例化完成但是未初始化完成的对象 第一级缓存用来保存实例化、初始化都完成的对象 假设一个简单的循环依赖场景A、B互相依赖且都没有初始化过具体操作流程 开始创建对象A实例化的时候把A对象工厂放入三级缓存A注入属性时发现依赖B转而去实例化B同样创建对象B实例化的时候把B对象工厂放入三级缓存B注入属性时发现依赖A依次从一级到三级缓存查询A从三级缓存通过A对象工厂拿到A对象并把A对象放入二级缓存同时删除三级缓存中的A对象工厂此时B已经拿到A对象完成属性注入并且初始化完成把B对象放入一级缓存接着继续创建A对象顺利从一级缓存拿到实例化且初始化完成的B对象A对象创建也完成删除二级缓存中的A对象同时把A对象放入一级缓存中。最后一级缓存中保存着实例化、属性注入、初始化都完成的A、B对象。 因此由于把实例化和初始化的流程分开了所以如果都是用构造器的话就没法分离这个操作 所以都是构造器的话就无法解决循环依赖的问题了。 44.为什么要三级缓存二级不行吗? 不可以主要是为了生成代理对象。因为三级缓存中放的是生成具体对象的匿名内部类他可以生成代理对象也可以是普通的实例对象。使用三级缓存主要是为了保证不管什么时候使用的都是一个对象。假设只有二级缓存的情况往二级缓存中放的显示一个普通的Bean对象在 BeanPostProcessor 去生 成代理对象之后覆盖掉二级缓存中的普通Bean对象那么多线程环境下可能取到的对象就不一致了。 45.spring常用注解有哪些 Component这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。Controller这将一个类标记为 Spring Web MVC 控制器。标有它的Bean会自动导入到IoC容器。Service此注解是组件注解的特化。它不会对 Component 注解提供任何其他行为。您可以在服务层类中使用 Service 而不是 Component因为它以更好的方式指定了意图。Repository这个注解是具有类似用途和功能的 Component 注解的特化。它为 DAO 提供了额外的好处。Required这个注解表明bean的属性必须在配置的时候设置通过一个bean定义的显式的属性值或通过自动装配若Required注解的bean属性未被设置容器将抛出异常。Autowired默认是按照类型装配注入的默认情况下它要求依赖对象必须存在可以设置它required属性为false。Resource默认是按照名称来装配注入的只有当找不到与名称匹配的bean才会按照类型来装配 注入。Qualifier当创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时可以使用Qualifier 注解 和 Autowired 通过指定应该装配哪个确切的 bean 来消除歧义。RequestMapping用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方 法。 46.JdbcTemplate是什么 JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象执行写好 的或可调用的数据库操作语句提供自定义的数据错误处理。 47.spring 事务实现方式有哪些 编程式事务管理这意味你通过编程的方式管理事务给你带来极大的灵活性但是难维护。 声明式事务管理这意味着你可以将业务代码和事务管理分离你只需用注解和XML配置来管理事务。 48.Spring的事务传播行为有哪些 1PROPAGATION_REQUIRED如果当前没有事务就创建一个新事务如果当前存在事务就 加入该事务该设置是最常用的设置。 2PROPAGATION_SUPPORTS支持当前事务如果当前存在事务就加入该事务如果当前不 存在事务就以非事务执行。 3PROPAGATION_MANDATORY支持当前事务如果当前存在事务就加入该事务如果当前 不存在事务就抛出异常。 4PROPAGATION_REQUIRES_NEW创建新事务无论当前存不存在事务都创建新事务。 5PROPAGATION_NOT_SUPPORTED以非事务方式执行操作如果当前存在事务就把当前 事务挂起。 6PROPAGATION_NEVER以非事务方式执行如果当前存在事务则抛出异常。 7PROPAGATION_NESTED如果当前存在事务则在嵌套事务内执行。如果当前没有事务则 按REQUIRED属性执行。 49.spring 的事务隔离级别有哪些 spring 有五大隔离级别默认值为 ISOLATION_DEFAULT使用数据库的设置其他四个隔离级别和 数据库的隔离级别是一样的如果spring 中设置的隔离级别与数据库中的不一致时以spring中设置的为准 1ISOLATION_DEFAULT用底层数据库的设置隔离级别数据库设置的是什么我就用什么 2 ISOLATION_READ_UNCOMMITTED未提交读最低隔离级别、事务未提交前就可被其他事务读取会出现幻读、脏读、不可重复读 3 ISOLATION_READ_COMMITTED提交读一个事务提交后才能被其他事务读取到会造成幻 读、不可重复读SQL server 的默认级别 4 ISOLATION_REPEATABLE_READ可重复读保证多次读取同一个数据时其值都和事务开始时候的内容是一致禁止读取到别的事务未提交的数据会造成幻读MySQL 的默认级别 5 ISOLATION_SERIALIZABLE序列化代价最高最可靠的隔离级别该隔离级别能防止脏读、不可重复读、幻读。 50.什么是AOP AOP(Aspect-Oriented Programming)一般称为面向切面编程作为面向对象的一种补充用于将那 些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取并封装为一个可重用的模块这个模 块被命名为“切面”Aspect减少系统中的重复代码降低了模块间的耦合度同时提高了系统的可 维护性。可用于权限认证、日志、事务处理等。 51.Spring AOP and AspectJ AOP 有什么区别 AOP实现的关键在于代理模式AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ 动态代理则以Spring AOP为代表。 1AspectJ是静态代理的增强所谓静态代理就是AOP框架会在编译阶段生成AOP代理类因此也 称为编译时增强他会在编译阶段将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。 2Spring AOP使用的动态代理所谓的动态代理就是说AOP框架不会去修改字节码而是每次运行 时在内存中临时为方法生成一个AOP对象这个AOP对象包含了目标对象的全部方法并且在特定的切 点做了增强处理并回调原对象的方法。 3静态代理与动态代理区别在于生成AOP代理对象的时机不同相对来说AspectJ的静态代理方式具有更好的性能但是AspectJ需要特定的编译器进行处理而Spring AOP则无需特定的编译器处理。 52.JDK动态代理和CGLIB动态代理的区别 Spring AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理 JDK动态代理只提供接口的代理不支持类的代理。核心InvocationHandler接口和Proxy类 通过实现InvocationHandler接口的 invoke()方法反射来调用目标类中的代码动态地将横切逻辑和业务编织在一起接着Proxy利用 InvocationHandler动态创建一个符合某一接口的实例, 生成目标类的代理对象。如果代理类没有实现 InvocationHandler 接口那么Spring AOP会选择使用CGLIB来动态代理目 标类。CGLIBCode Generation Library是一个代码生成的类库可以在运行时动态的生成 指定类的一个子类对象并覆盖其中特定方法并添加增强代码从而实现AOP。CGLIB是通过继承 的方式做的动态代理因此如果某个类被标记为final那么它是无法使用CGLIB做动态代理的。 53.代理是什么 将 Advice 应用于目标对象后创建的对象称为代理。 54.Spring AOP里面的几个名词解释 1切面Aspect切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 在Spring AOP中切面可以使用通用类基于模式的风格 或者在普通类中以 AspectJ 注解来实现。 2连接点Join point连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中并添加新的行为。 3通知Advice在AOP术语中切面的工作被称为通知。 4切入点Pointcut切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确 的类和方法名称或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。 5引入Introduction引入允许我们向现有类添加新方法或属性。 6目标对象Target Object 被一个或者多个切面aspect所通知advise的对象。它通常 是一个代理对象。也有人把它叫做被通知adviced对象。 既然Spring AOP是通过运行时代理实现 的这个对象永远是一个被代理proxied对象。 7织入Weaving织入是把切面应用到目标对象并创建新的代理对象的过程。 54.Spring只支持方法级别的连接点 因为Spring基于动态代理所以Spring只支持方法连接点。Spring缺少对字段连接点的支持而且它不 支持构造器连接点。方法之外的连接点拦截功能我们可以利用AspectJ来补充。 55.通知有哪些类型 前置通知Before在目标方法被调用之前调用通知功能后置通知After在目标方法完成之后调用通知此时不会关心方法的输出是什么返回通知After-returning 在目标方法成功执行之后调用通知异常通知After-throwing在目标方法抛出异常后调用通知环绕通知Around通知包裹了被通知的方法在被通知的方法调用之前和调用之后执行自定 义的行为。
http://www.tj-hxxt.cn/news/227518.html

相关文章:

  • 校友网站建设方案wordpress 自动翻译
  • html5 手机网站 教程外贸建站网站建设
  • 专业网站设计制作个人帮忙做网站吗
  • 阿里网站seo网站图片居中代码
  • 中国建设银行网站的社保板块在哪里客户管理系统哪找
  • 江苏省工程建设协会网站小型营销企业网站建设策划
  • 网站集群建设pptwordpress软件推荐
  • 企业免费自助建站平台照片做成视频的软件
  • 自媒体网站源码模板dedewordpress动
  • 网站建网站建设seo帮帮您惠州百度seo找谁
  • 网站建设预算策划网站开发收税
  • 四川住房和城乡建设厅网站打不开毕业季网站如何做网页
  • 网站优化排名优化上海精品网站建设
  • 福州网站建设策划动漫制作技术专业入门
  • 水安建设集团网站wordpress 更改目录
  • 我有网站 怎么做淘宝推广的黄骅做网站的电话
  • 建设网站有什么原则网易企业邮箱改密码
  • 网站建设步骤域名备案中网站可以开通
  • 芜湖网站优化软文广告经典案例300
  • 网站建设费用固定资产怎么入设计好看的企业网站
  • 旅游网站开发设计文档购买网络商城系统
  • 网络上建个网站买东西多少钱wordpress个人博客主题2019
  • 软件公司做网站兰州网络推广的平台
  • 静态网站做等级保护网站建设必会的软件有哪些
  • 哪个在家做兼职网站比较好ui设计是什么含义
  • 优化手机访问网站速度哈尔滨网站搜索优化公司
  • 地方美食网站开发意义北碚网站建设公司
  • 合肥做网站便宜建站网址平台
  • 网站如何做延迟加载中国企业100强排名
  • 北海网站设计公司镇江外贸网站建设