在Spring框架的发布版本中,共包含了20个不同的模块,可以划分为6类不同的功能。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入(DI)的本质。
当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:
Spring从两个角度来实现自动化装配:
@Component注解表明该类会作为组件类,并告知Spring要为这个类创建bean
@ComponentScan注解启用组件扫描
@Autowired注解实现自动装配
@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="knight" class="com.fiberhome.tongl.knight.BraveKnight"> <constructor-arg ref="quest" /> </bean> <bean id="quest" class="com.fiberhome.tongl.knight.SlayDragonQuest"> <constructor-arg value="#{T(System).out}" /> </bean> </beans>
在XML中声明DI时,会有多种可选的配置方案和风格。具体到构造器注入,有两种基本的配置方案可供选择:
属性注入,也有两种基本的配置方案可供选择:
尽可能地使用自动配置的机制。显式配置越少越好,以避免显式配置所带来的维护成本。当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),应该优先选择基于Java的配置,它比基于XML的配置更加强大、类型安全并且易于重构。最后,只有当你想要使用便利的XML命名空间,并且在JavaConfig中没有同样的实现时,才应该使用XML。
Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
单例是默认的作用域,但是正如之前所述,对于易变的类型,这并不合适。如果选择其他的作用域,要使用@Scope注解,它可以与@Component或@Bean一起使用。
在Spring中,处理外部值的最简单方式就是声明属性源并通过Spring的Environment来检索属性。
@PropertySource引用类路径中.properties的文件。
@Value 属性占位符(配置PropertySourcesPlaceholderConfigurer bean)
DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。
@AspectJ注解解表明类不仅仅是一个POJO,还是一个切面
@EnableAspectJAutoProxy注解启用自动代理功能
AspectJ提供了五个注解来定义通知