手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】

 前言

手动实现 Spring 底层机制的第一篇实现了任务阶段一编写自己 Spring 容器-准备篇【1】

个人主页:[尘觉主页](https://blog.csdn.net/apple_67445472?type=blog)

个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力

在csdn获奖荣誉: csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣  端午大礼包获得者

欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦

文章目录

手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】

前面我们实际上已经用代码简单实现了

代码演示使用框架

创建一个maven项目

创建UserAction类

创建UserDao类

创建UserService类

创建beans.xml

说明

创建AppMain类

运行效果 如图 

思考问题

创建MyBeanPostProce ssor.java类

修改类beans.xml

创建UserService类

完成测试AppMain

 思考问题


手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】

前面我们实际上已经用代码简单实现了

1 Spring XML 注入 bean

2 Spring 注解方式注入 bean

3 Spring AOP 动态代理实现

4.继续思考-原生 Spring 如何实现依赖注入和 singleton、prototype


代码演示使用框架

创建一个maven项目

如果不会请看之前写的博客手动实现

tomcat

maven的博客



    4.0.0

    com.wyxde
    wyxde-spring
    1.0-SNAPSHOT

    
        
        
            org.springframework
            spring-context
            5.3.8
        
        
        
            org.springframework
            spring-aspects
            5.3.8
        
    

创建UserAction类

也可以使用@Controller
在默认情况下 我们配置@Component @Controller @Service @Repository 是单例
@Scope(value = "prototype") 表示以多实例形式,返回UserAction bean

@Component
//@Scope(value = "prototype")
public class UserAction {
}

创建UserDao类

//可以使用@Repository
@Component
public class UserDao {

    public void hi() {
        System.out.println("UserDao-hi()---");
    }
}

创建UserService类

//也可以使用@Service
@Component
public class UserService {

    //定义属性
    //思考:加入 @Autowired , Spring容器时如何实现依赖注入?
    //也可以使用@Resource
    @Autowired
    private UserDao userDao;

    public void m1() {
        userDao.hi();
    }

    //这里我们需要指定init() 是初始化方法
    @PostConstruct
    public void init() {
        System.out.println("UserService-init()");
    }

}

创建beans.xml

说明

    1. 如果我们是普通的java项目, beans.xml 放在src下
    2. 如果我们是java maven 项目, beans.xml 放在 src/main/resources 





    
    

创建AppMain类

public class AppMain {
    public static void main(String[] args) {
        //测试看看是否可以得到spring容器中的bean , 同时看看依赖注入是否OK

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        UserAction userAction = (UserAction) ioc.getBean("userAction");
        UserAction userAction2 = (UserAction) ioc.getBean("userAction");

        System.out.println("userAction=" + userAction);
        System.out.println("userAction2=" + userAction2);

        UserDao userDao = (UserDao) ioc.getBean("userDao");
        System.out.println("userDao=" + userDao);

        UserService userService = (UserService) ioc.getBean("userService");
        System.out.println("userService=" + userService);

        //测试一下当前的依赖注入
        userService.m1();
}
}

运行效果 如图 

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】_第1张图片

思考问题

1 Spring 底层实现, 如何实现 IOC 容器创建和初始化【前面我们实现过,现在要再深入】
2 Spring 底层实现, 如何实现 getBean, 根据 singleton 和 prototype 来返回 bean 实例
3 继续思考-原生 Spring 如何实现 BeanPostPro

创建MyBeanPostProce ssor.java类

/**
 * 编写的一个后置处理器
 */
//@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     * 在Bean的 init初始化方法前调用-> 这个知识点,在前面讲解后置处理器时讲过的
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        System.out.println("postProcessBeforeInitialization 被 调 用 " + beanName + " bean= " + bean.getClass());
        return bean;
    }

    /**
     * 在Bean的 init初始化方法后调用-> 这个知识点,在前面讲解后置处理器时讲过的
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization 被 调 用 " + beanName + " bean= " + bean.getClass());
        return bean;
    }
}

修改类beans.xml


    

创建UserService类

//也可以使用@Service
@Component
public class UserService {

    //定义属性
    //思考:加入 @Autowired , Spring容器时如何实现依赖注入?
    //也可以使用@Resource
    @Autowired
    private UserDao userDao;

    public void m1() {
        userDao.hi();
    }

    //这里我们需要指定init() 是初始化方法
    @PostConstruct
    public void init() {
        System.out.println("UserService-init()");
    }

}

完成测试AppMain

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】_第2张图片

 思考问题

1 Spring 底层实现, 如何实现 Bean 后置处理器机制
2.继续思考-原生 Spring 是如何实现

因为篇幅过程下一篇介绍

总结

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】我们还有一篇准备就完成了准备啦

热门专栏推荐

想学习vue的可以看看这个 

java基础合集 

数据库合集 

redis合集 

nginx合集 

linux合集

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

欢迎大家加入我的社区 [尘觉社区](https://bbs.csdn.net/forums/58c2ca9b8de344c69384b471dd4bd744)

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力

你可能感兴趣的:(#,手写机制,spring,java,spring,boot)