`

Spring中@Profile的妙用

阅读更多

       最近项目中需要开发一个定时任务,项目中已经落地spring cloud微服务框架,schedule task server作为一个独立服务部署,但是业务层逻辑代码又包含在主服务的一个module中,在开发阶段启动过多的服务与开发调试不便,于是想着将定时任务集成到主服务中便于调试(类似Unit Test),但是在生产环境中又要保证这个定时任务不会在主服务中启动,此时@Profile 闪亮登场。

 

@Profile("dev")
@Component
public class TestTask {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Scheduled(cron = "*/10 * * * * ?")
    public void testJob() {
        log.debug("****************start*****************");
        // do something......
        log.debug("*****************end *****************");
    }
}

  

 

       使用过SpringBoot的朋友应该知道,spring boot能在运行时自动为我们选择不同的profile环境配置,例如,dev环境,test测试环境,prd生产环境的各个数据库用户名,密码等都不相同,spring boot的服务启动时会根据我们指定的profile选择对应的配置,省去我们手动更改或执行脚本更改的步骤。这里@Profile({"dev")的意思是当指定的profile=dev时,@Component注解将会生效,TestTask对象将会被注册到Spring的bean工厂中去,定时任务会被执行,相反,如果指定的profile不为dev,@Component注解会失效,注册动作将不会发生。

 

接下来查看@Profile的定义:

 

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({ProfileCondition.class})
public @interface Profile {
    String[] value();
}

 

    了解注解的朋友会注意到 String[] value(); value是一个数组? 没错,@Profile可以指定多个环境的profile,例如 @Profile({"dev", "test"})表示此任务将会在profile为dev或test环境中被执行。另外,value支持取反 "!" 运算符操作,@Profile("!dev")表示代码将在profile不为dev的环境中生效。

 

    相信读者已经能对@Profile的妙用有所体会,最后再提醒大家注意的一点是,当指定多个profile时,各个profile之间是 “or” 条件生效,例如@Profile({"dev", "!test"})表示代码将在profile=dev或者profile!=test时生效,另外当前不支持多个profile之间的 与 操作,对此有疑问的朋友可以google "AndProfilesCondition"类,许多人对“多个prifile不支持与操作”的问题耿耿于怀,在Stack Overflow上还能见到其他网友对这个类的代码实现。

 

 

 

 

分享到:
评论

相关推荐

    通过实例了解Spring中@Profile的作用

    Spring 中 @Profile 的作用...3. 代码重用:@Profile 可以使代码更加 tái用,例如可以在不同的环境中使用同一个 bean。 @Profile 是 Spring 框架中的一种非常有用的注解,可以帮助开发者更好地管理不同的环境和配置。

    面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip

    面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:...

    spring @profile注解的使用方法

    然后,在我们的Java类中,使用@Profile注解来标明当前的环境,例如: ```java @Component @Profile("develop") public class DevelopConfig { @Value("develop.db.url") private String url; // ... } @...

    SpringBoot中的Profile配置的使用示例源码

    2. **使用@Profile注解** - 我们可以在类或方法上使用`@Profile`注解,指定该类或方法仅在特定profile下生效。例如: ```java @Component @Profile("dev") public class DevConfig { // ... } ``` 这表示`...

    浅谈spring注解之@profile

    例如,下面是一个使用@Profile注解的示例: ```java @Service("productRpc") @Profile("prod") public class ProductRpcImpl implements ProductRpc { public String productBaseInfo(Long sku) { return ...

    获取Spring中@PathVariable注解里带点的完整参数.doc

    当我们使用 @PathVariable 注解来获取 URL 中的参数时,如果参数带有点号(.),Spring 会自动截断参数,例如: * 访问 http://127.0.0.1:8080/param/hehe 返回 hehe * 访问 ...

    Spring @Profile注解实现多环境配置

    @Profile 注解可以用在类上,也可以用在方法上,根据 Spring 版本的不同,@Profile 注解的使用方式也不同。在 Spring 3.2 之前,@Profile 注解用在类上,而在 Spring 3.2 之后,@Profile 注解用在方法上。 下面是一...

    java @Profile注解详解

    在下面的示例代码中,我们使用@Profile注解来配置不同的数据库连接: ```java @PropertySource("classpath:/dbconfig.properties") @Configuration public class MainConfigOfProfile implements ...

    Spring @compenent注解详解

    在Spring框架中,`@Component`注解是核心的组件注解之一,它标志着一个类作为Spring IoC容器中的Bean。这个注解及其派生注解(如`@Service`、`@Repository`和`@Controller`)是Spring依赖注入(Dependency Injection...

    springboot通过@Profile注解配置不同环境

    在本案例中,我们将深入探讨如何使用`@Profile`注解以及结合Maven来实现多环境配置。 首先,`@Profile`注解用于标记一个类或方法,表示该类或方法只在指定的环境中生效。例如,我们可以为开发环境创建一个`...

    Spring中@Async注解执行异步任务的方法

    现在,我们可以在Service类中使用@Async注解来异步化方法。例如: ```java @Service public class BusinessService { private static final Logger log = LoggerFactory.getLogger(BusinessService.class); @...

    spring-@Transactional-jar

    spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可

    Spring Boot系列四 Spring @Value 属性注入使用总结一

    Spring Boot系列四 Spring @Value 属性注入使用总结一

    Spring注解@Component、@Repository、@Service、@Controller区别.doc

    Spring 注解@Component、@...在 Spring 2.5 及更高版本中,我们可以使用自动扫描机制来扫描组件,而不需要在 XML 文件中配置 Bean。我们可以使用元素来启用自动扫描机制,并指定要扫描的包和子包。 例如: ``` ...

    Spring注解 - 52注解 - 原稿笔记

    在火狐中显示可能会有问题,大家都是程序员,改个参数就好啦 注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before ,...

    Spring @Primary和@Qualifier注解原理解析

    如果我们不使用@Primary注解,那么在测试类中注入Sheet类型的bean时,Spring容器不知道该加载哪个bean,会出现歧义问题。但是,如果我们在SheetB上添加@Primary注解,那么Spring容器就会优先加载SheetB Bean。 @...

    Spring注解 @Component、@Repository、@Service、@Controller区别

    当一个类被标记为`@Component`时,Spring IoC容器会根据这个注解将其作为一个bean注册到容器中,使得其他组件可以通过依赖注入的方式使用它。 **示例代码:** ```java @Component public class UtilityClass { ...

    详解Spring关于@Resource注入为null解决办法

    在上面的示例代码中,我们使用 @Resource 注解的方式来创建 UserDao 对象,这样,Spring 框架就可以将对象注入到 UserDao 对象中去了。 三、知识点总结 1. 使用 @Resource 注解的对象不能使用 new 关键字来创建,...

Global site tag (gtag.js) - Google Analytics