spring自动装配和通过java实现装配

1.组建扫描

在类上添加注解@Component注解可以实现组建扫描

@Component
public class A{
   ...  
}

2.自动装配

通过在属性上或者方法上添加@Autowired注解可以实现自动装配(在单例bean,没有歧义的情况下)

public class B{
   @Autowired
   private A a;
   ...     
  
}
public class B{
@Autowired
public B(A a){
...
} ... }

3.通过java代码实现显示装配

当使用第三方库时,无法实现自动装配,所以需要显示装配bean。在配置类中添加@Configuration注解,在方法上添加@Bean注解实现创建bean。

装配方式一:
@Configuration
public classs C{
   @Bean
   public A getA(){
      return new A();     
   } 

    @Bean
    public B setA(){
      return new B(getA());     
   } 
}

装配方式二:
@Configuration
public classs C{
   @Bean
   public A getA(){
      return new A();     
   } 

    @Bean
    public B setA(A a){
      return new B(a);     
   } 
}

4、自动装配与歧义性

spring的默认模式是单例模式,只有单例模式时,才可以实现自动装配。为了处理歧义性,有以下几种方式:

假设有以下多个bean

@Compant
public class Icecream extend Dessert{...}
@Compant
public class Cookie extend Dessert{...}
@Compant
public class Cake extend Dessert{...}

(1)标识首选Bean

利用@Primary注解

@Component
@Primary
public class Icecream extends Dessert{...}

(2)使用限定符表示不同的bean

@Autowired
@Qualifier("icecream")//这里使用Icecream类,它的bean的名字默认为类的名字首字母小写,即“icecream”
private Dessert dessert;

如果要使用自定义的bean的限定符:

定义:
@Component
@Qualifier("cold")
public class Icecream extends Dessert{...}

使用:
@Autowired
@Qualifier("cold")
private Dessert dessert;

5、bean的作用域

包含四种模式:

(1)单例模式:整个应用程序,只建立一个实例bean

(2)原型模式:每次注入或者通过spring上下文获取的时候,就建立一个实例bean

(3)会话模式:每个会话建立一个实例bean

(4)请求模式:每次请求建立一个实例bean

spring默认情况下,是单例模式,如果要用其他模式,可以用@Scope注解,并且配合@Component和@Bean使用。

@Component
@Scope("prototype")
public class A{
   ...
 }


@Bean
@Scope("prototype")
public A getA(){
    ...  
}