当前位置: 首页 > ds >正文

Spring之【写一个简单的IOC容器EasySpring】

目录

EasySpring

注解

@EasyAutowired

@EasyComponent

@EasyComponentScan

@EasyLazy

@EasyPostConstruct

@EasyProtoType 

@EasyValue

Bean定义信息

EasyBeanDefinition

管理Bean定义信息

EasyBeanDefinitionRegister

Aware

EasyAware

EasyBeanFactoryAware

EasyBeanNameAware

初始化

EasyInitializingBean

后置处理器

EasyBeanFactoryPostProcessor

EasyBeanPostProcessor

工具类

EasySpringUtil

容器 

EasyBeanFactory

EasyAnnotationConfigApplicationContext

EasyDefaultListableBeanFactory

测试案例

案例一

案例二

案例三

案例四

案例五


EasySpring

注解

包:easy.spring.annotations

@EasyAutowired

package easy.spring.annotations;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.METHOD, ElementType.CONSTRUCTOR})
public @interface EasyAutowired {
}

@EasyComponent

package easy.spring.annotations;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EasyComponent {String value() default "";
}

@EasyComponentScan

package easy.spring.annotations;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 EasyComponentScan {String[] value() default {};
}

@EasyLazy

package easy.spring.annotations;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 EasyLazy {
}

@EasyPostConstruct

package easy.spring.annotations;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.METHOD)
public @interface EasyPostConstruct {
}

@EasyProtoType 

package easy.spring.annotations;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 EasyProtoType {
}

@EasyValue

package easy.spring.annotations;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 EasyValue {String value();
}

Bean定义信息

包:easy.spring.beandefinition

EasyBeanDefinition

package easy.spring.beandefinition;public class EasyBeanDefinition {// bean名称private String beanName;// bean类型private Class<?> beanType;// bean的全限定名private String packageClassName;// 是否懒加载private boolean isLazy;// 是否单例private boolean isSingleton = true;public String getBeanName() {return beanName;}public void setBeanName(String beanName) {this.beanName = beanName;}public Class<?> getBeanType() {return beanType;}public void setBeanType(Class<?> beanType) {this.beanType = beanType;}public String getPackageClassName() {return packageClassName;}public void setPackageClassName(String packageClassName) {this.packageClassName = packageClassName;}public boolean isLazy() {return isLazy;}public void setLazy(boolean lazy) {isLazy = lazy;}public boolean isSingleton() {return isSingleton;}public void setSingleton(boolean singleton) {isSingleton = singleton;}
}

管理Bean定义信息

EasyBeanDefinitionRegister

包:easy.spring.register

package easy.spring.register;import easy.spring.beandefinition.EasyBeanDefinition;/*** 管理BeanDefinition*/
public interface EasyBeanDefinitionRegister {/*** 注册BeanDefinition*/void registerBeanDefinition(String beanName, EasyBeanDefinition beanDefinition);
}

Aware

包:easy.spring.aware

EasyAware

package easy.spring.aware;public interface EasyAware {
}

EasyBeanFactoryAware

package easy.spring.aware;import easy.spring.container.EasyBeanFactory;public interface EasyBeanFactoryAware extends EasyAware {/*** 传递Bean工厂*/void setEasyBeanFactory(EasyBeanFactory easyBeanFactory);
}

EasyBeanNameAware

package easy.spring.aware;public interface EasyBeanNameAware extends EasyAware {/*** 传递beanName*/void setBeanName(String beanName);
}

初始化

包:easy.spring.init

EasyInitializingBean

package easy.spring.init;public interface EasyInitializingBean {/*** Bean属性填充后的方法回调*/void afterPropertiesSet();
}

后置处理器

包:easy.spring.postprocessor

EasyBeanFactoryPostProcessor

package easy.spring.postprocessor;import easy.spring.container.EasyDefaultListableBeanFactory;/*** Bean工厂后处理器*/
@FunctionalInterface
public interface EasyBeanFactoryPostProcessor {/*** 此回调方法传递了Bean工厂*/void postProcessBeanFactory(EasyDefaultListableBeanFactory beanFactory);
}

EasyBeanPostProcessor

