解决SpringBoot中自己new出来的对象不能自动注入对象和属性的问题

时间:2025-03-19 08:45:03

鉴于大家留言中指出的所有错误问题,现在我把公司里的源代码贴出来供大家参考:

 懒得看解释的,直接用这个类即可:      

@Component
public class GetBeanUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if ( == null) {
             = applicationContext;
        }
    }

    /**
     * 返回ApplicationContext
     *
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 返回bean
     *
     * @param beanName beanName
     * @return bean
     */
    public static Object getBean(String beanName) {
        return (beanName);
    }

    /**
     * 获取bean
     *
     * @param c c
     * @param <T> 泛型
     * @return bean
     */
    public static <T> T getBean(Class<T> c) {
        return (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 =();

    ....其他代码省略

}

-----------------------------------------------------------------------------------------------------------------------下面旧文可以不看------------------------------------------------------------------------------------------------------------------------------------------------

在类上加@Component或者其他注解时,该类会交给spring来管理,自动创建对象,但是如果是自己new出来的对象或者自己类没加注解,但是内部又需要注入其他对象以及需要注入配置文件中的属性时,有以下办法解决:

1、解决注入对象问题:

新建一个工具类,比如GetBeanUtil

public class GetBeanUtil implements ApplicationContextAware {
    protected static ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static Object getBean(String name) {
        return (name);//name表示其他要注入的注解name名
    }

    public static <T> T getBean(T c){

        return (c);//T表示类
    }
}

举例使用上述工具类:

public MyClass
{
    @AutoWired
    private OtherClass otherClass;
}

上面类在new MyClass时,OtherClass类注入会失败,此时改进一下情况即可:(注意,OtherClass必须是spring注解过的)

public MyClass
{
    private OtherClass otherClass = ();
}

简单解释一下工具类为什么能够找到类,是因为在启动spring后,spring会将所有注解过的类加载容器内,并返回 给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类缺不会被容器注入,此时,自己实现ApplicationContextAware,自己根据类的类型手动获得加载后的bean即可。

2、解决注入属性问题

创建一个工具类:

@Component//注意此时要加注解
public class GetPropertiesUtil
{
    
    private static String properties;
    
    public static Stirng getProperties()
    {    
        return properties;
    }
    @Value("${properties}")
    public void setProperties(String properties)
    {
         = proterties;
    }
}

注意两点:1、该工具类要加上注解,否则会像第一种情况;

                  2、内部属性加@Value的地方是set方法上,而且set方法不是statis;

 

使用举例:

public MyClass
{
    @Value("${properties}")
    private String properties;
}

上面类在new MyClass时,xxx属性注入会失败,此时改进一下情况即可:

public MyClass
{
    private String properties = ();
}