模板_方法

博客围绕Java模板方法展开,先提出在模拟bean生命周期阶段,若按暴力方法在原代码上修改以添加@Autowired、@Resource解析功能,会导致代码臃肿、扩展性差的问题。接着给出解决方法,模拟bean后处理器,定义接口、创建集合,遍历调用后处理方法实现需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板方法

引入问题

先看一下下面这段代码

public class demo {
    public static void main(String[] args) {
        MyBeanFactory beanFactory = new MyBeanFactory();
        beanFactory.getBean();
    }
    static class MyBeanFactory{
        public Object getBean(){
            Object bean = new Object();
            System.out.println("构造 "+bean);
            System.out.println("依赖注入 "+bean);
            System.out.println("初始化 "+bean);
            return bean;
        }
    }
}

这段代码是我简单的模拟了根据beanFactory调用getBean() 方法

并且简单的模拟了一下bean的生命周期的阶段

此时我提一个简单的需求,我想在依赖注入的时候能够添加@Autowired自动解析的功能,此时如果我按最暴力的方法那无疑就是在原有的代码上进行代码修改,那这就必然会带来一个问题,代码整体的扩展性不好,那我再问你,如果此时我想在依赖注入阶段在使用 @Resource解析呢?你难道还会继续在原有代码的基础上进行修改吗?

这最终的结果必定会导致这段代码非常的臃肿,可扩展性极差!

解决方法

此时,我其实可以简单的模拟一下bean后处理器对其进行扩展

下面我简单的模拟一下bean后处理器来解决上面我提出的需求

public class demo {
    public static void main(String[] args) {
        MyBeanFactory beanFactory = new MyBeanFactory();
        processors.add(new BeanPostProcessor() {
            @Override
            public void inject(Object bean) {
                System.out.println("解析@Autowired");
            }
        });
        
        processors.add(bean -> System.out.println("解析@Resource"));
        beanFactory.getBean();
    }
    static class MyBeanFactory{
        public Object getBean(){
            Object bean = new Object();
            System.out.println("构造 "+bean);
            System.out.println("依赖注入 "+bean);
            for (BeanPostProcessor processor : processors) {
                processor.inject(bean);
            }
            System.out.println("初始化 "+bean);
            return bean;
        }
    }
    private static List<BeanPostProcessor> processors=new ArrayList<>();
    public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor){
        processors.add(beanPostProcessor);
    }
    interface BeanPostProcessor{
        void inject(Object bean);
    }
}

由上面的代码改进可以看出,我做的核心就是

  • 定义了一个接口 代表 bean后处理器里面实现了增加处理的方法

  • 创建一个集合模拟bean后处理器集合

    所以在依赖注入的时候我通过遍历集合中的每一个bean后处理器,并调用后处理方法,来实现我前面提出来的需求

总结

模板方法核心:固定不变的代码[静态代码]成为方法的主干,变化的代码[我们不确定的代码]拉出来抽象成接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值