1.从一个应用开始着手看spring源码.
创建一个普通的Maven空项目
spring包为构建spring框架的应用.
runtest包为用户自定义处理逻辑包.
启动Spring
package com.runtest;
import com.spring.SunApplicationContext;
public class Test {
public static void main(String[] args) {
//启动spring
SunApplicationContext sunApplicationContext=new SunApplicationContext(AppConfig.class);
//getbean
}
}
创建SpringApplicationContext
package com.spring;
public class SunApplicationContext {
public SunApplicationContext(Class configClass){
//
}
}
通识做法扫描包
package com.runtest;
import com.spring.ComponentSacn;
@ComponentSacn("com.runtest.service")
public class AppConfig {
}
自定义ComponentSacn注解:
package com.spring;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//运行时候
@Target(ElementType.TYPE)//只能写在类上面
public @interface ComponentSacn {
String value() default "";
}
继续模拟一般业务创建个ben业务类
package com.runtest.service;
import com.spring.Component;
@Component("userService")
public class UserService {
}
自定义注解Component
package com.spring;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//也是运行时候
@Target(ElementType.TYPE)//只能写在类上面
public @interface Component {
String value() default "";
}
模拟业务引用UserService
package com.runtest.service;
import com.spring.Autowired;
import com.spring.Component;
@Component("orderService")
public class OrderService {
@Autowired
private UserService userService;
}
自定义注解Autowired
package com.spring;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.METHOD})
public @interface Autowired {
String value() default "";
}
增加getBean
package com.runtest;
import com.runtest.service.OrderService;
import com.spring.SunApplicationContext;
public class Test {
public static void main(String[] args) {
//启动spring
SunApplicationContext sunApplicationContext=new SunApplicationContext(AppConfig.class);
//getbean
OrderService orderService = (OrderService) sunApplicationContext.getBean("orderService");
orderService.test();
}
}
package com.spring;
public class SunApplicationContext {
/**
* 提供构造方法
* @param configClass
*/
public SunApplicationContext(Class configClass){
//
}
public Object getBean(String beanName){
return null;
}
}
到此为止基本的搭建完成.
2.Spring核心业编写.
package com.spring;
import java.io.File;
import java.lang.annotation.Annotation;
import java.net.URL;
public class SunApplicationContext {
/**
* 提供构造方法
* @param configClass
*/
public SunApplicationContext(Class configClass){
//扫描类
//1.判断是否存在Conpoment注解
if (configClass.isAnnotationPresent(Component.class)){
System.out.println("没有存在");
}
//2.拿到注解
ComponentSacn componentSacn = (ComponentSacn) configClass.getAnnotation(ComponentSacn.class);
String sacnPath=componentSacn.value();// com.runtest.service-->com/runtest/service
System.out.println(sacnPath);
sacnPath=sacnPath.replace(".","/");
//3.扫描类
ClassLoader classLoader=SunApplicationContext.class.getClassLoader();//加载当前类对象
URL resource = classLoader.getResource(sacnPath);
File file=new File(resource.getFile());//得到目录
File files[]=file.listFiles();//得到具体的文件列表
for (File f:files){
System.out.println(f);
}
//生成单列bean--》单列池
}
public Object getBean(String beanName){
return null;
}
}
拿到注解对应下的class文件