package easy.spring.postprocessor;/*** Bean后置处理器*/
public interface EasyBeanPostProcessor {/*** 初始化前回调方法*/default Object postProcessBeforeInitialization(Object bean, String beanName) {return bean;}/*** 初始化后回调方法*/default Object postProcessAfterInitialization(Object bean, String beanName) {return bean;}
}

工具类

包:easy.spring.utils

EasySpringUtil

package easy.spring.utils;import easy.spring.annotations.*;
import easy.spring.beandefinition.EasyBeanDefinition;
import easy.spring.container.EasyDefaultListableBeanFactory;
import easy.spring.postprocessor.EasyBeanFactoryPostProcessor;
import easy.spring.postprocessor.EasyBeanPostProcessor;import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;public class EasySpringUtil {// 资源是文件private static final String FILE = "file";/*** 获取basePackage*/public static String[] getBasePackage(Class<?> componentClass) {if (componentClass == null) return null;if (!componentClass.isAnnotationPresent(EasyComponentScan.class)) return null;String[] basePackages = componentClass.getAnnotation(EasyComponentScan.class).value();if (basePackages == null || basePackages.length == 0) return null;return basePackages;}/*** 获取指定包及其子包下的组件*/public static void componentClassInPackage(String basePackage, EasyDefaultListableBeanFactory beanFactory) throws Exception {if (basePackage == null || basePackage.equals("")) return;// 路径转换String path = basePackage.replace(".", "/");// 获取类加载器ClassLoader classLoader = getClassLoader();Enumeration<URL> resources = classLoader.getResources(path);while (resources.hasMoreElements()) {URL resource = resources.nextElement();if (!FILE.equals(resource.getProtocol())) continue;// 目录String directory = URLDecoder.decode(resource.getFile(), StandardCharsets.UTF_8.name());scanDirectory(new File(directory), basePackage, beanFactory, classLoader);}}private static void scanDirectory(File directory, String packageName, EasyDefaultListableBeanFactory beanFactory, ClassLoader classLoader) {File[] files = directory.listFiles();if (files == null) return;for (File file : files) {// 还是目录if (file.isDirectory()) {// 继续扫描子目录String newPackage = packageName.isEmpty() ? file.getName() : packageName + "." + file.getName();// 递归扫描scanDirectory(file, newPackage, beanFactory, classLoader);} else if (file.getName().endsWith(".class")) {// 文件名String fileName = file.getName();int length = fileName.length();fileName = fileName.substring(0, length - 6);// 全限定名String className = packageName + "." + fileName;loadClass(className, classLoader, fileName, beanFactory);}}}private static void loadClass(String className, ClassLoader classLoader, String fileName, EasyDefaultListableBeanFactory beanFactory) {try {Class<?> cls = classLoader.loadClass(className);if (!cls.isAnnotationPresent(EasyComponent.class)) {return;}// 保存组件类String componentName = cls.getAnnotation(EasyComponent.class).value();if (componentName == null || "".equals(componentName)) {// 组件默认名称为类名首字母小写componentName = fileName.substring(0, 1).toLowerCase() + fileName.substring(1);}EasyBeanDefinition beanDefinition = buildBeanDefinition(className, componentName, cls);registerBeanDefinition(beanFactory, beanDefinition);// BeanFactory后处理器if (EasyBeanFactoryPostProcessor.class.isAssignableFrom(cls)) {beanFactory.addBeanFactoryPostProcessor((EasyBeanFactoryPostProcessor) instantiateBean(beanDefinition));}// Bean后处理器if (EasyBeanPostProcessor.class.isAssignableFrom(cls)) {beanFactory.addBeanPostProcessor((EasyBeanPostProcessor) instantiateBean(beanDefinition));}} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}/*** 构建BeanDefinition*/public static EasyBeanDefinition buildBeanDefinition(String className, String componentName, Class<?> cls) {EasyBeanDefinition beanDefinition = new EasyBeanDefinition();beanDefinition.setBeanName(componentName);beanDefinition.setBeanType(cls);beanDefinition.setPackageClassName(className);if (cls.isAnnotationPresent(EasyLazy.class)) {beanDefinition.setLazy(true);}if (cls.isAnnotationPresent(EasyProtoType.class)) {beanDefinition.setSingleton(false);}return beanDefinition;}public static void registerBeanDefinition(EasyDefaultListableBeanFactory beanFactory, EasyBeanDefinition beanDefinition) {beanFactory.registerBeanDefinition(beanDefinition.getBeanName(), beanDefinition);}/*** 获取类加载器*/public static ClassLoader getClassLoader() {return Thread.currentThread().getContextClassLoader();}/*** Bean的实例化*/public static Object instantiateBean(EasyBeanDefinition beanDefinition) {try {if (beanDefinition == null) return null;Class<?> beanType = beanDefinition.getBeanType();Constructor<?> constructor = beanType.getConstructor();return constructor.newInstance();} catch (Exception e) {throw new RuntimeException(e);}}/*** Bean的属性填充*/public static void populateBean(Object bean, EasyDefaultListableBeanFactory beanFactory) {if (bean == null) return;Class<?> clz = bean.getClass();Field[] fields = clz.getDeclaredFields();if (fields.length == 0) {return;}// 处理@EasyAutowiredhandleAutowired(bean, fields, beanFactory);// 处理@EasyValuehandleValue(bean, fields);System.out.println("处理属性注入完成...");}private static void handleAutowired(Object bean, Field[] fields, EasyDefaultListableBeanFactory beanFactory) {for (Field field : fields) {field.setAccessible(true);if (!field.isAnnotationPresent(EasyAutowired.class)) {continue;}Class<?> type = field.getType();Object propertyBean = beanFactory.getBean(type);if (propertyBean == null) {throw new RuntimeException(String.format("no such type bean:[%s]", type.getName()));}try {field.set(bean, propertyBean);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}private static void handleValue(Object bean, Field[] fields) {for (Field field : fields) {try {field.setAccessible(true);if (!field.isAnnotationPresent(EasyValue.class)) {continue;}EasyValue easyValue = field.getAnnotation(EasyValue.class);String value = easyValue.value();if (value == null) {field.set(bean, null);return;}Class<?> type = field.getType();if (type == Integer.class || type == int.class) {field.set(bean, Integer.valueOf(value));} else if (type == Long.class || type == long.class) {field.set(bean, Long.valueOf(value));} else if (type == Double.class || type == double.class) {field.set(bean, Double.valueOf(value));} else if (type == BigDecimal.class) {field.set(bean, new BigDecimal(value));} else {field.set(bean, value);}} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}/*** 执行初始化方法*/public static void invokeInitMethod(Object bean) {if (bean == null)return;Method[] methods = bean.getClass().getDeclaredMethods();for (Method method : methods) {if (!method.isAnnotationPresent(EasyPostConstruct.class)) {continue;}try {method.invoke(bean);} catch (Exception e) {throw new RuntimeException(e);}}}
}

