-
依赖注入带来的最大收益:松耦合。如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
-
spring 通过应用上下文装载 bean 的定义并把它们组装起来,全权负责对象的创建和组装。
-
在基于 spring 的应用中,你的应用对象存在于 spring 容器中,spring 容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期。
-
spring 有两种类型的容器实现,bean 工厂是最简单的容器,提供基本的依赖注入支持。应用上下文基于 beanFactory 构建,并提供应用框架级别的服务。
-
创建应用对象之间协作关系的行为称为装配,这是依赖注入的本质。
-
spring 提供了三种装配机制:在 xml 中进行显式配置;在 java 中进行显式配置;隐式的 bean 发现机制和自动装配。既可单独使用,也可相互搭配。在进行显式配置时,推荐使用类型安全、对重构友好并且更强大的 JavaConfig。通常会将 JavaConfig 放在单独的包中,与应用程序逻辑分离开。
-
spring 从两个角度实现自动化装配:组建扫描和自动装配。
-
@component
注解表明类会作为组建类,并告知 spring 为这个类创建 bean,免去显式配置。 -
通过 java 代码装配,
@conponentScan
注解表示在spring 中启动组件扫描,默认扫描与配置类相同的包。 -
xml 中启动组件扫描
<context:component-scan base-package="basePackage">
。 -
@contextConfiguration(classes=xxx.class)
表示在 xxx 中加载配置。 -
@Autowired
注解表示将 bean 注入到代码中。(@Inject
) -
spring 应用上下文中所有的 bean 都有一个 ID,默认为类名(小写首字母)。
-
可使用@
component("aaa")
来给 bean 自定义 ID。(@Named
也可以) -
@ComponentScan("packageName")
或@ComponentScan(basePackages="packageName")
可指定组件扫描的基础包。@ComponentScan(basePackages="name1","name2")
可指定多个基础包。@ComponentScan(basePackageClasses={aaa.class, bbb.class})
可指定类所在的包为基础包。可以在包中创建一个用来扫描的空标记接口,避免引用任何实际的应用程序代码。 -
@Configuration
表明类为配置类。 -
在 JavaConfig 中声明 bean,需编写一个方法,并添加
@Bean
注解,告诉 spring 这个方法返回一个对象,这个对象为应用上下文中的 bean,方法体中包含产生 bean 实例的逻辑。默认情况下 beanID 为方法名相同,可重命名方法,或通过 name 属性指定名字。@Bean(name="newName")
。 -
在 JavaConfig 中装配 bean 的最简单方式就是引用创建 bean 的方法,在引用时,spring 会拦截下所有对该引用的调用,确保最终返回的是 spring 创建的 bean。默认情况下,spring 中的 bean 都是单例的。
-
更好的装配方式是在创建所需要的 bean 时,将依赖的对象作为参数,调用创建 bean 的方法时,spring 会自动装配一个满足条件的 bean 到方法中。这种装配方式不要求 bean 在同一个配置中声明。在 JavaConfig 中,带
@Bean
注解的方法可以使用任何必要的 java 功能产生 bean 实例。 -
在 xml 配置中要以 beans 元素为根,
<bean class="packageName.className.class" />
,默认 ID 为"packageName.ClassName#0",可以借助 id 属性为 bean 设置 ID。通常为了减少 xml 中繁琐的配置,只对需要按名字引用的 bean 进行明确地命名。 -
在 xml 中借助构造器实现注入
<constructor-arg ref="beanID"/>
。或使用 c-命名空间。<bean class="packageName.className.class" c:<id>-ref="beanID" />
-
<constructor-arg value="HumorousNotFunny" />
或<bean class="..." c:_<id>="HumorousNotFunny" />
可实现字面量的注入。 -
可以使用
<constructor-arg><list><value>HumorousNotFunny</value><value>AAA</value></list></constructor-arg>
来装配字面量集合,list 中<ref bean="beanID" />
装配 bean 集合。c-命名空间无法实现通过属性装配集合。 -
作为通用规则,可以对强依赖使用构造器注入,对可选性依赖使用属性注入。
-
<property name="targetBeanID" ref="beanID" />
为属性的 setter 方法提供注入。与 c-命名空间对应的 p-命名空间,p:target-ref="beanID"
。 -
可以使用 util-命名空间简化 bean 的装配。借助
<util:list>
装配 list。<util:list id="beanID"><value>HumorousNotFunny</value><value>AAA</value></util:list>
。 -
在 JavaConfig 中可以使用
@Import(anotherConfig.class)
来导入其他 JavaConfig。导入多个 JavaConfig@Import({conf1.class, conf2.class})
。 -
使用
@ImportResource("classpath:config.xml")
可以导入位于根路径下的 xml 配置。 -
在 xml 配置中使用
<import resource="config.xml" />
可导入其他 xml 配置。 -
在 xml 配置中导入 JavaConfig 可以使用
<bean class="config" />
-
通常会创建一个根配置,将所有配置加载进来,并启动组件扫描。
-
Java
3190 引用 • 8214 回帖 • 1 关注
Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。
-
Spring
943 引用 • 1460 回帖 • 3 关注
Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于