添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在公司的一个项目开发时,遇到了一个类的属性无法注入的问题

public class DemoController extends BaseController implements BussinessProcessHandler {
    @Autowired
    DemoApi demoApi;
    public void demo() {
        demoApi.DemoService();

如上代码运行中报空指针异常,demoApi的实例为nullspring容器没有注入Bean

起先认为是spring没有扫描到组件。spring boot的注解@SpringBootApplication继承了扫描注解@ComponentScan,默认扫描是当前包及其子包下的所有目录,查看目录结构是没有问题的。所以不是扫描的问题。

后来发现这个类DemoController的实例是反射生成的,并不由spring容器管理。

spring自动注入对象是通过创建一个BeanFactory并传入applicationContext配置文件对象,然后调用BeanFactorygetBean方法来实现相互依赖的对象获取和装配的。如果被注入的容器没有在spring bean中配置,而是通过反射途径生成,不能获取BeanFactory,就意味着不能进行自动注入。

自己创建一个SpringUtil工具类组件,实现BeanFactoryAware或者ApplicationContextAwarespring提供的接口,并通过实例手动获取Spring管理的bean

@Component
public class SpringUtil implements ApplicationContextAware {
    //ApplicationContext对象是Spring开源框架的上下文对象实例,在项目运行时自动装载Handler内的所有信息到内存。
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);

手动获取bean实例

public class DemoController extends BaseController implements BussinessProcessHandler {
    //@Autowired
    //DemoApi demoApi;
    public void demo() {
        //通过class获取bean
        DemoApi demoApi=SpringUtil.getBean(DemoApi.class);
        demoApi.DemoService();

这样再运行demoApi就不为null了。

问题在公司的一个项目开发时,遇到了一个类的属性无法注入的问题public class DemoController extends BaseController implements BussinessProcessHandler { @Autowired DemoApi demoApi; public void demo() { demoA... 根本原因: @Autowired注入Spring Bean,则当前类必须也是Spring Bean才能注入成功,不能用new xxx()来获得对象,这种方式获得的对象无法使用@Autowired注解注入Bean。 因此,当我们在new一个线程之后,发现线程里使用@Autowired注入对象都是空的 解决办法是:我们新增一个类,实现ApplicationContextAware接口 import java.lang.a...
在写一个工具类的时候遇到问题使用@Autowired无法自动注入bean。报空指针异常,获取到的对象值为null。 经过一番摸索实践,探究到根本原因:工具类使用@Autowired无法注入bean的原因大多是因为使用了静态方法,相应的,使用@Autowired注入对象也应该被static修饰,这样spring就无法正常注入bean,找到了原因,我也总结了三种解决方法。 第一种是我认为最简单...
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotyp
某个类中的成员,如果是采用@Autowired注入Spring Bean,则当前类的实例,必须也是Spring Bean才能成功注入,即该实例不能用new xxx()来获得,这种方式获得的实例无法调用@Autowired注入Bean,应该也采用@Autowired注入,注意在类上使用@Component注解。 其他注入失败的原因,注意这句话:“SpringBoot项目的Bean装配默认规则是根...
有没有扫描注解声明的bean类所在的包 使用@Autowired注入对象是否是bean的class指向的类或超类(父类) 使用@Autowired注入对象是否有多个bean(重复声明)或一个都没有(没有声明) 使用@Autowired注入对象所在的类是否是被new出来的.(UP表示好受伤) 其他,待总结
经过几次的实验,终于发现在Controller中使用@Autowired注解错误及启动时提示没有注入Bean的问题。 1.Autowired报红的问题 可以通过搜索 Autowiring for Bean Class把错误警告改成提示 2.针对启动时无法注入Bean的问题,必须在service层中的service接口的实现类上加入@Service或者@Component注解 启动工程失败,报错如下所示: Field demoService in .......... required a bean of type '...........' that could not be found. Consider defining a bean of type '..............' in your configuration. 原因分析:...
多线程无法注入Bean原因: 在spring中,如果需要在异步线程中注入bean,会发现bean是空的情况。原因据说是spring bean 出于线程安全考虑,不得注入bean至线程类(Runnable接口的派生类)。 spring中Bean的注入方式: 1、Aop注解形式 @AutoWired、@Resource。前提是对应的类要带上组件(如@Component) 2、通过在spring配置文件...
在Spring框架中,@Autowired和@Bean都是用于依赖注入的注解。但是它们的用途和意义不同,因此不能简单地说哪一个先出现。 首先,@Bean注解是用于创建和配置bean的方法级别注解。当一个Java类被标记为@Bean时,Spring容器会自动创建该类的实例,并管理其生命周期。该注解通常用于将第三方库中的对象或复杂组件纳入Spring容器的管理下。 其次,@Autowired注解是用于自动装配bean之间的依赖关系的字段、方法或者构造函数级别的注解。在Spring容器启动时,会自动查找并注入所有被@Autowried注解标记的bean。这个注解通常用于将一个对象或组件注入到另一个对象中,以构建对象之间的依赖关系。 因此,两个注解都是Spring框架中重要的注解,分别用于创建和配置bean以及自动装配bean之间的依赖关系。它们的出现顺序也没有固定的规定。在实际使用时,根据功能需求选择合适的注解即可。