spring管理的类为啥不能new?

问题:

标题有歧义,其实我想表达的是,通过注解@Component交给spring管理的类,通过关键字new出来为什么会出现一些问题.

这些问题包括:

public MyClassA
{
	//通过new关键字new MyClassA后, myClassB 会为null
    @AutoWired
    private MyClassB myClassB ;
}

为什么?

因为在启动spring后,spring会将所有注解过的类加载容器内,并返回给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类不会被容器注入.

如何解决?

自己实现ApplicationContextAware,自己根据类的类型手动获得加载后的bean即可

示例代码:

@Component
public class GetBeanUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (GetBeanUtil.applicationContext == null) {
            GetBeanUtil.applicationContext = applicationContext;
        }
    }
 
    /**
     * 返回ApplicationContext
     *
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
    /**
     * 返回bean
     *
     * @param beanName beanName
     * @return bean
     */
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
 
    /**
     * 获取bean
     *
     * @param c c
     * @param <T> 泛型
     * @return bean
     */
    public static <T> T getBean(Class<T> c) {
        return applicationContext.getBean(c);
    }
 
    /**
     * 获取bean
     * @param c c
     * @param  name 名称
     * @param <T> 泛型
     * @return T 泛型
     */
    public static <T> T getBean(String name, Class<T> c) {
        return getApplicationContext().getBean(name, c);
    }
}

如何使用上述示例?

public class AreaInvadeAnalyzer extends Analyzer {
 
    private AreaInvadeMapper areaInvadeMapper =GetBeanUtil.getBean(AreaInvadeMapper.class);
 
    ....其他代码省略
 
}

我为什么会遇到这个问题?

使用职责链模式时,handler里面有一些需要引入的类,将handler交给spring管理后发现里面通过@AutoWired注入的类为null.

参考文章:

https://blog.csdn.net/qq_28080659/article/details/99687074

https://www.cnblogs.com/bayu/articles/14084433.html

抛出问题:
1.注入类的方式有哪些?
2.获取类的方式有哪些?
3.bean的生命周期?
4.类加载过程?
5.类加载器顺序?

上一篇:spring中的开发技巧


下一篇:SSM整合步骤