码迷,mamicode.com
首页 > 编程语言 > 详细

Spring-模拟InitializingBean

时间:2021-05-03 12:55:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ESS   new   ann   some   col   赋值   根据   object   @param   

代码结构:

技术图片

 

 

package com.java.spring;

/**
 * 自定义InitializingBean
 * 作用:做初始化操作
 */
public interface IInitializingBean {
    void afterPropertiesSet() throws Exception;
}
package com.java.service;

        import com.java.spring.CustomizeAutowired;
        import com.java.spring.CustomizeComponent;
        import com.java.spring.CustomizeScope;
        import com.java.spring.IInitializingBean;

@CustomizeComponent("userService")
@CustomizeScope("prototype")
public class UserService implements IInitializingBean {

    @CustomizeAutowired
    public OrderService orderService;

    public void doSomething(){
        orderService.doPBeanName();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化操作.........");
    }
}
CustomizeApplicationContext
/**
     * 创基bean
     * @param beanName
     * @return
     */
    public Object createBean(String beanName,CustomizeBeanDefinition beanDefinition){
        Class clazz = beanDefinition.getClazz();
        Object instance = null;

        try {
            instance = clazz.getDeclaredConstructor().newInstance();

            //依赖注入,给属性赋值
            //获取类中所有属性
            Field[] filelds = clazz.getDeclaredFields();
            for(Field f : filelds){
                //如果有定义的注入注解
                if(f.isAnnotationPresent(CustomizeAutowired.class)){
                    //根据属性名去找
                    String fBeanName = f.getName();

                    Object fBean = getBean(fBeanName);
                    CustomizeAutowired customizeAutowired = f.getDeclaredAnnotation(CustomizeAutowired.class);
                    if(customizeAutowired.required() && null == fBean){
                        //如果是必须
                        throw new NullPointerException();
                    }

                    //由于属性为私有属性,需要通过反射方式赋值,故设置true
                    f.setAccessible(true);
                    //将对象赋值给属性
                    f.set(instance,fBean);
                }
            }


            //Aware 回调
            if(instance instanceof IBeanNameAware){
                ((IBeanNameAware) instance).setBeanName(beanName);
            }

            //初始化操作
            if(instance instanceof IInitializingBean){
                ((IInitializingBean) instance).afterPropertiesSet();
            }

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return instance;
    }

 

测试:

 public static void main(String[] args) {
        SpringLoader loaderTest = new SpringLoader();
        loaderTest.test2();
    }

    /**
     * 依赖注入测试
     */
    private void test2(){
        CustomizeApplicationContext context = new CustomizeApplicationContext(CustomizeConfig.class);
        UserService userService1 = (UserService) context.getBean("userService");
        userService1.doSomething();
    }

结果:

技术图片

 

Spring-模拟InitializingBean

标签:ESS   new   ann   some   col   赋值   根据   object   @param   

原文地址:https://www.cnblogs.com/xiaozhuanfeng/p/14724306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!