Spring实战(1)
本博客是参考Spring实战第四版,对其中重要的知识点进行总结。
-
Spring是如何简化java开发的?
答:(1)基于POJO的轻量级和最小侵入性编程;(2)通过依赖注入和面向接口来松耦合;(3)基于切面和惯例进行声明式编程;(4)通过切面和模板来减少样板式代码;
-
配置Spring容器三种主要的装配机制?
答:(1)在XML中显示配置;(2)在java中进行显示配置;(3)隐式的bean发现机制和自动装配;
-
Spring从两个角度来实现自动化装配?
答:(1)组件扫描:Spring会自动发现上下文中所创建的bean;(2)自动装配:Spring自动满足bean之间的依赖;
-
Spring依赖注入DI的功能是如何实现的?
答:任何一个有实际意义的应用都会由两个或者多个类组成,这些类之间相互协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象的引用,这样会导致高度耦合并难以测试。例如如下代码:
可以看到,DamselRescuingKnight在它的构造函数中创建了RescueDamselQuest。这使得DamselRescuingKnight紧密的和RescueDamselQuest耦合到了一起,因此就极大的限制了这个骑士探险的能力。而通过DI,对象的依赖关系将由系统中协调各对象的第三方组件在创建对象的时候进行设定。对象无需自己创建或者管理他们的依赖关系。
我们可以看到,不同于之前的DamselRescuingKnight,BraveKnight没有没有自行创建探险任务,而是在探险的时候把任务作为参数传入。
-
观察Spring是如何工作的?
答:Spring通过应用上下文(Application Context)装载bean的定义并把他们组装起来。Spring上下文全权负责对象的创建和组装。
-
AOP应用?
正如你所看到的,Minstrel是只有两个方法的简单类。在骑士探险之前或者之后都会调用相应的函数。接下来我们该如何把吟游诗人和骑士探险结合起来呢?如果是如下方式调用,
这样就到时每次骑士进行探险都要命令吟游诗人去给他进行记录,这样合理吗?所以我们利用AOP,你可以声明吟游诗人必须去歌颂骑士探险,而骑士不需要去管吟游诗人。将Minstrel声明一个切面。
-
Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean。
答:完成这两个动作有三种方式,一种是使用自动配置的方式、一种是使用JavaConfig的方式,一种就是使用XML配置的方式。在自动配置的方式中,使用@Component去告诉Spring,我是一个bean,你要来管理我,然后使用@AutoWired注解去装配Bean(所谓装配,就是管理对象直接的协作关系)。然后在JavaConfig中,@Configuration其实就是告诉spring,spring容器要怎么配置(怎么去注册bean,怎么去处理bean之间的关系(装配))。那么久很好理解了,@Bean的意思就是,我要获取这个bean的时候,你spring要按照这种方式去帮我获取到这个bean。到了使用xml的方式,也是如此。均不见<bean>标签就是告诉spring怎么获取这个bean,各种<ref>就是手动的配置bean之间的关系。如下图分别是三种方式的代码:
-
配置profile bean?
答:Spring为环境相关的bean所提供的解决方案其实与构建时的方案没有太大区别。当然,在这个工程中需要根据环境决定常见那个bean和不创建那个bean。不过Spring并不是在构建的时候做出这样的决策,而是等到运行来再决定。这样的结果就是同一个部署单元能够使用说有的环境,没有必要进行重新构建。Spring引入了bean profile功能。可以使用@profile来指定那个bean属于profile。
在Spring确定那个profile处于激活状态时,需要依赖两个独立的属性:spring.profiles.active和spring.profiles.default。如果设置了spring.profiles.active属性的话,那么他的值就会用来确定那个profile被激活;如果没有设置spring.profiles.active的话,那么spring将会查找spring.profiles.default值。如果这两个都没有设置的话,那么就没有profile被激活。可以在web.xml中设置默认的profile。
-
限定自动装配的bean:@qualifier注解是使用限定符主要方式之一。
-
bean的作用域?
答:在默认情况下bean是以单例的形式创建的。也就是说,不管一个bean被注入到其他bean中多少次,每次所注入的都是一个实例。Spring定义了多种作用域,可以基于这些作用域来创建bean,包括:单例(Singleton):在整个应用中,只创建一个bean的实例;原型(Prototype):每次注入或者通过应用上下文获取的时候,都会创建一个新的bean实例;会话(session):在web应用中,为每个会话创建一个bean实例;请求(Request):在web应用中,为每个请求创建一个bean实例。
-
运行时值注入?
答:Spring提供了两种在运行时求值的方式:(1)属性占位符(Property placeholder);(2)Spring表达语言(SpEL)。
在XML中进行配置:
使用SpEL表达语言: