根据不同运行环境注入不同的bean的一种实现

使用场景:在开发和生产环境某些实现代码差异很大,来回切换代码太麻烦。(甚至某些依赖必须只能在生产环境才能使用)所以采用了根据运行环境注入不同的bean的做法。

首先把有差异的代码抽离出来,以接口的形式提供。


/**
 * @author jy
 */
public interface InfoTools {
    /**
     * 文章关键字匹配
     * @param content
     * @return
     */
    String dealInfoEntity(String content);

    /**
     * 文字转语音
     * @param content
     * @param mainTitle
     * @param infoId
     */
    String wordToVoice(String content, String mainTitle, String infoId);
}

提供两套实现,一套生产,一套开发测试

生产:

@Slf4j
public class InfoToolsProImpl implements InfoTools {
    // 生产环境才能使用的依赖
    private final SecuritiesInfosService securitiesInfosService;
    // 生产环境才能使用的依赖
    private final AudioServiceAgent audioServiceAgent;
    // 生产环境才能使用的依赖
    @Autowired
    UploadTools uploadTools;

    public InfoToolsProImpl(){//从配置文件获取bean注入
        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/jsf.xml");
        this.securitiesInfosService = (SecuritiesInfosService) appContext.getBean("securitiesInfos");
        this.audioServiceAgent = (AudioServiceAgent)appContext.getBean("audioServiceAgent");
    }

    @Override
    public String dealInfoEntity(String content) {
        //具体业务代码
        return "";
    }

    @Override
    public String wordToVoice(String content, String mainTitle, String infoId) {
        //具体业务代码
        return "";
    }

}

开发测试:

@Slf4j
public class InfoToolsImpl implements InfoTools {
    @Override
    public String dealInfoEntity(String content) {
        //具体业务代码
        return "";
    }

    @Override
    public String wordToVoice(String content, String mainTitle, String infoId) {
        //具体业务代码
        return "";
    }
}

再增加配置类:

@Slf4j
@Configuration
public class InfoToolsConfig implements EnvironmentAware {//实现EnvironmentAware接口
    private Environment environment;

    @Bean
    public InfoTools infoTools() {
        final String pro = "pro";
        String[] profiles = environment.getActiveProfiles();//获取当前运行环境
        if (pro.equals(profiles[0])) {//如果是生产环境,注入InfoToolsProImpl
            log.info("注入InfoToolsProImpl");
            return new InfoToolsProImpl();
        } else {
            log.info("注入InfoToolsImpl");
            return new InfoToolsImpl();
        }
    }

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

在使用时,只需要调用InfoTools接口的方法就可以了,InfoToolsConfig会根据不同的运行环境注入不同的实现类的。

使用:

@Autowired
InfoTools infoEntityApp;//自动注入接口

//在方法里直接调用
String keyWords = infoEntityApp.dealInfoEntity(content);

Bean注入一种依赖注入(DI)的实现方式,它通过容器在运行时动态地将依赖关系注入到对象中。在Java中,可以使用Spring框架实现Bean注入。 下面是Bean注入的代码实现: 首先,在Java中定义需要注入Bean: ```java public class UserService { private UserDao userDao; // setter方法,用于注入UserDao public void setUserDao(UserDao userDao) { this.userDao = userDao; } // 使用UserDao进行业务操作 public void addUser(User user) { userDao.addUser(user); } } ``` 然后,在Spring配置文件中配置Bean: ```xml <bean id="userService" class="com.example.UserService"> <property name="userDao" ref="userDao"/> </bean> <bean id="userDao" class="com.example.UserDaoImpl"/> ``` 在上面的配置中,创建了一个id为userService的Bean,并将其class设置为UserService。在property标签中,设置了name为userDao的属性,并使用ref引用了id为userDao的Bean。 最后,在Java代码中使用Bean: ```java // 加载Spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 获取userService Bean UserService userService = (UserService)context.getBean("userService"); // 使用userService User user = new User(); user.setName("张三"); user.setAge(20); userService.addUser(user); ``` 通过上面的代码,我们可以看到,通过Spring容器加载配置文件,获取userService Bean,并使用userService进行业务操作。在userService中,userDao已经被成功注入Bean中,无需手动创建对象或传递参数,大大简化了代码的编写和维护。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值