一. 三种依赖注入
1. 字段注入
@Autowire
private ExampleService exampleServiceImpl;
这种注入方式存在三个明显缺陷:
- 对象的外部可见性:也就是脱离了Spring容器那么这个对象就不会被注入进去。
- 循环依赖:字段注入不会被检测是否出现依赖循环。比如A类中注入B类,B类中又注入了A类。
- 无法设置注入对象为final:因为final的成员变量必须在实例化时同时赋值。
2. 构造器注入
private ExampleService exampleServiceImpl;
@Autowire
public ExampleController (ExampleService exampleServiceImpl){
this.exampleServiceImpl = exampleServiceImpl;
}
- 因为用了构造器所以保证一定可以独立使用,不依赖Spring容器。
- 可以检测循环依赖。
- 如果注入的很多,那么构造方法要写很多参数,代码结构不是很清楚。
3. Setter注入
private ExampleService exampleServiceImpl;
@Autowire
public setExampleServiceImpl (ExampleService exampleServiceImpl){
this.exampleServiceImpl = exampleServiceImpl;
}
- 利用set来注入保证不依赖Spring容器。
- 每个set单独注入某个对象,便于控制,并且可以实现选择性注入。
- 可以检测循环依赖。
结论:
因此一般如果强制注入选择构造器注入,可选注入的对象选择Setter注入方式。
二. Bean的作用域
1. @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
2. @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- 默认的作用域是单例模式,用在无状态的情况下。
- 多例模式用在有状态的情况,比如请求对象和会话对象。
三. @Bean和@Component
- @Component 修饰一个类,注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
- @Bean 修饰一个返回对象的方法上,这个类一般是一个配置类(@Configuration),@Bean告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean,通常方法中包含了产生bean实例的逻辑。
四. 常用的注解
- @Primary,@Qualifier 指定用那一个实例对象。
- @ComponentScan 设置组件扫描范围
- @Lazy 延迟加载