自己new的对象怎么注入spring管理的对象

本文主要参考了以下两篇博客,然后将两者整合起来

kenick的博客 http://blog.csdn.net/leadseczgw01/article/details/53941871

飞飞狐的博客 http://blog.csdn.net/xiefeifeihu/article/details/5701436

正文:

    我这里主要是想在项目中运用装饰者模式,但是因为自己new出来的装饰者service (不受spring管理)并没有注入其他service时,但是我又确实需要去注入,这个时候就找到这两个博客,结合起来。

    使用方法:装饰者service需要继承这个类,然后装饰者service正常new的时候,装饰者service中注解了@Autowired的属性就会在spring容器中找到并注入。

    理解:initNewService因为是被spring容器管理的,且实现了ApplicationContextAware(或者ServletContextAware),所以在spring容器初始化的时候回注入ApplicationContextAware,我们把它保存在类中,并设置为static,因此每个继承此类的对象都能拿到ApplicationContextAware。然后继承类初始化的时候,我们通过属性的类型到容器中找到对应的对象,并通过反射注入进来。

    代码如下:

@Service
public class InitNewService implements ApplicationContextAware {

    private static Logger logger = LoggerFactory.getLogger(InitNewService.class);

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 将继承此类的service中的字段(注解了@Autowired 或者@Resource)等注入进来
     */
    public InitNewService(){

        if (this.applicationContext == null){
            return;
        }

        if (this.getClass().isAnnotationPresent(org.springframework.stereotype.Service.class)
                || this.getClass().isAnnotationPresent(org.springframework.stereotype.Controller.class)
                || this.getClass().isAnnotationPresent(org.springframework.stereotype.Component.class) ){
            return;
        }

        Class clazz = this.getClass();
        do {
            Field[] fields = clazz.getDeclaredFields();
            for (Field f : fields) {
                if (f.isAnnotationPresent(org.springframework.beans.factory.annotation.Autowired.class)
                        || f.isAnnotationPresent(javax.annotation.Resource.class)){

                    try {
                        String simpleName = f.getType().getSimpleName();
                        String beanName = StrUtils.toLowerCaseFirstOne(simpleName);

                        Object bean = applicationContext.getBean(beanName);
                        if (bean == null){
                            return;
                        }

                        boolean accessible = f.isAccessible();
                        f.setAccessible(true);
                        f.set(this,bean);
                        f.setAccessible(accessible);
                    }catch (Exception e){
                        logger.error(clazz.getName() + "当new对象注入类" + f.getName() + "的时候,发生了错误",e);
                        e.printStackTrace();
                    }

                }
            }
            clazz = clazz.getSuperclass();
        } while (clazz != Object.class);
    }


}


你可能感兴趣的:(java,spring)