Bean的自动装配:让spring自动识别如何装配Bean的依赖关系
自动装配的四种策略:
类型 |
策略 |
举例 |
byName |
把与Bean属性具有相同名字的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配 |
class="com.spring.demo.DemoBean" autowire="byName"> |
byType |
把与Bean属性具有相同类型的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配。spring提供两种装配设置,primary是true的优先装配,但该属性默认为true,所以设置了某个bean为优先装配时,需要将其他的bean的primary设置为false。若在自动装配时,希望排除某些bean,可以设置autowire-candidate为false |
primary="false"/> autowire-candidate=“false”/> |
constructor |
把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的对应属性中,没有匹配的不装配。 |
autowire=“constructor”/> |
autodetect |
首先尝试constructor装配,如果失败,再使用byType装配 |
autowire=“autodetect”/> |
注意:使用constructor自动装配策略时,必须让spring自动装配构造器的所有入参,不能混合使用constructor自动装配策略和
使用注解装配之spring自带注解@Autowired:
spring容器默认禁用注解装配的。我们需要在spring的配置在启动它才可以基于注解的自动装配。
1.标注setter方法,使用注解就可以移除配置文件里对应的
@Autowired
public void setDemoBean(DemoBean demoBean){
this.demoBean=demoBean
}
2.标注构造器
@Autowired
public DemoAnnotation(DemoBean demoBean){
this.demoBean=demoBean
}
3.标注自动装配Bean引用的任意方法
@Autowired
public void otherMethod(DemoBean demoBean){
this.demoBean=demoBean
}
4.直接标注属性,并删除setter方法
@Autowired
private DemoBean demoBean;
关于@Autowired使用的注意点:
1.装配时没有匹配的Bean,会抛出NoSuchBeanDefinitionException异常,比如有时候属性不一定必须要装配,可以为null,设置@Autowired的required属性为false,装配时如果没有找到匹配的Bean会设为null。
@Autowired(required=false)
private DemoBean demoBean;
2.匹配到多个Bean时,使用@Qualifier注解装配指定Id的Bean。
@Autowired
@Qualifier(“demoId”)
private DemoBean demoBean;
3.构造器装配,只能有一个Bean的构造器可以将@Autowired的required属性设置为true,其他的需设置为false。
使用注解装配之@Inject:
@Inject与@Autowired一样,只是@Inject没有@required属性,因此@Inject标注的依赖关系必须存在,否则会抛出异常。
相对于@Autowired对应的@Qualifier,@Inject对应的是@Named
@Autowired
@Name(“demoId”)
private DemoBean demoBean;
Bean的自动检测:让spring能自动识别哪些类需要配置成Spring Bean,从而减少对
基于注解的自动检测:
默认情况下,
@Component:通用的构造器注解,标识该类为spring组件。
@Controller: 标识该类定义为SpringMVC的controller
@Repository:标识该类定义为数据仓库
@Service: 标识该类为服务类
可以通过平配置
package com.spring.demo;
import org.springframework.stereotype.Component;
@Component
//如果要指定bean的Id,可以在注解上直接指定如:@Component(“defaultBean”)
public class DemoBean{
//省略
}
spring扫描com.spring.demo包时,会发现使用@Component注解所标注的类DemoBean,并自动将它注册为Spring Bean。Bean的Id默认为无限定类名:demoBean,如果要指定bean的Id,可以在注解上直接指定如:@Component(“defaultBean”)。
组件扫描的自动检测:
通过为