my-spring
一个精简版本的spring框架。实现了spring的核心功能。(这里的spring版本是5.2.2.RELEASE)
本项目GitHub地址
@Test
public void test_BeanFactory(){
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
beanFactory.registerBeanDefinition("userService", beanDefinition);
UserService userService = (UserService) beanFactory.getBean("userService");
userService.queryUserInfo();
UserService userService_singleton = (UserService) beanFactory.getBean("userService");
userService_singleton.queryUserInfo();
System.out.println(userService_singleton == userService);
}

@Test
public void test_BeanFactory() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
BeanDefinition beanDefinition = new BeanDefinition(UserService.class);
beanFactory.registerBeanDefinition("userService", beanDefinition);
UserService userService = (UserService) beanFactory.getBean("userService", "seamew");
userService.queryUserInfo();
System.out.println(userService);
}

@Test
public void test_xml() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:spring.xml");
UserService userService = beanFactory.getBean("userService", UserService.class);
String result = userService.queryUserInfo();
System.out.println("测试结果:" + result);
}

@Test
public void test_BeanFactoryPostProcessorAndBeanPostProcessor() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:spring.xml");
MyBeanFactoryPostProcessor beanFactoryPostProcessor = new MyBeanFactoryPostProcessor();
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
MyBeanPostProcessor beanPostProcessor = new MyBeanPostProcessor();
beanFactory.addBeanPostProcessor(beanPostProcessor);
UserService userService = beanFactory.getBean("userService", UserService.class);
System.out.println("测试结果: " + userService.queryUserInfo());
}

@Test
public void test_xml() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
UserService userService = applicationContext.getBean("userService", UserService.class);
System.out.println(userService.queryUserInfo());
applicationContext.close();
}

@Test
public void test_prototype() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
applicationContext.registerShutdownHook();
UserService userService01 = applicationContext.getBean("userService", UserService.class);
UserService userService02 = applicationContext.getBean("userService", UserService.class);
System.out.println(userService01);
System.out.println(userService02);
System.out.println(userService01 + " 十六进制哈希:" + Integer.toHexString(userService01.hashCode()));
System.out.println(ClassLayout.parseInstance(userService01).toPrintable());
}

@Test
public void test_event() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
applicationContext.registerShutdownHook();
applicationContext.publishEvent(new CustomEvent(applicationContext, 1L, "成功了!"));
}

@Test
public void test_dynamic() {
IUserService userService = new UserService();
AdvisedSupport advisedSupport = new AdvisedSupport();
advisedSupport.setTargetSource(new TargetSource(userService));
advisedSupport.setMethodInterceptor(new UserServiceInterceptor());
advisedSupport.setMethodMatcher(new AspectJExpressionPointcut("execution(* bean.IUserService.*(..))"));
IUserService proxy_jdk = (IUserService) new JdkDynamicAopProxy(advisedSupport).getProxy();
System.out.println("测试结果:" + proxy_jdk.queryUserInfo());
System.out.println("----------------");
IUserService proxy_cglib = (IUserService) new Cglib2AopProxy(advisedSupport).getProxy();
System.out.println("测试结果:" + proxy_cglib.queryUserInfo());
}

@Test
public void test_circular() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
Husband husband = applicationContext.getBean("husband", Husband.class);
Wife wife = applicationContext.getBean("wife", Wife.class);
System.out.println("老公的媳妇:" + husband.queryWife());
System.out.println("媳妇的老公:" + wife.queryHusband());
}

@Test
public void test_circular() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
Husband husband = applicationContext.getBean("husband", Husband.class);
Wife wife = applicationContext.getBean("wife", Wife.class);
System.out.println("老公的媳妇:" + husband.queryWife());
System.out.println("媳妇的老公:" + wife.queryHusband());
}
