前言
手动实现 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
思考问题
1 Spring XML 注入 bean
2 Spring 注解方式注入 bean
3 Spring AOP 动态代理实现
4.继续思考-原生 Spring 如何实现依赖注入和 singleton、prototype
如果不会请看之前写的博客手动实现
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
也可以使用@Controller
在默认情况下 我们配置@Component @Controller @Service @Repository 是单例
@Scope(value = "prototype") 表示以多实例形式,返回UserAction bean
@Component
//@Scope(value = "prototype")
public class UserAction {
}
//可以使用@Repository
@Component
public class UserDao {
public void hi() {
System.out.println("UserDao-hi()---");
}
}
//也可以使用@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()");
}
}
1. 如果我们是普通的java项目, beans.xml 放在src下
2. 如果我们是java maven 项目, beans.xml 放在 src/main/resources
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();
}
}
1 Spring 底层实现, 如何实现 IOC 容器创建和初始化【前面我们实现过,现在要再深入】
2 Spring 底层实现, 如何实现 getBean, 根据 singleton 和 prototype 来返回 bean 实例
3 继续思考-原生 Spring 如何实现 BeanPostPro
/**
* 编写的一个后置处理器
*/
//@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;
}
}
//也可以使用@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()");
}
}
1 Spring 底层实现, 如何实现 Bean 后置处理器机制
2.继续思考-原生 Spring 是如何实现
因为篇幅过程下一篇介绍
手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【1】我们还有一篇准备就完成了准备啦
热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
欢迎大家加入我的社区 [尘觉社区](https://bbs.csdn.net/forums/58c2ca9b8de344c69384b471dd4bd744)
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力