容器 

包:easy.spring.container

EasyBeanFactory

package easy.spring.container;/*** Bean工厂,顶级接口*/
public interface EasyBeanFactory {/*** 通过beanName获取bean对象** @param beanName:bean的名字* @return:bean对象*/Object getBean(String beanName);/*** 通过beanType获取bean对象** @param beanType:bean的类型* @return:bean对象*/<T> T getBean(Class<T> beanType);/*** 通过beanName和beanType获取bean对象** @param beanName:bean的名字* @param beanType:bean的类型*/<T> T getBean(String beanName, Class<T> beanType);
}

EasyAnnotationConfigApplicationContext

package easy.spring.container;import easy.spring.beandefinition.EasyBeanDefinition;
import easy.spring.postprocessor.EasyBeanFactoryPostProcessor;
import easy.spring.utils.EasySpringUtil;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;public class EasyAnnotationConfigApplicationContext implements EasyBeanFactory {// 维护了Bean工厂的引用private final EasyDefaultListableBeanFactory beanFactory;public EasyAnnotationConfigApplicationContext(Class<?>... componentClasses) {// checkif (componentClasses == null || componentClasses.length == 0)throw new RuntimeException("no component class!");// 刷新bean工厂beanFactory = refreshBeanFactory();// 注册Bean定义信息register(componentClasses);// BeanFactoryPostProcessor的方法回调invokeBeanFactoryPostProcessors();// 创建所有非懒加载的单例Bean放入单例池子中doCreateBean();}private EasyDefaultListableBeanFactory refreshBeanFactory() {return new EasyDefaultListableBeanFactory();}private void register(Class<?>... componentClasses) {// 用于存放所有要扫描的包List<String> basePackages = new ArrayList<>();for (Class<?> component : componentClasses) {String[] packages = EasySpringUtil.getBasePackage(component);if (packages == null) {continue;}basePackages.addAll(Arrays.asList(packages));}// 没有解析到要扫描的base包if (basePackages.size() == 0) {throw new RuntimeException("no basePackages!");}// 遍历所有base包for (String basePackage : basePackages) {try {EasySpringUtil.componentClassInPackage(basePackage, beanFactory);} catch (Exception e) {throw new RuntimeException(e);}}}private void invokeBeanFactoryPostProcessors() {List<EasyBeanFactoryPostProcessor> beanFactoryPostProcessors = beanFactory.getBeanFactoryPostProcessors();// 执行每一个BeanFactory后置处理器for (EasyBeanFactoryPostProcessor beanFactoryPostProcessor : beanFactoryPostProcessors) {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);}}public void doCreateBean() {// 遍历所有的beanNameList<String> beanNames = beanFactory.getBeanNames();for (String beanName : beanNames) {Map<String, EasyBeanDefinition> beanDefinitionMap = beanFactory.getBeanDefinitionMap();EasyBeanDefinition beanDefinition = beanDefinitionMap.get(beanName);if (beanDefinition.isLazy() || !beanDefinition.isSingleton()) {continue;}Object bean = beanFactory.getBean(beanName);// 放入单例池beanFactory.registerSingletonBean(beanName, bean);}}@Overridepublic Object getBean(String beanName) {return this.beanFactory.getBean(beanName);}@Overridepublic <T> T getBean(Class<T> beanType) {return this.beanFactory.getBean(beanType);}@Overridepublic <T> T getBean(String beanName, Class<T> beanType) {return this.beanFactory.getBean(beanName, beanType);}
}

