Spring Boot 关于 @Autowired 和 @Resource 注解问题。 - V2EX
PanameraM
V2EX    Java

Spring Boot 关于 @Autowired 和 @Resource 注解问题。

  •  
  •   PanameraM Dec 13, 2018 4106 views
    This topic created in 2706 days ago, the information mentioned may be changed or developed.

    当我使用 @Resource 注解时候,@Value 注解的属性都无法从 application.properties 中正确读取值,值都为 null。而使用 @Autowired 的时候却可以获取正确的值。注意:当我 debug 打断点时,程序还没有走到 @Bean 注解的代码段,也就是说还没有创建 Bean。还有不管使用 @Resource 还是 @Autowired 注解都能成功的将创建的 Bean 注册到 IOC 容器中。只是使用 @Resource 注解时创建的 Bean 的属性值都为 null,也就是前面提到的 @Value 拿不到 application.properties 里的值。不知道为什么会出现这种情况?请各位指导一下。。

    Bean 的依赖关系如下:jedisUtil -> jedisWritePool -> jedisPoolConfig

    代码如下:

    package cc.tianny.o2o.config.redis; import cc.tianny.o2o.cache.JedisPoolWriper; import cc.tianny.o2o.cache.JedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.JedisPoolConfig; import javax.annotation.Resource; /** * spring-redis 迁移配置 */ @Configuration public class RedisConfiguration { @Value("${redis.hostname}") private String hostname; @Value("${redis.port}") private int port; @Value("${redis.pool.maxActive}") private int maxTotal; @Value("${redis.pool.maxIdle}") private int maxIdle; @Value("${redis.pool.maxWait}") private long maxWaitMillis; @Value("${redis.pool.testOnBorrow}") private boolean testOnBorrow; // @Resource(name = "jedisPoolConfig") @Autowired private JedisPoolConfig jedisPoolConfig; // @Resource(name = "jedisWritePool") @Autowired private JedisPoolWriper jedisWritePool; // @Resource(name = "jedisUtil") @Autowired private JedisUtil jedisUtil; /** * 创建 redis 连接池的相关配置 * * @return */ @Bean(name = "jedisPoolConfig") public JedisPoolConfig createJedisPoolConfig() { JedisPoolConfig jedisPoolCOnfig= new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); jedisPoolConfig.setTestOnBorrow(testOnBorrow); return jedisPoolConfig; } @Bean(name = "jedisWritePool") public JedisPoolWriper createJedisPoolWriper() { return new JedisPoolWriper(jedisPoolConfig, hostname, port); } /** * 创建 Redis 工具类,封装好 Redis 的连接以进行相关操作 * * @return */ @Bean(name = "jedisUtil") public JedisUtil createJedisUtil() { JedisUtil jedisUtil = new JedisUtil(); jedisUtil.setJedisPool(jedisWritePool); return jedisUtil; } /** * Redis 的 key 操作 * * @return */ @Bean(name = "jedisKeys") public JedisUtil.Keys createJedisKeys() { return jedisUtil.new Keys(); } /** * Redis 的 Strings 操作 * * @return */ @Bean(name = "jedisStrings") public JedisUtil.Strings createJedisStrings() { return jedisUtil.new Strings(); } } 
    8 replies    2018-12-14 13:00:21 +08:00
    fmumu
        1
    fmumu  
       Dec 13, 2018   1
    可能需要 @PropertySource(value={"classpath:config.properties"})?
    PanameraM
        3
    PanameraM  
    OP
       Dec 14, 2018
    @fmumu 谢谢 试了下 没起效果
    alamaya
        4
    alamaya  
       Dec 14, 2018   1
    翻翻源码呗,肯定是 Autowired 的注入顺序和 Resource 的注入时机不一样,导致你用 Resource 注入的时候 property 根本还没注入进来,而你对 value 的依赖是写在代码里的,容器不可能分析你的依赖关系
    fffay
        5
    fffay  
       Dec 14, 2018   2
    @Value 和 @Resource 注解没什么关系的,AutowiredAnnotationBeanPostProcessor 你可以在这个类里面打个断点看看,不知道你有没有指定什么别的 ApplicationContext,一般 Spring boot 默认的都会注册 AutowiredAnnotationBeanPostProcessor 这个 bean 的,这个 processor 会处理对 @Value 和 @Autowired 的注入。如果解决了,麻烦说一下是什么原因造成的
    qiyuey
        6
    qiyuey  
       Dec 14, 2018   2
    @Configuration 内不需要使用 @Autowired,只需要将 [被依赖的 Bean 对象] 作为 [依赖方 @Bean 方法] 的入参即可
    PanameraM
        7
    PanameraM  
    OP
       Dec 14, 2018
    @qiyuey 是的。我用你的方法。将上面的 @Autowired 的注解去掉,是没有问题的。
    PanameraM
        8
    PanameraM  
    OP
       Dec 14, 2018
    @fay9395 暂时还不清楚。还要再研究下。
    About     Help     Advertise     Blog     API     FAQ     Solana     1008 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 59ms UTC 22:35 PVG 06:35 LAX 15:35 JFK 18:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86