From 61c0476f9d54fadbe7dbf550eba2c5c1db814be6 Mon Sep 17 00:00:00 2001 From: 19611 Date: Thu, 2 Oct 2025 15:20:20 +0800 Subject: [PATCH] Default Changelist --- .idea/.gitignore | 8 + .idea/compiler.xml | 13 ++ .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 15 ++ pom.xml | 16 ++ src/main/java/com/spring/Autowired.java | 13 ++ src/main/java/com/spring/BeanDefinition.java | 35 ++++ src/main/java/com/spring/BeanNameAware.java | 6 + .../java/com/spring/BeanPostProcessor.java | 12 ++ src/main/java/com/spring/Component.java | 13 ++ src/main/java/com/spring/ComponentScan.java | 13 ++ .../java/com/spring/InitializingBean.java | 5 + src/main/java/com/spring/MyClassLoader.java | 69 +++++++ src/main/java/com/spring/Scope.java | 13 ++ .../com/spring/ZhouyuApplicationContext.java | 185 ++++++++++++++++++ src/main/java/com/zhouyu/AppConfig.java | 11 ++ src/main/java/com/zhouyu/Test.java | 51 +++++ .../java/com/zhouyu/service/OrderService.java | 15 ++ .../com/zhouyu/service/UserInterface.java | 6 + .../java/com/zhouyu/service/UserService.java | 28 +++ .../service/ZhouyuBeanPostProcessor.java | 36 ++++ .../java/com/zhouyu/service/ZhouyuValue.java | 13 ++ .../service/ZhouyuValueBeanPostProcessor.java | 34 ++++ target/classes/com/spring/Autowired.class | Bin 0 -> 381 bytes .../classes/com/spring/BeanDefinition.class | Bin 0 -> 987 bytes target/classes/com/spring/BeanNameAware.class | Bin 0 -> 164 bytes .../com/spring/BeanPostProcessor.class | Bin 0 -> 554 bytes target/classes/com/spring/Component.class | Bin 0 -> 443 bytes target/classes/com/spring/ComponentScan.class | Bin 0 -> 451 bytes .../classes/com/spring/InitializingBean.class | Bin 0 -> 159 bytes target/classes/com/spring/MyClassLoader.class | Bin 0 -> 2766 bytes target/classes/com/spring/Scope.class | Bin 0 -> 435 bytes .../com/spring/ZhouyuApplicationContext.class | Bin 0 -> 6981 bytes target/classes/com/zhouyu/AppConfig.class | Bin 0 -> 377 bytes target/classes/com/zhouyu/Test.class | Bin 0 -> 2616 bytes .../com/zhouyu/service/OrderService.class | Bin 0 -> 574 bytes .../com/zhouyu/service/UserInterface.class | Bin 0 -> 147 bytes .../com/zhouyu/service/UserService.class | Bin 0 -> 959 bytes .../service/ZhouyuBeanPostProcessor$1.class | Bin 0 -> 1370 bytes .../service/ZhouyuBeanPostProcessor.class | Bin 0 -> 1330 bytes .../com/zhouyu/service/ZhouyuValue.class | Bin 0 -> 456 bytes .../ZhouyuValueBeanPostProcessor.class | Bin 0 -> 1552 bytes 42 files changed, 630 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/spring/Autowired.java create mode 100644 src/main/java/com/spring/BeanDefinition.java create mode 100644 src/main/java/com/spring/BeanNameAware.java create mode 100644 src/main/java/com/spring/BeanPostProcessor.java create mode 100644 src/main/java/com/spring/Component.java create mode 100644 src/main/java/com/spring/ComponentScan.java create mode 100644 src/main/java/com/spring/InitializingBean.java create mode 100644 src/main/java/com/spring/MyClassLoader.java create mode 100644 src/main/java/com/spring/Scope.java create mode 100644 src/main/java/com/spring/ZhouyuApplicationContext.java create mode 100644 src/main/java/com/zhouyu/AppConfig.java create mode 100644 src/main/java/com/zhouyu/Test.java create mode 100644 src/main/java/com/zhouyu/service/OrderService.java create mode 100644 src/main/java/com/zhouyu/service/UserInterface.java create mode 100644 src/main/java/com/zhouyu/service/UserService.java create mode 100644 src/main/java/com/zhouyu/service/ZhouyuBeanPostProcessor.java create mode 100644 src/main/java/com/zhouyu/service/ZhouyuValue.java create mode 100644 src/main/java/com/zhouyu/service/ZhouyuValueBeanPostProcessor.java create mode 100644 target/classes/com/spring/Autowired.class create mode 100644 target/classes/com/spring/BeanDefinition.class create mode 100644 target/classes/com/spring/BeanNameAware.class create mode 100644 target/classes/com/spring/BeanPostProcessor.class create mode 100644 target/classes/com/spring/Component.class create mode 100644 target/classes/com/spring/ComponentScan.class create mode 100644 target/classes/com/spring/InitializingBean.class create mode 100644 target/classes/com/spring/MyClassLoader.class create mode 100644 target/classes/com/spring/Scope.class create mode 100644 target/classes/com/spring/ZhouyuApplicationContext.class create mode 100644 target/classes/com/zhouyu/AppConfig.class create mode 100644 target/classes/com/zhouyu/Test.class create mode 100644 target/classes/com/zhouyu/service/OrderService.class create mode 100644 target/classes/com/zhouyu/service/UserInterface.class create mode 100644 target/classes/com/zhouyu/service/UserService.class create mode 100644 target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor$1.class create mode 100644 target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor.class create mode 100644 target/classes/com/zhouyu/service/ZhouyuValue.class create mode 100644 target/classes/com/zhouyu/service/ZhouyuValueBeanPostProcessor.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..eb87927 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5d8d5c0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6e99960 --- /dev/null +++ b/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.example + zhouyu-spring-vip + 1.0-SNAPSHOT + + + 8 + 8 + + + \ No newline at end of file diff --git a/src/main/java/com/spring/Autowired.java b/src/main/java/com/spring/Autowired.java new file mode 100644 index 0000000..b4e6a59 --- /dev/null +++ b/src/main/java/com/spring/Autowired.java @@ -0,0 +1,13 @@ +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) +public @interface Autowired { + + +} diff --git a/src/main/java/com/spring/BeanDefinition.java b/src/main/java/com/spring/BeanDefinition.java new file mode 100644 index 0000000..193b4a9 --- /dev/null +++ b/src/main/java/com/spring/BeanDefinition.java @@ -0,0 +1,35 @@ +package com.spring; + +/** + * @author 周瑜 + */ +public class BeanDefinition { + + private Class type; + private String scope; + private boolean isLazy; + + public Class getType() { + return type; + } + + public void setType(Class type) { + this.type = type; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public boolean isLazy() { + return isLazy; + } + + public void setLazy(boolean lazy) { + isLazy = lazy; + } +} diff --git a/src/main/java/com/spring/BeanNameAware.java b/src/main/java/com/spring/BeanNameAware.java new file mode 100644 index 0000000..5fb44af --- /dev/null +++ b/src/main/java/com/spring/BeanNameAware.java @@ -0,0 +1,6 @@ +package com.spring; + +public interface BeanNameAware { + + void setBeanName(String name); +} diff --git a/src/main/java/com/spring/BeanPostProcessor.java b/src/main/java/com/spring/BeanPostProcessor.java new file mode 100644 index 0000000..1f42ea1 --- /dev/null +++ b/src/main/java/com/spring/BeanPostProcessor.java @@ -0,0 +1,12 @@ +package com.spring; + +public interface BeanPostProcessor { + + default Object postProcessBeforeInitialization(Object bean, String beanName) { + return bean; + } + + default Object postProcessAfterInitialization(Object bean, String beanName) { + return bean; + } +} diff --git a/src/main/java/com/spring/Component.java b/src/main/java/com/spring/Component.java new file mode 100644 index 0000000..4972fac --- /dev/null +++ b/src/main/java/com/spring/Component.java @@ -0,0 +1,13 @@ +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 ""; +} diff --git a/src/main/java/com/spring/ComponentScan.java b/src/main/java/com/spring/ComponentScan.java new file mode 100644 index 0000000..2604067 --- /dev/null +++ b/src/main/java/com/spring/ComponentScan.java @@ -0,0 +1,13 @@ +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 ComponentScan { + + String value() default ""; +} diff --git a/src/main/java/com/spring/InitializingBean.java b/src/main/java/com/spring/InitializingBean.java new file mode 100644 index 0000000..3759f58 --- /dev/null +++ b/src/main/java/com/spring/InitializingBean.java @@ -0,0 +1,5 @@ +package com.spring; + +public interface InitializingBean { + void afterPropertiesSet(); +} diff --git a/src/main/java/com/spring/MyClassLoader.java b/src/main/java/com/spring/MyClassLoader.java new file mode 100644 index 0000000..ead4c47 --- /dev/null +++ b/src/main/java/com/spring/MyClassLoader.java @@ -0,0 +1,69 @@ +package com.spring; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class MyClassLoader extends ClassLoader { + // 外部类文件的根路径(可修改为你的实际路径,如"D:/my-external-classes/") + private final String externalClassRootPath; + + // 构造方法:传入外部类的根路径 + public MyClassLoader(String externalClassRootPath) { + // 调用父类构造(此处用系统类加载器作为父加载器,符合双亲委派模型) + super(ClassLoader.getSystemClassLoader()); + // 确保路径以"/"或"\"结尾,避免拼接错误 + this.externalClassRootPath = externalClassRootPath.endsWith("/") + ? externalClassRootPath + : externalClassRootPath + "/"; + } + + /** + * 核心方法:根据类的全限定名找到并加载类 + * @param className 类的全限定名(如"com.example.OuterClass") + * @return 加载后的Class对象 + * @throws ClassNotFoundException 类未找到时抛出 + */ + @Override + protected Class findClass(String className) throws ClassNotFoundException { + try { + // 1. 将全限定名转换为文件路径(如"com.example.OuterClass" → "com/example/OuterClass.class") + String classFilePath = className.replace(".", "/") + ".class"; + // 2. 拼接外部类的完整路径(根路径 + 类路径) + String fullClassPath = externalClassRootPath + classFilePath; + + // 3. 读取.class文件的字节码(二进制数据) + byte[] classBytes = readClassBytes(fullClassPath); + + // 4. 将字节码转换为Class对象(defineClass是父类方法,不可重写) + // 参数说明:className(类名)、classBytes(字节码数组)、0(起始索引)、classBytes.length(长度) + return defineClass(className, classBytes, 0, classBytes.length); + } catch (IOException e) { + // 若读取失败,抛出ClassNotFoundException(符合ClassLoader规范) + throw new ClassNotFoundException("未找到外部类:" + className, e); + } + } + + /** + * 辅助方法:读取指定路径下的.class文件,返回字节数组 + * @param fullClassPath .class文件的完整路径(如"D:/external-classes/com/example/OuterClass.class") + * @return .class文件的字节数组 + * @throws IOException 读取文件失败时抛出 + */ + private byte[] readClassBytes(String fullClassPath) throws IOException { + // 用 ByteArrayOutputStream 暂存字节数据 + try (InputStream inputStream = new FileInputStream(fullClassPath); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + byte[] buffer = new byte[1024]; // 缓冲区,提高读取效率 + int bytesRead; + // 循环读取文件内容到缓冲区,再写入输出流 + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + // 将输出流转换为字节数组(即.class文件的二进制数据) + return outputStream.toByteArray(); + } + } +} diff --git a/src/main/java/com/spring/Scope.java b/src/main/java/com/spring/Scope.java new file mode 100644 index 0000000..9997013 --- /dev/null +++ b/src/main/java/com/spring/Scope.java @@ -0,0 +1,13 @@ +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 Scope { + + String value() default ""; +} diff --git a/src/main/java/com/spring/ZhouyuApplicationContext.java b/src/main/java/com/spring/ZhouyuApplicationContext.java new file mode 100644 index 0000000..858b276 --- /dev/null +++ b/src/main/java/com/spring/ZhouyuApplicationContext.java @@ -0,0 +1,185 @@ +package com.spring; + +import com.zhouyu.service.ZhouyuBeanPostProcessor; + +import java.beans.Introspector; +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author 周瑜 + */ +public class ZhouyuApplicationContext { + + private Class configClass; + private Map beanDefinitionMap = new HashMap<>(); + private Map singletonObjects = new HashMap<>(); + private List beanPostProcessorList = new ArrayList<>(); + + public ZhouyuApplicationContext(Class configClass) { + this.configClass = configClass; + + // 扫描 + scan(configClass); + + for (Map.Entry entry : beanDefinitionMap.entrySet()) { + String beanName = entry.getKey(); + BeanDefinition beanDefinition = entry.getValue(); + if (beanDefinition.getScope().equals("singleton")) { + + Object bean = createBean(beanName, beanDefinition); + singletonObjects.put(beanName, bean); + + } + } + + } + + private Object createBean(String beanName, BeanDefinition beanDefinition) { + Class clazz = beanDefinition.getType(); + + Object instance = null; + try { + + instance = clazz.getConstructor().newInstance(); + + for (Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(Autowired.class)) { + + field.setAccessible(true); + + field.set(instance, getBean(field.getName())); + } + } + + if (instance instanceof BeanNameAware) { + ((BeanNameAware)instance).setBeanName(beanName); + } + + for (BeanPostProcessor beanPostProcessor : beanPostProcessorList) { + instance = beanPostProcessor.postProcessBeforeInitialization(instance, beanName); + } + + if (instance instanceof InitializingBean) { + ((InitializingBean)instance).afterPropertiesSet(); + } + + for (BeanPostProcessor beanPostProcessor : beanPostProcessorList) { + instance = beanPostProcessor.postProcessAfterInitialization(instance, beanName); + } + + + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return instance; + } + + + + public Object getBean(String beanName) { + + if (!beanDefinitionMap.containsKey(beanName)) { + throw new NullPointerException(); + } + + BeanDefinition beanDefinition = beanDefinitionMap.get(beanName); + + if (beanDefinition.getScope().equals("singleton")) { + Object singletonBean = singletonObjects.get(beanName); + if (singletonBean == null) { + singletonBean = createBean(beanName, beanDefinition); + singletonObjects.put(beanName, singletonBean); + } + return singletonBean; + } else { + // 原型 + Object prototypeBean = createBean(beanName, beanDefinition); + return prototypeBean; + } + + } + + + + + private void scan(Class configClass) { + if (configClass.isAnnotationPresent(ComponentScan.class)) { + ComponentScan componentScanAnnotation = (ComponentScan) configClass.getAnnotation(ComponentScan.class); + String path = componentScanAnnotation.value(); + path = path.replace(".", "/"); // com/zhouyu/service + + ClassLoader classLoader = ZhouyuApplicationContext.class.getClassLoader(); + URL resource = classLoader.getResource(path); + File file = new File(resource.getFile()); + if (file.isDirectory()) { + for (File f : file.listFiles()) { + String absolutePath = f.getAbsolutePath(); + + absolutePath = absolutePath.substring(absolutePath.indexOf("com"), absolutePath.indexOf(".class")); + absolutePath = absolutePath.replace("\\", "."); + + + try { + Class clazz = classLoader.loadClass(absolutePath); + + if (clazz.isAnnotationPresent(Component.class)) { + + if (BeanPostProcessor.class.isAssignableFrom(clazz)) { + BeanPostProcessor instance = (BeanPostProcessor) clazz.getConstructor().newInstance(); + beanPostProcessorList.add(instance); + } + + Component componentAnnotation = clazz.getAnnotation(Component.class); + String beanName = componentAnnotation.value(); + if ("".equals(beanName)) { + beanName = Introspector.decapitalize(clazz.getSimpleName()); + } + + BeanDefinition beanDefinition = new BeanDefinition(); + beanDefinition.setType(clazz); + + if (clazz.isAnnotationPresent(Scope.class)) { + Scope scopeAnnotation = clazz.getAnnotation(Scope.class); + String value = scopeAnnotation.value(); + beanDefinition.setScope(value); + } else { + beanDefinition.setScope("singleton"); + } + + beanDefinitionMap.put(beanName, beanDefinition); + } + } catch (ClassNotFoundException | NoSuchMethodException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + + } + } + + + + } + } +} diff --git a/src/main/java/com/zhouyu/AppConfig.java b/src/main/java/com/zhouyu/AppConfig.java new file mode 100644 index 0000000..1fdb0c4 --- /dev/null +++ b/src/main/java/com/zhouyu/AppConfig.java @@ -0,0 +1,11 @@ +package com.zhouyu; + +import com.spring.ComponentScan; + +/** + * @author 周瑜 + */ + +@ComponentScan("com.zhouyu.service") +public class AppConfig { +} diff --git a/src/main/java/com/zhouyu/Test.java b/src/main/java/com/zhouyu/Test.java new file mode 100644 index 0000000..99a23d4 --- /dev/null +++ b/src/main/java/com/zhouyu/Test.java @@ -0,0 +1,51 @@ +package com.zhouyu; + +import com.spring.MyClassLoader; +import com.spring.ZhouyuApplicationContext; +import com.zhouyu.service.UserInterface; +import com.zhouyu.service.UserService; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * @author 周瑜 + */ +public class Test { + + public static void main(String[] args) { + + // 扫描--->创建单例Bean BeanDefinition BeanPostPRocess + ZhouyuApplicationContext applicationContext = new ZhouyuApplicationContext(AppConfig.class); + + UserInterface userService = (UserInterface) applicationContext.getBean("userService"); + userService.test(); + + // 自定义类加载器 + extracted(args); + } + + private static void extracted(String[] args) { + MyClassLoader myClassLoader = new MyClassLoader("D:\\WorkSpace\\sheep\\learn\\target\\classes"); + try { + Class clazz = myClassLoader.loadClass("org.sheep.Find"); + Object obj = clazz.getConstructor().newInstance(); + System.out.println(obj.toString()); + Method method = clazz.getMethod("main",String[].class); + method.invoke(obj, new Object[]{args}); + + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/zhouyu/service/OrderService.java b/src/main/java/com/zhouyu/service/OrderService.java new file mode 100644 index 0000000..75e2845 --- /dev/null +++ b/src/main/java/com/zhouyu/service/OrderService.java @@ -0,0 +1,15 @@ +package com.zhouyu.service; + +import com.spring.Component; + +/** + * @author 周瑜 + */ + +@Component +public class OrderService { + + public void test() { + System.out.println("test"); + } +} diff --git a/src/main/java/com/zhouyu/service/UserInterface.java b/src/main/java/com/zhouyu/service/UserInterface.java new file mode 100644 index 0000000..f64ff7c --- /dev/null +++ b/src/main/java/com/zhouyu/service/UserInterface.java @@ -0,0 +1,6 @@ +package com.zhouyu.service; + +public interface UserInterface { + + public void test(); +} diff --git a/src/main/java/com/zhouyu/service/UserService.java b/src/main/java/com/zhouyu/service/UserService.java new file mode 100644 index 0000000..1a10bd9 --- /dev/null +++ b/src/main/java/com/zhouyu/service/UserService.java @@ -0,0 +1,28 @@ +package com.zhouyu.service; + +import com.spring.*; + +/** + * @author 周瑜 + */ +@Component +public class UserService implements UserInterface, BeanNameAware { + + @Autowired + private OrderService orderService; + + @ZhouyuValue("xxx") + private String test; + + + private String beanName; + + @Override + public void setBeanName(String name) { + this.beanName = name; + } + + public void test() { + System.out.println(beanName); + } +} diff --git a/src/main/java/com/zhouyu/service/ZhouyuBeanPostProcessor.java b/src/main/java/com/zhouyu/service/ZhouyuBeanPostProcessor.java new file mode 100644 index 0000000..650ad17 --- /dev/null +++ b/src/main/java/com/zhouyu/service/ZhouyuBeanPostProcessor.java @@ -0,0 +1,36 @@ +package com.zhouyu.service; + +import com.spring.BeanPostProcessor; +import com.spring.Component; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * @author 周瑜 + */ +@Component +public class ZhouyuBeanPostProcessor implements BeanPostProcessor { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + + if (beanName.equals("userService")) { + Object proxyInstance = Proxy.newProxyInstance(ZhouyuBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + // 切面 + System.out.println("切面逻辑"); + + return method.invoke(bean, args); + } + }); + + return proxyInstance; + } + + // bean + return bean; + } +} diff --git a/src/main/java/com/zhouyu/service/ZhouyuValue.java b/src/main/java/com/zhouyu/service/ZhouyuValue.java new file mode 100644 index 0000000..085d898 --- /dev/null +++ b/src/main/java/com/zhouyu/service/ZhouyuValue.java @@ -0,0 +1,13 @@ +package com.zhouyu.service; + +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) +public @interface ZhouyuValue { + + String value() default ""; +} diff --git a/src/main/java/com/zhouyu/service/ZhouyuValueBeanPostProcessor.java b/src/main/java/com/zhouyu/service/ZhouyuValueBeanPostProcessor.java new file mode 100644 index 0000000..fbf94b5 --- /dev/null +++ b/src/main/java/com/zhouyu/service/ZhouyuValueBeanPostProcessor.java @@ -0,0 +1,34 @@ +package com.zhouyu.service; + +import com.spring.BeanPostProcessor; +import com.spring.Component; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * @author 周瑜 + */ +@Component +public class ZhouyuValueBeanPostProcessor implements BeanPostProcessor { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) { + + for (Field field : bean.getClass().getDeclaredFields()) { + if (field.isAnnotationPresent(ZhouyuValue.class)) { + field.setAccessible(true); + try { + field.set(bean, field.getAnnotation(ZhouyuValue.class).value()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + // bean + return bean; + } +} diff --git a/target/classes/com/spring/Autowired.class b/target/classes/com/spring/Autowired.class new file mode 100644 index 0000000000000000000000000000000000000000..14b49613e22b84f7f8b079a824066c975f39af6d GIT binary patch literal 381 zcmah_u};G<5Pb&}LxIvtEC?YGLr1c(F;ya!Dz$(@U}18@sdDAmRpJ!&*BJN!J_>PR zXc#InobP<^J)hrweSdrcxIs^$qj0RyCA6P>Rb)IgmI<9f75uv?`0aYGmzr>zR4$mD zUrcGHmIu!Hpo8(QBwUVbPGq&4MS2ZH2?rL9cejMrQrk-2?f*l4^wwl65vb((J{?VB z!ue)Ns*4#1VP0*ORr`8+BYg^{nWEfTtofrsgwvp~3LT7Nt> lzWW5imc+Jf5>oB_o-OQ3K9jo=Y>%;zHV*3Y6~s8i(GMC)Z4dwe literal 0 HcmV?d00001 diff --git a/target/classes/com/spring/BeanDefinition.class b/target/classes/com/spring/BeanDefinition.class new file mode 100644 index 0000000000000000000000000000000000000000..81e3c08254e369f3449a67238908417d216f04b8 GIT binary patch literal 987 zcmZ{hO;6iE5Qg7%96JP4$QLD~wB@T9D%F?XT5$l>Q`8=UIB?szZdhb&6q`!$n>c_3 zs?(OIG5Rv*?H%AcmDqS{RhBDxK&tKn?V`t95y&?+IVMUOTbJo&jW#4 z_f-CrUMQo1w;#$R`6N(I{Frm~v0N`5s%St-OC?=-btxc@>F`-aD%}+*x!XsixgUS0 zy7{h(g0B~6{a|<~`=M5feHk9fq2hCPX{IMC5$JUN_{>YrS>M|WWONYxU{w`I)Xp9R z>7gcVxZ7hq53F|bkZ-!r(#%vLf!@eZb3);a3AJ#x#vM&3>LSo;n2 zPgHyH#n2DFD7M;|wD5ty*TEcKIIvN1FoUXtSvUgislEjko~H7xe;W8HR%v(^jkN@W zg=lB6mR?DYRvUu*P@JceN2{QjKdx_+)Bpeg literal 0 HcmV?d00001 diff --git a/target/classes/com/spring/BeanNameAware.class b/target/classes/com/spring/BeanNameAware.class new file mode 100644 index 0000000000000000000000000000000000000000..ae5de339b4707ada6524c99ebdedbbb253507126 GIT binary patch literal 164 zcmX^0Z`VEs1_l!bPId-%b_Nbc2JYh25~tL}Jio-;R7M6-4WF#UvPAuy#JqI<;F6-u zymV{LFh&Nh;QZ2}DdyA&umjeB(x{f?;qL z&-p74GhWQXhh#2N6E&EL(XyCD=MAcAV(@O&vta1PvJj(Xo(TQOlZ=>ttWusmaV>3K zk)C;xCBt!?syr+g);1gpUX1I6N=M|H5NSPDVli~AHsZOPQR`JmGH-nMW@?1~``cim zmO2%8(#AYo8GmU#8IJyo$k3}N|L&sAz|f-2gOFhZ9^occ*RCS=;@xR&!ZvXheZo`f ewQoAuqSM|2Y&*S$9qc-{y*1o|wcWaIO792p@_@kr literal 0 HcmV?d00001 diff --git a/target/classes/com/spring/Component.class b/target/classes/com/spring/Component.class new file mode 100644 index 0000000000000000000000000000000000000000..f9ade65be9c2c39741ca90a9de402d41e8e4eecb GIT binary patch literal 443 zcmah_%SyvQ6g|_XMyu9Vvk?)+MbVAfxN{|1LGV%1D2S_RxP~c{nUG8h{WTYUfFC8^ zY?>|#E{3^}^WdJJ->+`~R|tFzeC+!;5a`UMu1Fv_zj&O5X*h9(GU>Iz;Kms1 zq*K=1(Wk7m6M#T>Vyhydd!?D$yR}(v4HsrbeO^I9+j(OYJZs z$9#5S&*49ivDGSBFwl=)pW}z8k-+hKN-T?%93#)x??;+4wv87#G02PG$E+13HVezV z4j^1!CeUxvd6~{A;UG?$(aI^!xkJHGwfMC;cHyxDI^1n=*Dm4nYLm+rw$SDOh^uX0 RdxRbAqF0w65QIJS{{TsDdzt_M literal 0 HcmV?d00001 diff --git a/target/classes/com/spring/ComponentScan.class b/target/classes/com/spring/ComponentScan.class new file mode 100644 index 0000000000000000000000000000000000000000..d7e5891b98460ea6bb227f6d35f8c20c3cd87fa4 GIT binary patch literal 451 zcmah_%SyvQ6g|_XM(eAsT__@oi=vxm(Hg>A=4T7+X&JQ*}eyjih literal 0 HcmV?d00001 diff --git a/target/classes/com/spring/InitializingBean.class b/target/classes/com/spring/InitializingBean.class new file mode 100644 index 0000000000000000000000000000000000000000..52cee81d7c06bc30ee883589e77c508e865fa543 GIT binary patch literal 159 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 CXF!7h literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/AppConfig.class b/target/classes/com/zhouyu/AppConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..351c539e0ba653783524a7ee410e310b0ae0d740 GIT binary patch literal 377 zcmZut!Ab)$6r8lXt+utTwFr9irXIQ%Z;DU~o{EB%-m@{buk0qvZc@;{@+5fh1N-_`31;!mTvERn1jRS$!6&Z5Z0?pI2r9d>Zk6K_bC!=qDp6c>J zrWq@vxm7Y-%8~;A6(hH%O5kv=Y@WQVt$+5(v?ylQJkjb>ptG>PRQiTOLjTX1Y~)r7 z9Nl~4DA!A>h%=|gSSKA>!;!~zWL1=8R>{ofg*Do^g_4G2344COPvi-Du@-f(HLaSb{g#GPal{H3#DJH;7jj8fY`NSOz-SVeHlK W7`x1a->tESJ-)l__4y1c48H-k=~tHk literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/Test.class b/target/classes/com/zhouyu/Test.class new file mode 100644 index 0000000000000000000000000000000000000000..8827e8a96e15efcb839e108d74e38987ccd945d9 GIT binary patch literal 2616 zcmb7G+jA3D82@c^IZYZ$32kXA$Q^p4Q9+S_g;JoV3kGf{vNloNvGL`@Zj--*-uV|MRC`0Gz;=adhAf zfvmt}94(k?MMkcd1TMEh;7x%mt;od@!*naI%5_HIS{&_oOJFvR>$nla9Nw0G-ihN~ zyw{38fs+!U$1x8>U_ro)qZf+;d4Ym}C9ov0tRZ^Fax8yDL#VHRMnibaT`)Cl&svT- zRVmJ!-n2e%Qh+*s1s4xXtrSI4dMgx|`O$yy*w=`vdqXH&-zVwbKVNVOo*iolPhtJ$k8RTQ&D% zuH&1xd<}JNNxHmg$cU#7Inj<$+qIE zqA~003#KO%AdNOcO$PS}?ryA>)zW6gbOx@i+?^R1k5Uzm$4M#6z=B~Nka;`-3=E?=rEX~=b?m2V5s)RX1mbzJ%VM`j?T`xbZP{ZSv zvyj01Aj8}1^{=Q(pbX}?qpq&Cg+L{N72FiKmB1>h34DOt0v{&u5lRVsj86nUP2e+p z&b!r(mCq-df{Cp|u2k3$MRThr<#E4gaMHYK8X-+vM#Eq|&VM$HhP`!k({>?UfwalW zV5a;2S#4_c2)5#RQ)i}+1Oc1FDPXfTcEY}L*wqZrVHUI56pBx_U^7g>r-HHM+j$Ds zUfK65hVL@n#~Vgv4b~qp+$1SrL^pftyfgu@(;f3>ElIM|k2b{ExLz>G){O&ImRl|R zW>Jpi3Q6s%9m#UjmpNs8vS#W<9;DTGYYa->gDy9CW+O&MYC}-N zxh5Rad6Jn;?@^1Bd6|5i3WnLZdoawuG1L>Zoi2FpP5H~n3S*P(<8QJ2 zv_RwA0e&CkTbirJH8QXc?UC9(#P6t5cHl7OL=Au=ILfye`p{1ejkQ0B6V!eG7%j8O z&^p4|!DM6&(cd5@hkit>hR2A_Cgba9n>v8u80^h?1!O|l9`swbV%^8bfJk0KfsSN z-WiCpFtLl?-gECc=eGU)dj9}$juR6ZRCCxtEsKJQI(7~08E7zME`=2OiXqwVj2Kcq zHQ@}!zL5Mj^v2wOu*WVTmA-OpcVzn_%GY2@Pes7c>O0D_o~9~XhE~A+g>bkv@F(0K zu97YZYaVC@bErb!;Wr}EEN}Ll&FqEE(6|q!79JmoK##CGpxTV(daJ8ok>Yp@lSkNwgB6c4TSKQD#wO6w{|~ zV9#;cq&*XZCbsCDUo}wNri`KRL%xW`fZPibmEOV literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/service/UserInterface.class b/target/classes/com/zhouyu/service/UserInterface.class new file mode 100644 index 0000000000000000000000000000000000000000..4b2748097aeda04ab8aa763b609237a0b86d6ce9 GIT binary patch literal 147 zcmX^0Z`VEs1_l!bPId-%b_Nbc29}c4;u1y%W)00SMh33n{L-T2RJY8WR7M7&(Bjl0 z&%Bb1RK2XkvP4D(h2;EP{i=-o(#leOpmbSga;iRxIz|QokV^fW#JqHU|D>$c fwC{R_t?LF|M&^u3H&1Rs1=Yyy?{HoTf{xwck#f*Ll+Gf z+YFu#2O{i_qr`fZ|h>b))^12 z?kQmBJTf96i*-z}<;m<)`>*K!4BevO0a>(~H2j@raP3ntLxnoM!aN+fSU`qi0Y#9n z^iJ~>J&F#lVKL2>C@#^r9N{`0kSA1-p#)h(YngUFMMg2#{0{ah>95dg(Lm^Hw0e^Q ztYd?A44bIZYMb{7)S;Mf?tFza?Jg$S3Ta(S5Gs?Z6v3k3Of)jmdLiT~)mYBbXJndR d;Cw^&D&Qs!Tb+?qN&y|*qDBW>mqy$M{s0tt)c^nh literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor$1.class b/target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor$1.class new file mode 100644 index 0000000000000000000000000000000000000000..cef1328542412cf974af83efe925bee0a67ac639 GIT binary patch literal 1370 zcmb7E-A)rh6#k|yY+F}b7Z5~5l&Yl^7W@T^8YCD=s*;p&p^3?M8R+76r`g?B;L1C_ z^#Q!`3DgKCn(zR=hl#v|@yxcQ6{>+vIy-abobR0Tov-`j_qSaDH*i0OC@#z8N*pm< zjUkPZC^B)3A{)mT#uexaCKOCEL~DkfDssbN(DLg>&CqSbS<{~u*SYEE7&`ru<)tPV zvUyXK^{tYqZdP@VyEV(?`m^BpfWjAr=P$a#4&mVb|7HhrAH!zGL?GeqXZ z3TH^x#Cq_51FH9XBezBH9NcNb9aFhYZ5p6QW-NNxD5vyE!_C zr6n`E4VKAnBb51y@Tb60qqUP9fo^osdZrQFO*{D{0!T(4z38Jm3HXBGBJ|ciBcgTe zpfj8Kg3#Cwl#gT$L1I!_wDwVv{Q+*K9zj{^xEjt<$uh4-9_IpY4Ffn&*n?z^(A@>v Y579n^i?|fnhLJ)K?c#JBr8hl)0PCS{QUCw| literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor.class b/target/classes/com/zhouyu/service/ZhouyuBeanPostProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..3c2c723f68e44dd9ee4fda0dbd392004e4a32730 GIT binary patch literal 1330 zcmb7E?M@Rx6g@)=Ev0-|5JV9LE4Jlh#ZR-+uylfQ1CQFc!yn0=JNk;dTNOxMPAD z<7H#WB@oAC0#lfdVI~GkAX(5_xl2{)dCC*$n76g5;%1El{RAhBky0)1&gHeCWW{#<1#i?2QTTWxIVR_2ku`9}23#QMN)GLnXueeS{ zd7k6u1xD+qfyE79xdm2W%c{LEecRCjbD83{+>usQ>P_o)d0SQdd?-@#U0ZMFv!PHE zB+y-Vo!z~H_I#-;LD?;t*kqYi3B-+AmbEjmW_so-`Lgoim8>_rO_ZF5TTw4;!^g-! z`kOKP2@Jn!Xy2}>Rok=4*P_;rA9P2$1_Qdhy6M7Na%y!)EA8i#=s~YQSAz_ej!BH+ zZW6P&Cy={1!!g`XQXCJHc!bAE%;5=7=;F)Mv!;-zF|eR{JQL_U%OIOK>6#6+obX>O zj>)9V)W?RbviZyBoNacEiaXsU(567ort$-~=*V^DlG9B1$U~o~srU(4puZJHKsNye zO|flA3Q=GnlYJi&P>_wV#mxU`Ih3HOKy!zNPFr!+MwRNdDF59(5~J0pz&#acIm}16 zr`GC1yPf1M=p9~5b8B8oyXcm7aE=oHwm1;Xg2G+uL<=V zYn@kKJKN$Hl^ah0q1tzOns8ei8Ld6Nx_q7w7ebc{4Z=Y$w_ZT!>_Z(X1#L<@U~FLV(g;!16`ni#sB~S literal 0 HcmV?d00001 diff --git a/target/classes/com/zhouyu/service/ZhouyuValueBeanPostProcessor.class b/target/classes/com/zhouyu/service/ZhouyuValueBeanPostProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..03cc526bbfd6756113a8cd2e170635b3e28de23a GIT binary patch literal 1552 zcmaJ>OIOoC6#j-L9jw7354DN{KCrbwd>|@Sl&7K<(Rx_mY6t^F)1)U!IqKR!;ns~? z-PEHCk8b@%9vA4Hw2~+sHg{(3^P79WnIGF@ zau6EE)b1+Bcm^3<N?fgxSTQm)ZOvS7FmYla$lLz-}+NjD;P@mM@(5}j5 zJFsaIQ?BcUQO9TyN1{OlHPsn&#;evmSGr-zKo*?_CUKkNj)5smGo0FgWCYK^3}y|? zVcx)9+%vF%`vxAM%rFpNb???1c!*90bN?c{c)`#aXKqfDp-&}g-D!`Ab8S; zW=p;dXhIAFQ^*UAY zp+Gr&fk~~Z&lU7Ene&G|? z$H?48G94+i=%&5VbU+V!=|tSdQIaZnoBp$QS}Vl{+8RhLj(i>0Qsa8B-mAUC$S1{gNpt zNJBV4vIl(xV~9Wu;~3dbkVg*lI8N`O2ahojK^}unI-NXn;1pq!{RCZ#pti1|c6~S* zU9Eys=%>C6ki7_P8(EG)#(vYE&N)tVoZ&bdsW{GoaSZ)J`X{At!+8p6LmmZMRnIN} Fe*mw~j%)w` literal 0 HcmV?d00001