如何让Spring管理使用了new关键字导致脱离管理的对象

最近公司比较忙,一个人需要同时肝多个项目,这次在开发中遇见了一个问题。

由于业务原因,我在开发中使用了抽象工厂设计模式,我手动new了一些对象,但是在执行CRUD操作的时候,发现我注入的数据层访问对象为null既然为null肯定是注解 没 生 效(@Autowired) 通常 注解没有生效只有一个原因 ,该类没有被spring管理起来,

 

问题如何让spring管理自己new出来的对象呢?

先说下思路,我们的对象之所以能被spring管理起来是因为在项目启动的时候spring扫描了我们的包(package)而虽然我new的对象也在该包中,但是已经由于使用了new关键字,导致脱离了spring的管理所以我们需要手动去获取Spring的上下文然后使用

 

下面是解决方案:

package com.xx.xx.xx.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


@Component
public class CustomManageObjUtil implements ApplicationContextAware {


    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);
    }

}

在使用的时候只需要定义一个构造区域

public class xx implements IRegister{

	private XXDao xxDao;

	// 构造区域 每次new xx()的时候 都会执行
	{
		xxDao =  CustomManageObjUtil.getBean(XXDao.class);
	}

	@Override
	public Integer register(xxPo xx) {
		Integer num = xxDao.insert(xx);
		return num;
	}
	

}

说明:本文为原创博文,转载需在博文明显位置注明出处

转载链接:https://blog.csdn.net/cm777/article/details/97279746

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值