Loading... 最近在负责项目一期架构这块,涉及到的有MP逆向、Redis锁、Shiro等等,很多东西都还没有整理完,包括性能调优也还在拖。 这周末又要搬家orz。 只能gkd了 <!--more--> 开这个帖是因为之前Spring注解类、以及IOC、AOP的应用这块已经忘得一塌糊涂了,后续再补上吧。 现在碰到哪个补哪个。 --- ## @Bean和@Value注入先后问题 **场景:** 编写Shiro配置类的时候需要把方法 `@Bean`打成Bean形式配置,原先代码的配置读取方法需要通过Realm里的Service的 `@Value`属性 去读取。 但是不同文件下 `@Bean`优先于 `@Value`,所以在ShiroConfiguration中,即使实例化了IndexService对象,其属性也依旧为null。 尝试用@Component替代@Configuration、用@Order设定优先级,都无效。 **解决:** 在@Bean方法的参数中引入@Value。 ```Java @Bean("shiroRealm") public ShiroCasRealm shiroRealmBean(Map<String, String> customParameters, @Value("${service.code}") String serviceCode, @Value("${sso.server.url}") String ssoServiceUrl) { ShiroCasRealm shiroCasRealm = new ShiroCasRealm(); shiroCasRealm.setCustomParameters(customParameters); shiroCasRealm.setCasServerUrlPrefix(ssoServiceUrl); shiroCasRealm.setCasService(serviceCode); return shiroCasRealm; } ``` 其实这就是:**相同文件下,`@Value`比 `@Bean`先执行** 当然既然这样可以实现的话,如果频繁使用,可以直接在该配置文件引入属性值去获取,减少代码复用: ```java @Configuration public class ShiroConfiguration { @Value("${service.code}") private String serviceCode; @Value("${sso.server.url}") private String ssoServiceUrl; ... } ``` 还可以用@ConfigurationProperties(prefix = "service")替代所有的@Value注解。它可以让bean的属性与配置文件的属性一一对应: prefix:配置文件的前缀,通过.分隔多个前缀。 格式要求:bean属性要与配置文件的属性名相同(@ConfigurationProperties会默认去掉属性名中间的特殊符号,并且不区分大小写)。 ```java @Configuration @ConfigurationProperties(prefix = "service") public class ShiroConfiguration { private String code; private String ssoServiceUrl; ... } ``` 最后还可以尝试用Environment类去读取,但是没接触过这个不大会用。 **总结:** 相同文件下,`@Value`比 `@Bean`先执行。 不同文件下,`Bean`先执行。 Last modification:August 21, 2022 © Allow specification reprint Like 0 喵ฅฅ