EasyDefaultListableBeanFactory

package easy.spring.container;import easy.spring.aware.EasyAware;
import easy.spring.aware.EasyBeanFactoryAware;
import easy.spring.aware.EasyBeanNameAware;
import easy.spring.beandefinition.EasyBeanDefinition;
import easy.spring.init.EasyInitializingBean;
import easy.spring.postprocessor.EasyBeanFactoryPostProcessor;
import easy.spring.postprocessor.EasyBeanPostProcessor;
import easy.spring.register.EasyBeanDefinitionRegister;
import easy.spring.utils.EasySpringUtil;import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;/*** 功能最强大的Bean容器*/
public class EasyDefaultListableBeanFactory implements EasyBeanFactory, EasyBeanDefinitionRegister {// 单例池private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(64);//Bean定义信息private final Map<String, EasyBeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(64);//Bean Namesprivate final List<String> beanNames = new CopyOnWriteArrayList<>();// Bean后处理器private final List<EasyBeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();// Bean工厂后处理器private final List<EasyBeanFactoryPostProcessor> beanFactoryPostProcessors = new CopyOnWriteArrayList<>();public Object getBean(String beanName) {if (!beanNames.contains(beanName)) {throw new RuntimeException(String.format("no such beanName:[%s]", beanName));}// 单例池中存在,直接返回Object bean = getBeanFromSingletonObjects(beanName);if (bean != null) {return bean;}EasyBeanDefinition beanDefinition = beanDefinitionMap.get(beanName);// 实例化bean = EasySpringUtil.instantiateBean(beanDefinition);// 属性填充EasySpringUtil.populateBean(bean, this);// InitializingBean#afterPropertiesSetif (bean instanceof EasyInitializingBean) {((EasyInitializingBean) bean).afterPropertiesSet();}// Aware接口的方法回调if (bean instanceof EasyAware) {if (bean instanceof EasyBeanFactoryAware) {((EasyBeanFactoryAware) bean).setEasyBeanFactory(this);}if (bean instanceof EasyBeanNameAware) {((EasyBeanNameAware) bean).setBeanName(beanName);}}// BeanPostProcessor#postProcessBeforeInitializationfor (EasyBeanPostProcessor beanPostProcessor : beanPostProcessors) {bean = beanPostProcessor.postProcessBeforeInitialization(bean, beanName);}// 执行@PostConstruct注解标记的初始化方法EasySpringUtil.invokeInitMethod(bean);// BeanPostProcessor#postProcessAfterInitializationfor (EasyBeanPostProcessor beanPostProcessor : beanPostProcessors) {bean = beanPostProcessor.postProcessAfterInitialization(bean, beanName);}// 懒加载的单例Beanif (beanDefinition.isLazy()) {registerSingletonBean(beanName, bean);}return bean;}@Override@SuppressWarnings("all")public <T> T getBean(Class<T> beanType) {if (beanType == null) {throw new RuntimeException("the bean type is null!");}String beanName = null;for (Map.Entry<String, EasyBeanDefinition> entry : beanDefinitionMap.entrySet()) {EasyBeanDefinition beanDefinition = entry.getValue();if (beanDefinition.getBeanType() == beanType || beanType.isAssignableFrom(beanDefinition.getBeanType())) {beanName = entry.getKey();break;}}if (beanName == null) {throw new RuntimeException(String.format("no such type bean:[%s]!", beanType.getName()));}return (T) getBean(beanName);}@Override@SuppressWarnings("all")public <T> T getBean(String beanName, Class<T> beanType) {return (T) getBean(beanName);}@Overridepublic void registerBeanDefinition(String beanName, EasyBeanDefinition beanDefinition) {if (beanNames.contains(beanName)) {throw new RuntimeException("exists beanName!");}beanDefinitionMap.put(beanName, beanDefinition);beanNames.add(beanName);}public void registerSingletonBean(String beanName, Object bean) {singletonObjects.put(beanName, bean);}/*** 从单例池中获取Bean实例*/public Object getBeanFromSingletonObjects(String beanName) {return singletonObjects.get(beanName);}public List<String> getBeanNames() {return beanNames;}public Map<String, EasyBeanDefinition> getBeanDefinitionMap() {return beanDefinitionMap;}public List<EasyBeanPostProcessor> getBeanPostProcessors() {return beanPostProcessors;}public List<EasyBeanFactoryPostProcessor> getBeanFactoryPostProcessors() {return beanFactoryPostProcessors;}public void addBeanPostProcessor(EasyBeanPostProcessor beanPostProcessor) {beanPostProcessors.add(beanPostProcessor);}public void addBeanFactoryPostProcessor(EasyBeanFactoryPostProcessor beanFactoryPostProcessor) {beanFactoryPostProcessors.add(beanFactoryPostProcessor);}
}

