Spring3.0中Bean注入其他Bean的方法

Spring3.0中Bean注入其他Bean的方法

1.使用方法参数形式进行注入

就是将想要注入的Bean当成参数注入到另一个Bean中

1.容器中只存在一个要注入类型的Bean

当spring容器中只有一个要注入类型的Bean时,Spring会自动将该Bean注入
jdbc-config.properties

jdbc.driverClassName=com.mysql.jdbc.Driver

自己开发的Bean2,内部需要注入其他类

public class Bean2 {
    private String string;

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }
}

实际注入操作

@Configuration
@PropertySource("classpath:jdbc-config.properties")
public class ApplicationConf {
    @Value("${jdbc.driverClassName}") String driver;
    //获取配置文件中的值
    @Bean
    public String str1(){
        return driver;
    }

    @Bean
    public Bean2 bean2(String str1){
        Bean2 bean2 = new Bean2();
        bean2.setString(str1);
        return bean2;
    }

}

测试方法

public class Demo1  {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConf.class);
        Bean2 bean2 = context.getBean("bean2", Bean2.class);
        System.out.println(bean2.getString());
    }
}

显示结果:
Spring3.0中Bean注入其他Bean的方法_第1张图片

2.容器中存在两个及以上要注入类型的Bean

  1. 首先Spring容器会先根据类型进行匹配,如果存在多个,则进行名称的匹配
@Configuration
@PropertySource("classpath:jdbc-config.properties")
public class ApplicationConf {
    @Value("${jdbc.driverClassName}") String driver;
    //获取配置文件中的值
    @Bean
    public String str1(){
        return driver;
    }
    @Bean
    public String str2(){
        return "str2";
    }
    @Bean
    public Bean2 bean2(String str2){
        Bean2 bean2 = new Bean2();
        bean2.setString(str2);
        return bean2;
    }

}

显示结果是:
Spring3.0中Bean注入其他Bean的方法_第2张图片
2. 在注入前,方法参数进行人为指定@Qualifier(“str1”):

@Configuration
@PropertySource("classpath:jdbc-config.properties")
public class ApplicationConf {

    @Value("${jdbc.driverClassName}") String driver;
    //获取配置文件中的值
    @Bean
    public String str1(){
        return driver;
    }
    @Bean
    public String str2(){
        return "str2";
    }
    @Bean
    public Bean2 bean2(@Qualifier("str1") String str2){
        Bean2 bean2 = new Bean2();
        bean2.setString(str2);
        return bean2;
    }

}

显示结果:
Spring3.0中Bean注入其他Bean的方法_第3张图片

  1. 在Bean上进行声明 @Primary表示类型冲突时使用该Bean
@Configuration
@PropertySource("classpath:jdbc-config.properties")
public class ApplicationConf {

    @Value("${jdbc.driverClassName}") String driver;
    //获取配置文件中的值
    @Bean
    @Primary
    public String str1(){
        return driver;
    }
    @Bean
    public String str2(){
        return "str2";
    }
    @Bean
    public Bean2 bean2( String str2){
        Bean2 bean2 = new Bean2();
        bean2.setString(str2);
        return bean2;
    }
}

显示结果:
Spring3.0中Bean注入其他Bean的方法_第4张图片

2.使用方法进行注入

因为想要注入的Bean一定是已经注入到Spring 容器中的,并且是通过类的方法进行注入的,所以当另一个Bean需要依赖该Bean时,可以直接调用对应的方法返回Bean进行set设置进行注入

@Configuration
@PropertySource("classpath:jdbc-config.properties")
public class ApplicationConf {
    @Value("${jdbc.driverClassName}") String driver;
    //获取配置文件中的值
    @Bean
    public String str1(){
        return driver;
    }
    @Bean
    public String str2(){
        return "str2";
    }
 
    @Bean
    public Bean2 bean2( ){
        Bean2 bean2 = new Bean2();
        bean2.setString(str2());
        return bean2;
    }
}

限制是:只能在当前配置类中使用,当跨类时不能使用

并且使用@Configuration注解,当前配置类会动态生成代理对象,当设置当前Bean为prototype时,依赖的Bean即使是返回return new Object() ,依赖Bean始终是同一个Object

你可能感兴趣的:(#,框架,spring)