spring配置方式
一、综述
Spring
容器负责创建应用程序中的bean
并通过DI
(依赖注入)来协调他们的关系,那么我们需要去告诉Spring
需要创建哪些bean
以及如何将其组合到一起(那么bean
的装配就可以通俗的理解为依赖关系的注入)。在自动配置的方式中,使用@Component
去告诉Spring
,我是一个bean
,你要来管理我,然后使用@AutoWired
注解去装配bean
。在JavaConfig
中,@Configuration
加上这个注解的类的作用你可以理解为这个配置类相当于xml
文件的作用,@Bean
就可以理解为xml
中的bean
标签
隐式的bean发现机制(包扫描)和自动装配
在Java中显式配置
在XML中显式配置
上述是几种基本的方式,当然我们也可以采用混用不同的配置方式如下:
在Java中引用xml中配置的Bean
在XML中引用Java中配置的Bean
二、不同方式装配具体说明
1. 自动化装配
想要实现自动化装配我们可以从两个方向考虑:
- 组件扫描,Spring自动发现应用上下文中创建的bean
- 自动装配,Spring自动满足Bean之间的依赖
(1)首先我们需要开启组件扫描(默认不开启)
@ComponentScan
注解方式开启
在包扫描的过程中,都是从基础包开始扫描,扫描它下面的所以类
# 我们需要扫描的包和当前类不在一个包里面,需要显示说明基础包
@ComponentScan(basePackages=”类名“)
# 我们如果有多个基础包
@ComponentScan(basePackages={”类名1“,”类名2“,...})
@ComponentScan(basePackageClasses={类名1.class,类名2.class,...})#建议这种写法
<context:component-Scan base-package="包名">
XML方式开启,当然也可以利用它的子标签实现不扫描哪些包,只扫描哪些包。
(2)其次我们需要让Spring知道哪些需要创建Bean也就是哪些POJO需要添加到容器中,这里我们可以使用@Component
注解进行标注。@Component
泛指组件。注意:@Component
一般用在自动装配,它将这个类对应Spring容器中的一个bean。
(3)如果我们还需要自定义这个组件的id就需要这么写@Component("自定义id")
,如果不声明id那就是默认为类名的首字母小写。
(4)为了实现自动装配,满足依赖关系,我们需要借助@Autowired
注解,如果不存在匹配的bean装配到需要的地方,程序将会报错,为避免这种情况我们可以指定@Autowired
的required
属性为false
,即@Autowired(required=false)
bean歧义性解决
2. 通过Java代码装配
实现以下三步
(1)创建配置类
使用@Configuration
声明这个是配置类
推荐做法:将不同功能的JavaConfig
放到不同的类中,如果需要组合使用那么再写相应的配置模块将其组合在一起通过@import
导入需要的配置类,当然你也可以通过@ImportResource
导入需要的XML
配置文件
(2)声明Bean
@Bean
是一个方法级别上的注解,主要用在@Configuration
注解的类里, 也可以用在@Component
注解的类里。同时这个bean
的默认id
为方法名
,当然你也可以通过Bean
的name
属性指定id
,就像这样@Bean(name='自定义id')
可以看这篇文章了解更多Bean的相关
官方文档中文版
(3)实现注入,解决依赖
@Bean
带注释的方法可以有任意数量的参数来描述创建这个bean所需的依赖关系。就像下面这样
@Configuration
public class AppConfig {
//将需要依赖的项作为参数传入
@Bean
public TransferService transferService(AccountRepository accountRepository) {
return new TransferServiceImpl(accountRepository);
}
}
3. 通过XML配置文件装配
(1)通过无参构造器装配
<bean id="自定义id可以不写默认有,但最好自己写" class="全限定的类名"></bean>
(2)通过有参构造器装配
<bean id="" class="">
<constructor-arg></constructor-arg>
<constructor-arg>
<set>
<value></value>
<ref></ref>
</set>
</constructor-arg>
</bean>
- 通过
<constructor-arg>
子元素传入需要的参数,如果是引用则用到ref
属性,如果是字面量则用到value
属性. - spring3.0以后也可以采用
c-空间命名
,但是它不能传入集合类的参数,而<constructor-arg>
可以。但我们也可使用到util-空间命名
,解决属性为集合的问题
(3)属性设置
属性设置规则:强依赖使用构造器注入,弱依赖使用属性注入。
这里需要用到<property>
子元素,当然你也可以采用P-空间命名