spring注解@Autowired的失效

当工具类没有注解时,里面的@Autowired失效,大概是因为spring容器装配Bean之前工具类就加载的原因。

当加了注解后,应该是跟着spring的装配走了,@Autowired顺利找到对应的Bean进行注入,结果是成功的。

疑问:当工具类里面需要使用spring容器的Bean时,一般在生产环境上怎么解决比较优雅可行?

1. 只有被spring管理的类才可以注入

2.只有类修饰了@service 、@Controller、@Configuration...注解的类或者在xml配置文件中配置为bean的才会被spring管理

3. 工具类中的功能耦合性一般都比较低,可以在其他方法中直接new对象调用,或者类方法直接调用

4. 真的需要注入对象就使用spring注解就好,也可以在方法中传递对象到工具类中使用。

5. 没有什么优雅不优雅的,先保障功能,再确保效率,最后再考虑代码写的好不好看。

用Spring提供的钩子获取容器,之后通过容器获取对象。

@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext context;
    /**
     * Spring在bean初始化后会判断是不是ApplicationContextAware的子类
     * 如果该类是,setApplicationContext()方法,会将容器中ApplicationContext作为参数传入进去
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    /**
     * 通过Class返回指定的Bean
     */
    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }

    /**
     * 通过Name返回指定的Bean
     */
    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

}

 

 

可以在代码中加一个这样的工具类,这样不管是在线程中还是在你的那个工具类中,都可以获取到bean并使用,

有可能获取不到lazy的bean

正常就是通过@Autowired注解来注入service哦。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y