在开始前,先补充一个bean的生成时间。在之前的spring入门使用代码里,是这么写的
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = (UserService) context.getBean("userService"); userService.test();
生成bean,是在我们第一行代码生成的,第二行代码只是去单例池去获取这个bean而已,但是这个是对于普通加载的,如果要生成的bean,声明采用了懒加载的方式,那就不再是第一行代码生成bean了,如果是一个单例bean,我们每次去getBean,都是同一个,但是如果是一个多例bean(也称为原型bean),每次去get,都是创建新的bean
我们来自己实现一下上面的获取bean的方式
package own.study.spring; public class MyApplicationContext { private Class config; public MyApplicationContext (Class config) { this.config = config; } public Object getBean (String beanName) { return null; } }
做一个配置类
做完配置类,我们还需要一个测试类
package own.study.spring; public class Test { public static void main(String[] args) { MyApplicationContext myApplicationContext = new MyApplicationContext(Appconfig.class); UserService userService = (UserService) myApplicationContext.getBean("userService"); } }
看似我们就这么实现了,但是这么做肯定不能用,毕竟还有注解,当然,我们说了手动模拟实现,就不能用现成的spring的注解,所以我们也来实现一下注解
package own.study.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 ComponentScan { String value() default ""; }
这样,我们就可以使用我们自己的注解。
原文:https://www.cnblogs.com/java0011/p/15236898.html