标签:substring bsp shm exist users end this targe element
IOC:控制反转。原先是程序员控制Java对象的创建,JVM GC负责Java对象的销毁,控制权在程序员手中。现在Java Bean的
实例对象由IOC容器负责创建、销毁,程序员反而是无需关心Bean的生命周期。这就是控制反转。
原理:内存中建立一个currentHashMap当作容器(考虑到多线程),采用(BeanID/BeanName,statance)形式存储Bean。
bean的建立在容器启动之后会通过Java反射来创建对象实例(通过注解、XML),然后放入容器中。依赖注入(一个bean中
含有其他bean)可以通过反射获取beanName/ID,然后遍历容器,获取到对应的Bean。
手动写简易实现:
目录图:
SelfAutowired:
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface SelfAutowired { }
SelfService:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface SelfService { }
SelfPathXmlApplicationContext:
public class SelfPathXmlApplicationContext { /** * 包名 */ private String packageName; //IOC容器 private ConcurrentHashMap<String, Object> beans = null; public SelfPathXmlApplicationContext(String packageName) throws Exception { System.out.println("容器类正在初始化"); beans = new ConcurrentHashMap<String, Object>(); this.packageName = packageName; initBeans(); initEntryField(); Arrays.asList(1,2,3); } /** * Description: 初始化所有的Bean * * @param * @return void * @date 9:44 2020/4/27 */ private void initBeans() throws Exception { //获取包下的所有类 TODO Set<Class<?>> classes = ClassUtil.scanPackage(packageName); //获取所有的类 ConcurrentHashMap<String, Object> classAnnotation = findClassExistAnnotation(classes); if (classAnnotation == null || classAnnotation.isEmpty()) { throw new Exception("该包下没有任何注解"); } } /** * Description: 判断是否有注解,并且初始化到容器里 * * @param * @return java.util.concurrent.ConcurrentHashMap<java.lang.String, java.lang.Object> * @date 9:52 2020/4/27 */ private ConcurrentHashMap<String, Object> findClassExistAnnotation(Set<Class<?>> classes) throws InstantiationException, IllegalAccessException { for (Class<?> classinfo : classes) { SelfService annotation = classinfo.getAnnotation(SelfService.class); if (annotation != null) { String className = classinfo.getSimpleName(); String beanId = toLowerCaseFirstOne(className); Object newInstance = newInstance(classinfo); beans.put(beanId, newInstance); } } return beans; } /** * Description:首字母转小写 * * @param s * @return java.lang.String * @date 9:57 2020/4/27 */ private String toLowerCaseFirstOne(String s) { if(Character.isLowerCase(s.charAt(0))){ return s; }else { return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString(); } } /** * Description: 根据类名获取实例对象 * * @param classinfo * @return java.lang.Object * @date 9:56 2020/4/27 */ private Object newInstance(Class<?> classinfo) throws IllegalAccessException, InstantiationException { return classinfo.newInstance(); } private void initEntryField() throws Exception { for (Map.Entry<String, Object> entry : beans.entrySet()) { //判断属性上是否有注解 Object bean = entry.getValue(); attriAssign(bean); } } /** * Description: 依赖注入原理 * * @param object * @return void * @date 17:53 2020/4/26 */ private void attriAssign(Object object) throws Exception { //1、利用反射获取当前类的属性 Class<? extends Object> classInfo = object.getClass(); Field[] declaredFields = classInfo.getDeclaredFields(); //2、判断当前类属性是否存在注解 for (Field field : declaredFields) { SelfAutowired extResource = field.getAnnotation(SelfAutowired.class); if (extResource != null) { String beanId = field.getName(); Object bean = getBean(beanId); if (bean != null) { field.setAccessible(true); field.set(object, bean); } } } } /** * Description: 根据beanID获取bean * * @param beanId * @return java.lang.Object * @date 9:41 2020/4/27 */ public Object getBean(String beanId) throws Exception { if (StringUtils.isEmpty(beanId)) { throw new Exception("beanID参数不能为空"); } Object object = beans.get(beanId); return object; } }
UserService:
public interface UserService { String getBeanName(); }
UserServiceImpl:
@SelfService public class UserServiceImpl implements UserService { @SelfAutowired Bean bean; @Override public String getBeanName() { return bean.name; } }
IocTest:
public class IocTest { public static void main(String[] args) throws Exception{ SelfPathXmlApplicationContext context = new SelfPathXmlApplicationContext("com.example.ioc"); UserService userService = (UserService) context.getBean("userServiceImpl"); System.out.println(userService.getBeanName()); } }
标签:substring bsp shm exist users end this targe element
原文地址:https://www.cnblogs.com/ariczky/p/12838646.html