通过 Spring
核心原理解析已经大致了解了 Bean
的创建过程, 今天来尝试手写实现一下.
实现目标
- 可以通过注解注入
Bean
- 实现通过容器的
getBean
方法获取Bean
实例 - 单例和多例
bean
的实现 CGLIB动态代理Bean
的实现
创建基本的类和注解
在
com.spring
包下分别创建WbAnnotationConfigApplicationContent
,@ComponentSacn
,@Component
,@Autowired
注解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45package com.spring;
/**
* @author wb
**/
public class WbAnnotationSpringApplication {
public WbAnnotationSpringApplication(Class clazz) {
}
public Object getBean(String beanName) {
return null;
}
}
package com.spring;
/**
* @author wb
**/
public ComponentScan {
String value() default "";
}
package com.spring;
public Component {
String value() default "";
}
package com.spring;
public Autowired {
String value() default "";
}在
con.wb
下创建我们自己代码AppConfig
,UserInfoService
,OrderInfoService
,WbTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51package com.wb;
import com.spring.WbAnnotationSpringApplication;
/**
* @author wb
**/
public class WbTest {
public static void main(String[] args) {
WbAnnotationSpringApplication context = new WbAnnotationSpringApplication(AppConfig.class);
UserInfoService userInfoService = (UserInfoService) context.getBean("userInfoService");
userInfoService.test();
}
}
package com.wb.service;
public class UserInfoService {
private OrderInfoService orderInfoService;
public void test(){
System.out.println(orderInfoService);
}
}
package com.wb.service;
public class OrderInfoService {
}
package com.wb;
/**
* @author wb
**/
public class AppConfig {
}
项目初始化完毕.
分析 Spring
中的 AnnotationSpringApplication
做了什么?
- 通过
AppConfig
类上的@ComponentScan
注解扫描其value
值中的包. - 将扫描包中包含
@Component
注解的类通过一定的方法注入到Spring
容器中.
… 待更新