SpringDI依赖注入

14次阅读

共计 3243 个字符,预计需要花费 9 分钟才能阅读完成。

DI 依赖注入

@Autowired(spring 的依赖注入注解)

1. 默认优先按照类型去 IOC 容器中获取对应的组件

application.getBean(Apple.class);

2. 如果找到多个相同类型的组件,默认再将属性名作为组件的 id,去 IOC 容器中查找;
3. 找到多相同类型的组件时, 指定使用特定组件 @Qualifier 指定要从装配的组件的 id,而不是属性名

@Autowired
@Qualifier("apple")
Apple apple;
// 首先组件上使用 @Primary 在配置类中的默认首选该类型的组件
// 当在其他 bean 中装配 apple 时, 首选使用 @Primary 注解配置的 bean 组件
@Configuration
public class MySpringIocConfig{

    @Bean
    @Primary
    public Apple apple(){return new Apple();
    }

    @Bean
    public Apple apple(){return new Apple();
    }
}

4.@Autowired 还能够在方法,构造器,参数等处使用

@Resource @Inject (JSRjava 标准注解)

@Resource (JSR250)

功能和 @Autowired 相似,默认按照组件名称进行装配;
不支持 @Primary 的功能, 不支持 @Autowired(required=true)
@Inject (JSR330)
需要导入相关依赖 javax.inject;
不支持 @Autowired(required=true)

装配 Spring 底层组件

自定义组件想要使用 spring 底层的组件,如 ApplicationContext,BeanFactory,XXX 等
自定义组件,只需要实现 xxxAware 接口

在创建 bean 的时候,会自动调用接口的相关方法,注入相关组件;类似与回调函数

@Component
public class PojoApplicationContextAwareImpl implements ApplicationContextAware,EnvironmentAware,EmbeddedValueResolverAware {
    // 获取全局信息
    private ApplicationContext applicationContext;
    // 获取运行时变量信息
    private Environment environment;
    // 获取值解析器 获取配置文件信息
    private StringValueResolver valueResolver;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}

    @Override
    public void setEnvironment(Environment environment) {this.environment=environment;}

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {this.valueResolver=resolver;}
}

@Profile

编写配置类 and 配置文件

// 配置类
@Configuration
@PropertySource("classpath:/db.properties")
public class MySpringConfig {@Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.driverClass}")
    private String driverClass;

    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev(){HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setUsername(username);
        hikariDataSource.setPassword(password);
        hikariDataSource.setDriverClassName(driverClass);
        hikariDataSource.setJdbcUrl("jdbc:mysql:///devDb?useUnicode=true&characterEncoding=UTF-8");
        return hikariDataSource;
}

    @Profile("test")
    @Bean("testDatasource")
    public DataSource dataSourceTest(){HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setUsername(username);
        hikariDataSource.setPassword(password);
        hikariDataSource.setDriverClassName(driverClass);
        hikariDataSource.setJdbcUrl("jdbc:mysql:///testDb?useUnicode=true&characterEncoding=UTF-8");
        return hikariDataSource;
}

    @Profile("prod")
    @Bean("prodDatasource")
    public DataSource dataSourceProd(){HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setUsername(username);
    hikariDataSource.setPassword(password);
    hikariDataSource.setDriverClassName(driverClass);
    hikariDataSource.setJdbcUrl("jdbc:mysql:///prodDb?useUnicode=true&characterEncoding=UTF-8");
    return hikariDataSource;
    }
}

// 配置文件 db.properties
db.username=root
db.password=root
db.driverClass=com.mysql.cj.jdbc.Driver

编写测试类

@Test
public void test(){AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext();
    // 添加活动的 profile
    applicationContext.getEnvironment().setActiveProfiles("dev");
    applicationContext.register(MySpringConfig.class);
    applicationContext.refresh();

    String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
    for (String a:beanNamesForType) {System.out.println(a);
    }
}

正文完
 0