测试案例

package test.config;import easy.spring.annotations.EasyComponentScan;@EasyComponentScan("test")
public class EasySpringConfig {
}

案例一

测试单例Bean

package test.bean;import easy.spring.annotations.EasyComponent;
import easy.spring.annotations.EasyValue;@EasyComponent
public class Account {
}
package test.main;import easy.spring.container.EasyAnnotationConfigApplicationContext;
import easy.spring.container.EasyBeanFactory;
import test.bean.Account;
import test.config.EasySpringConfig;public class TestMain {public static void main(String[] args) {EasyBeanFactory easyBeanFactory = new EasyAnnotationConfigApplicationContext(EasySpringConfig.class);// 通过beanName获取Object accountBean1 = easyBeanFactory.getBean("account");// 再次通过beanName获取Object accountBean2 = easyBeanFactory.getBean("account");// 通过beanType获取Object accountBean3 = easyBeanFactory.getBean(Account.class);// 通过beanName+beanType获取Object accountBean4 = easyBeanFactory.getBean("account", Account.class);// test.bean.Account@27abe2cdSystem.out.println(accountBean1);// test.bean.Account@27abe2cdSystem.out.println(accountBean2);// test.bean.Account@27abe2cdSystem.out.println(accountBean3);// test.bean.Account@27abe2cdSystem.out.println(accountBean4);}
}

案例二

测试原型Bean

package test.bean;import easy.spring.annotations.EasyComponent;
import easy.spring.annotations.EasyProtoType;@EasyComponent
@EasyProtoType
public class User {
}
package test.main;import easy.spring.container.EasyAnnotationConfigApplicationContext;
import test.config.EasySpringConfig;public class TestMain {public static void main(String[] args) {EasyAnnotationConfigApplicationContext applicationContext = new EasyAnnotationConfigApplicationContext(EasySpringConfig.class);Object user1 = applicationContext.getBean("user");// test.bean.User@5f5a92bbSystem.out.println(user1);Object user2 = applicationContext.getBean("user");// test.bean.User@6fdb1f78System.out.println(user2);}
}

案例三

测试属性注入:@EasyValue

package test.bean;import easy.spring.annotations.EasyComponent;
import easy.spring.annotations.EasyValue;@EasyComponent
public class Account {@EasyValue("账户A")private String name;@EasyValue("18")private int age;public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Account{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package test.main;import easy.spring.container.EasyAnnotationConfigApplicationContext;
import test.bean.Account;
import test.config.EasySpringConfig;public class TestMain2 {public static void main(String[] args) {EasyAnnotationConfigApplicationContext applicationContext = new EasyAnnotationConfigApplicationContext(EasySpringConfig.class);Account account = applicationContext.getBean("account", Account.class);// Account{name='账户A', age=18}System.out.println(account);}
}

案例四

测试属性注入:@EasyAutowired

package test.service;public interface AccountService {void showAllAccounts();
}
package test.service.impl;import easy.spring.annotations.EasyComponent;
import test.service.AccountService;@EasyComponent
public class AccountServiceImpl implements AccountService {@Overridepublic void showAllAccounts() {System.out.println("展示所有账户信息...");}
}
package test.controller;import easy.spring.annotations.EasyAutowired;
import easy.spring.annotations.EasyComponent;
import test.service.AccountService;@EasyComponent
public class AccountController {@EasyAutowiredprivate AccountService accountService;public void showAccounts() {accountService.showAllAccounts();}
}
package test.main;import easy.spring.container.EasyAnnotationConfigApplicationContext;
import test.config.EasySpringConfig;
import test.controller.AccountController;public class TestMain {public static void main(String[] args) {EasyAnnotationConfigApplicationContext applicationContext = new EasyAnnotationConfigApplicationContext(EasySpringConfig.class);AccountController accountController = applicationContext.getBean(AccountController.class);// 展示所有账户信息...accountController.showAccounts();}
}

案例五

测试Bean的生命周期

  1. 生成BeanDefinition
  2. BeanFactoryPostProcessor#postProcessBeanFactory方法回调
  3. 实例化前的后置处理器方法回调
  4. Bean的实例化
  5. 实例化后的后置处理器方法回调
  6. 处理属性注入
  7. InitializingBean#afterPropertiesSet方法回调
  8. Aware的方法回调(BeanNameAware、BeanClassLoaderAware、BeanFactoryAware)
  9. BeanPostProcessor#postProcessBeforeInitialization方法回调
  10. 执行初始化方法
  11. BeanPostProcessor#postProcessAfterInitialization方法回调
package test.bean;import easy.spring.annotations.EasyComponent;
import easy.spring.annotations.EasyPostConstruct;
import easy.spring.annotations.EasyValue;
import easy.spring.aware.EasyBeanNameAware;
import easy.spring.init.EasyInitializingBean;@EasyComponent
public class LifeCycle implements EasyInitializingBean, EasyBeanNameAware {@EasyValue("defaultValue")private String field;public void showField() {System.out.println("the field is: " + field);}@Overridepublic void afterPropertiesSet() {System.out.println("执行InitializingBean#afterPropertiesSet方法...");}@Overridepublic void setBeanName(String beanName) {System.out.println("执行BeanNameAware的setBeanName方法...beanName is: " + beanName);}@EasyPostConstructpublic void initMethod() {System.out.println("执行初始化方法...");}
}
package test.bean;import easy.spring.annotations.EasyValue;import java.math.BigDecimal;// 这里只是一个普通的Java类,并没有加@EasyComponent,将通过Bean工厂后处理器将其放入容器中
public class Normal {@EasyValue("field1")private String field1;@EasyValue("99.99")private BigDecimal field2;@Overridepublic String toString() {return "Normal{" +"field1='" + field1 + '\'' +", field2=" + field2 +'}';}
}
package test.postprocessor;import easy.spring.annotations.EasyComponent;
import easy.spring.beandefinition.EasyBeanDefinition;
import easy.spring.container.EasyDefaultListableBeanFactory;
import easy.spring.postprocessor.EasyBeanFactoryPostProcessor;
import test.bean.Normal;@EasyComponent
public class CustomBeanFactoryPostProcessor implements EasyBeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(EasyDefaultListableBeanFactory beanFactory) {System.out.println("执行BeanFactoryPostProcessor#postProcessBeanFactory方法...");// 这里通过Bean工厂后处理器将Normal放入Bean容器EasyBeanDefinition beanDefinition = new EasyBeanDefinition();beanDefinition.setBeanType(Normal.class);beanFactory.registerBeanDefinition("normal",beanDefinition);}
}
package test.postprocessor;import easy.spring.annotations.EasyComponent;
import easy.spring.postprocessor.EasyBeanPostProcessor;@EasyComponent
public class CustomBeanPostProcessor implements EasyBeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("执行BeanPostProcessor#postProcessBeforeInitialization方法...");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("执行BeanPostProcessor#postProcessAfterInitialization方法...");return bean;}
}
package test.main;import easy.spring.container.EasyAnnotationConfigApplicationContext;
import test.bean.LifeCycle;
import test.bean.Normal;
import test.config.EasySpringConfig;public class TestMain {public static void main(String[] args) {EasyAnnotationConfigApplicationContext applicationContext = new EasyAnnotationConfigApplicationContext(EasySpringConfig.class);LifeCycle lifeCycle = applicationContext.getBean(LifeCycle.class);//the field is: defaultValuelifeCycle.showField();Normal normal = applicationContext.getBean("normal", Normal.class);//Normal{field1='field1', field2=99.99}System.out.println(normal);}
}

http://www.xdnf.cn/news/15352.html

相关文章:

  • 批量自动运行多个 Jupyter Notebook 文件的方法!!!
  • 创建Spring Boot项目
  • 基于 Redisson 实现分布式系统下的接口限流
  • 网络安全初级第一次作业
  • MacOS环境下运行EasySearch报错无法信任Java包的解决方案
  • ServiceNow Portal前端页面实战讲解
  • GGE Lua 详细教程
  • 【6.1.1 漫画分库分表】
  • c#中生成随机数的三种方法
  • pgsql模板是什么?
  • Kafka——聊聊Kafka的版本号
  • 【理念●体系】从零打造 Windows + WSL + Docker + Anaconda + PyCharm 的 AI 全链路开发体系
  • 1Panel V1 无缝升级到 V2 版本 实现多个 PHP 网站共享一个容器
  • Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)
  • AIStarter新版重磅来袭!永久订阅限时福利抢先看
  • ARM架构CPU的市场和生态
  • 使用云虚拟机搭建hadoop集群环境
  • Claude Code是什么?国内如何使用到Claude Code?附国内最新使用教程
  • 四、神经网络——正则化方法
  • 喷涂机器人cad【1张】+三维图+设计说明书+降重
  • redis数据结构和数据类型
  • vector之动态二维数组的底层
  • 2025年亚太中文赛B题第一版本超详细解题思路
  • C++:非类型模板参数,模板特化以及模板的分离编译
  • Java大厂面试故事:谢飞机的互联网医疗系统技术面试(Spring Boot、MyBatis、Kafka、Spring Security、AI等)
  • FastAPI + SQLAlchemy (异步版)连接数据库时,对数据进行加密
  • 【字节跳动】数据挖掘面试题0016:解释AUC的定义,它解决了什么问题,优缺点是什么,并说出工业界如何计算AUC。
  • UE5多人MOBA+GAS 18、用对象池来设置小兵的队伍的生成,为小兵设置一个目标从己方出生点攻打对方出生点,优化小兵的血条UI
  • (补充)RS422
  • 【每日刷题】x 的平方根