30个类手写Spring核心原理之Ioc顶层架构设计(2)

《MySql面试专题》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySql性能优化的21个最佳实践》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

《MySQL高级知识笔记》

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

关注我,点赞本文给更多有需要的人

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

package com.tom.spring.formework.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 自动注入

*/

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface GPAutowired {

String value() default “”;

}

1.3 @GPController

@GPController代码如下:

package com.tom.spring.formework.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 页面交互

*/

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface GPController {

String value() default “”;

}

1.4 @GPRequestMapping

@GPRequestMapping代码如下:

package com.tom.spring.formework.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 请求URL

*/

@Target({ElementType.METHOD,ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface GPRequestMapping {

String value() default “”;

}

1.5 @GPRequestParam

@GPRequestParam代码如下:

package com.tom.spring.formework.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

  • 请求参数映射

*/

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface GPRequestParam {

String value() default “”;

}

2 core(顶层接口)模块


2.1 GPFactoryBean

关于顶层接口设计,通过前面的学习我们了解了FactoryBean的基本作用,在此不做过多解释。

package com.tom.spring.formework.core;

public interface GPFactoryBean {

}

2.2 GPBeanFactory

作为所有IoC容器的顶层设计,前面也已经详细介绍了BeanFactory的作用。

package com.tom.spring.formework.core;

/**

  • 单例工厂的顶层设计

*/

public interface GPBeanFactory {

/**

  • 根据beanName从IoC容器中获得一个实例Bean

  • @param beanName

  • @return

*/

Object getBean(String beanName) throws Exception;

public Object getBean(Class<?> beanClass) throws Exception;

}

3 beans(配置封装)模块


3.1 GPBeanDefinition

BeanDefinition主要用于保存Bean相关的配置信息。

package com.tom.spring.formework.beans.config;

//用来存储配置文件中的信息

//相当于保存在内存中的配置

public class GPBeanDefinition {

private String beanClassName; //原生Bean的全类名

private boolean lazyInit = false; //标记是否延时加载

private String factoryBeanName; //保存beanName,在IoC容器中存储的key

public String getBeanClassName() {

return beanClassName;

}

public void setBeanClassName(String beanClassName) {

this.beanClassName = beanClassName;

}

public boolean isLazyInit() {

return lazyInit;

}

public void setLazyInit(boolean lazyInit) {

this.lazyInit = lazyInit;

}

public String getFactoryBeanName() {

return factoryBeanName;

}

public void setFactoryBeanName(String factoryBeanName) {

this.factoryBeanName = factoryBeanName;

}

}

3.2 GPBeanWrapper

BeanWrapper主要用于封装创建后的对象实例,代理对象(Proxy Object)或者原生对象(Original Object)都由BeanWrapper来保存。

package com.tom.spring.formework.beans;

public class GPBeanWrapper {

private Object wrappedInstance;

private Class<?> wrappedClass;

public GPBeanWrapper(Object wrappedInstance){

this.wrappedInstance = wrappedInstance;

}

public Object getWrappedInstance(){

return this.wrappedInstance;

}

//返回代理以后的Class

//可能会是这个 $Proxy0

public Class<?> getWrappedClass(){

return this.wrappedInstance.getClass();

}

}

4 context(IoC容器)模块


4.1 GPAbstractApplicationContext

IoC容器实现类的顶层抽象类,实现IoC容器相关的公共逻辑。为了尽可能地简化,在这个Mini版本中,暂时只设计了一个refresh()方法。

package com.tom.spring.formework.context.support;

/**

  • IoC容器实现的顶层设计

*/

public abstract class GPAbstractApplicationContext {

//受保护,只提供给子类重写

public void refresh() throws Exception {}

}

4.2 GPDefaultListableBeanFactory

DefaultListableBeanFactory是众多IoC容器子类的典型代表。在Mini版本中我只做了一个简单的设计,就是定义顶层的IoC缓存,也就是一个Map,属性名字也和原生Spring保持一致,定义为beanDefinitionMap,以方便大家对比理解。

package com.tom.spring.formework.beans.support;

import com.tom.spring.formework.beans.config.GPBeanDefinition;

import com.tom.spring.formework.context.support.GPAbstractApplicationContext;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

public class GPDefaultListableBeanFactory extends GPAbstractApplicationContext{

//存储注册信息的BeanDefinition

protected final Map<String, GPBeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, GPBeanDefinition>();

}

4.3 GPApplicationContext

ApplicationContext是直接接触用户的入口,主要实现DefaultListableBeanFactory的refresh()方法和BeanFactory的getBean()方法,完成IoC、DI、AOP的衔接。

package com.tom.spring.formework.context;

import com.tom.spring.formework.annotation.GPAutowired;

import com.tom.spring.formework.annotation.GPController;

import com.tom.spring.formework.annotation.GPService;

import com.tom.spring.formework.beans.GPBeanWrapper;

import com.tom.spring.formework.beans.config.GPBeanPostProcessor;

import com.tom.spring.formework.core.GPBeanFactory;

import com.tom.spring.formework.beans.config.GPBeanDefinition;

import com.tom.spring.formework.beans.support.GPBeanDefinitionReader;

import com.tom.spring.formework.beans.support.GPDefaultListableBeanFactory;

import java.lang.reflect.Field;

import java.util.List;

import java.util.Map;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

/**

  • 按之前源码分析的套路,IoC、DI、MVC、AOP

*/

public class GPApplicationContext extends GPDefaultListableBeanFactory implements GPBeanFactory {

private String [] configLoactions;

private GPBeanDefinitionReader reader;

//单例的IoC容器缓存

private Map<String,Object> factoryBeanObjectCache = new ConcurrentHashMap<String, Object>();

//通用的IoC容器

private Map<String,GPBeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<String, GPBeanWrapper>();

public GPApplicationContext(String… configLoactions){

this.configLoactions = configLoactions;

try {

refresh();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void refresh() throws Exception{

//1. 定位,定位配置文件

reader = new GPBeanDefinitionReader(this.configLoactions);

//2. 加载配置文件,扫描相关的类,把它们封装成BeanDefinition

List beanDefinitions = reader.loadBeanDefinitions();

//3. 注册,把配置信息放到容器里面(伪IoC容器)

doRegisterBeanDefinition(beanDefinitions);

//4. 把不是延时加载的类提前初始化

doAutowrited();

}

//只处理非延时加载的情况

private void doAutowrited() {

for (Map.Entry<String, GPBeanDefinition> beanDefinitionEntry : super.beanDefinitionMap.entrySet()) {

String beanName = beanDefinitionEntry.getKey();

if(!beanDefinitionEntry.getValue().isLazyInit()) {

try {

getBean(beanName);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

private void doRegisterBeanDefinition(List beanDefinitions) throws Exception {

for (GPBeanDefinition beanDefinition: beanDefinitions) {

if(super.beanDefinitionMap.containsKey(beanDefinition.getFactoryBeanName())){

throw new Exception(“The “” + beanDefinition.getFactoryBeanName() + “” is exists!!”);

}

super.beanDefinitionMap.put(beanDefinition.getFactoryBeanName(),beanDefinition);

}

//到这里为止,容器初始化完毕

}

public Object getBean(Class<?> beanClass) throws Exception {

return getBean(beanClass.getName());

}

//依赖注入,从这里开始,读取BeanDefinition中的信息

//然后通过反射机制创建一个实例并返回

//Spring做法是,不会把最原始的对象放出去,会用一个BeanWrapper来进行一次包装

//装饰器模式:

//1. 保留原来的OOP关系

//2. 需要对它进行扩展、增强(为了以后的AOP打基础)

public Object getBean(String beanName) throws Exception {

return null;

}

public String[] getBeanDefinitionNames() {

return this.beanDefinitionMap.keySet().toArray(new String[this.beanDefinitionMap. size()]);

}

public int getBeanDefinitionCount(){

return this.beanDefinitionMap.size();

}

public Properties getConfig(){

return this.reader.getConfig();

}

}

4.4 GPBeanDefinitionReader

根据约定,BeanDefinitionReader主要完成对application.properties配置文件的解析工作,实现逻辑非常简单。通过构造方法获取从ApplicationContext传过来的locations配置文件路径,然后解析,扫描并保存所有相关的类并提供统一的访问入口。

package com.tom.spring.formework.beans.support;

import com.tom.spring.formework.beans.config.GPBeanDefinition;

import java.io.File;

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

onCount(){

return this.beanDefinitionMap.size();

}

public Properties getConfig(){

return this.reader.getConfig();

}

}

4.4 GPBeanDefinitionReader

根据约定,BeanDefinitionReader主要完成对application.properties配置文件的解析工作,实现逻辑非常简单。通过构造方法获取从ApplicationContext传过来的locations配置文件路径,然后解析,扫描并保存所有相关的类并提供统一的访问入口。

package com.tom.spring.formework.beans.support;

import com.tom.spring.formework.beans.config.GPBeanDefinition;

import java.io.File;

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-dbFmEocd-1715789616796)]

《Java高级架构知识》

[外链图片转存中…(img-DvyTRWSL-1715789616797)]

《算法知识》

[外链图片转存中…(img-Vbfcmulm-1715789616797)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值