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

企业网站建设cms站重庆seo俱乐部联系方式

企业网站建设cms站,重庆seo俱乐部联系方式,天台建设局网站,9377网页游戏这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能 文章目录这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能🚀ComponentScan注解✈️Component注解🚁在spring中ioc容器的类是ApplicationConte…

这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能

文章目录

  • 这篇博客实现了一个简单版本的Spring,主要包括Spring的Ioc和Aop功能
    • 🚀@ComponentScan注解
    • ✈️@Component注解
    • 🚁在spring中ioc容器的类是ApplicationContext
    • 🚂测试类
    • 🚊MySpringConfig类,统一的配置类
    • 🚞OrderService类,一个普通的bean
      • 🚲来测试一下功能
    • 🚡@Scope注解
    • 🚟BeanDefinition 类
      • 🚠要实现我们的@scope注解,我们需要改造一下我们的代码
      • 🚜然后我们从beanDefinitionMap中实例化bean
      • 🚙我们来看一下效果
    • 🚘@Autowired注解
    • 🚗UserService类,orderservice注入该类
      • 🚗要使@Autowired注解生效,将bean实例化到一级缓存中方法需要改造一下
    • 🚕BeanPostProcessor接口
    • 🚖添加自己的BeanPostProcessor
    • 🚛Aop

🚀@ComponentScan注解

ComponentScan做的事情就是告诉Spring从哪里找到bean

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ComponentScan {String[] value() default {};}

✈️@Component注解

@Component是spring中的一个注解,它的作用就是实现bean的注入

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {String value() default "";}

🚁在spring中ioc容器的类是ApplicationContext

所以我们需要创建一个ApplicationContext,有参构造传入config的class

public class ApplicationContext {public ApplicationContext(Class configClass) {}}

存放bean的map

public class ApplicationContext {private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);public ApplicationContext(Class configClass) {}}

拿到ComponentScan的值

public class ApplicationContext {private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);public ApplicationContext(Class configClass) {//查看是否有ComponentScan注解if (configClass.isAnnotationPresent(ComponentScan.class)) {ComponentScan componentScanAnnotation = (ComponentScan) configClass.getAnnotation(ComponentScan.class);String[] paths = componentScanAnnotation.value();}}
}

拿到该路径下所有的class文件

public class ApplicationContext {private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);public ApplicationContext(Class configClass) {//查看是否有ComponentScan注解if (configClass.isAnnotationPresent(ComponentScan.class)) {ComponentScan componentScanAnnotation = (ComponentScan) configClass.getAnnotation(ComponentScan.class);String[] paths = componentScanAnnotation.value();for (String path : paths) {//拿到包路径ClassLoader classLoader = ApplicationContext.class.getClassLoader();URL resource = classLoader.getResource(path.replace(".", "/"));//拿到该路径下所有的class文件File file = new File(resource.getFile());if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files) {}}}}}
}

注册有Component注解的bean

public class ApplicationContext {private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);public ApplicationContext(Class configClass) {//查看是否有ComponentScan注解if (configClass.isAnnotationPresent(ComponentScan.class)) {ComponentScan componentScanAnnotation = (ComponentScan) configClass.getAnnotation(ComponentScan.class);String[] paths = componentScanAnnotation.value();for (String path : paths) {//拿到包路径ClassLoader classLoader = ApplicationContext.class.getClassLoader();URL resource = classLoader.getResource(path.replace(".", "/"));//拿到该路径下所有的class文件File file = new File(resource.getFile());if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files) {try {String filePath = f.getPath();//拿到com.masiyi.service.MySpringConfigString sub = filePath.substring(filePath.indexOf("com"), filePath.indexOf(".class"));String classes = sub.replace("\\", ".");Class<?> aClass = classLoader.loadClass(classes);//注册有Component注解的beanif (aClass.isAnnotationPresent(Component.class)) {Object bean = aClass.getDeclaredConstructor().newInstance();Component component = aClass.getAnnotation(Component.class);String beanName = component.value();if ("".equals(beanName) || beanName == null) {singletonObjects.put(f.getName().split("\\.")[0], bean);} else {singletonObjects.put(beanName, bean);}}} catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {e.printStackTrace();}}}}}}
}

🚂测试类

现在我们最基础的spring的ioc已经基本实现了,我们新建一个测试类来测试

public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ApplicationContext(MySpringConfig.class);}
}

🚊MySpringConfig类,统一的配置类

@ComponentScan("com.masiyi.service")
public class MySpringConfig {}

🚞OrderService类,一个普通的bean

@Component
public class OrderService {
}

🚲来测试一下功能

拿到包路径

在这里插入图片描述

拿到该路径下所有的class文件

在这里插入图片描述

注册有Component注解的bean

在这里插入图片描述

注册进ioc

在这里插入图片描述

getBean方法

  public Object getBean(String beanName) {return this.singletonObjects.get(beanName);}

在这里插入图片描述

🚡@Scope注解

@Scope注解是 Spring IOC 容器中的一个作用域

🚟BeanDefinition 类

BeanDefinition 是定义 Bean 的配置元信息接口,可以理解为创建bean过程中的一个中间类,扩展bean,存储更多的信息

public class BeanDefinition {private String scope;private Class aClass;public String getScope() {return scope;}public void setScope(String scope) {this.scope = scope;}public Class getaClass() {return aClass;}public void setaClass(Class aClass) {this.aClass = aClass;}
}

🚠要实现我们的@scope注解,我们需要改造一下我们的代码

把createBean方法抽离出来

  private void createBean(String beanName,Class<?> aClass){//注册有Component注解的beanif (aClass.isAnnotationPresent(Component.class)) {Component component = aClass.getAnnotation(Component.class);BeanDefinition beanDefinition = new BeanDefinition();if (aClass.isAnnotationPresent(Scope.class)) {Scope scope = aClass.getAnnotation(Scope.class);beanDefinition.setScope(scope.value());} else {beanDefinition.setScope("singleton");}beanDefinition.setaClass(aClass);String value = component.value();if ("".equals(value)) {beanDefinitionMap.put(beanName, beanDefinition);} else {beanDefinitionMap.put(value, beanDefinition);}}}

扫描ComponentScan注解的方法体改一下

🚜然后我们从beanDefinitionMap中实例化bean

//将bean实例化到一级缓存中for (String beanName : beanDefinitionMap.keySet()) {BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);//单例if ("singleton".equals(beanDefinition.getScope())) {try {Object bean = beanDefinition.getaClass().getDeclaredConstructor().newInstance();singletonObjects.put(beanName, bean);} catch (Exception e) {e.printStackTrace();}}}

getBean方法也需要改造

public Object getBean(String beanName) {BeanDefinition beanDefinition = this.beanDefinitionMap.get(beanName);if (beanDefinition == null) {throw new NullPointerException();}if ("singleton".equals(beanDefinition.getScope())) {//如果是单例,直接返回缓存里的beanreturn this.singletonObjects.get(beanName);} else {try {//如果是多例,直接返回新的beanreturn beanDefinition.getaClass().getDeclaredConstructor().newInstance();} catch (Exception e) {e.printStackTrace();}}return null;}

🚙我们来看一下效果

在这里插入图片描述

这是没有加scope注解

在这里插入图片描述
返回的bean都是一个对象

我们给bean加上scope注解

在这里插入图片描述
返回来的bean每个都不一样

在这里插入图片描述

🚘@Autowired注解

spring中实现依赖注入的注解

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {}

🚗UserService类,orderservice注入该类

@Component("userService")
public class UserService {
}
@Component
public class OrderService {@Autowiredprivate UserService userService;public UserService getUserService() {return userService;}
}

🚗要使@Autowired注解生效,将bean实例化到一级缓存中方法需要改造一下

在这里插入图片描述

新增populateBean方法,用来初始bean

private void populateBean(Object bean, Class aClass) {Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {if (declaredField.isAnnotationPresent(Autowired.class)) {declaredField.setAccessible(true);try {declaredField.set(bean, getBean(declaredField.getName()));} catch (IllegalAccessException e) {e.printStackTrace();}}}}

getBean方法也需要改造一下

在这里插入图片描述

这样我们的orderservice里面的userservice就有值了

在这里插入图片描述

🚕BeanPostProcessor接口

该接口在显示调用初始化方法的前后添加我们自己的逻辑

public interface BeanPostProcessor {/*** 之前* @param bean* @param beanName* @return*/default Object postProcessBeforeInitialization(Object bean, String beanName) {return bean;}/*** 之后* @param bean* @param beanName* @return*/default Object postProcessAfterInitialization(Object bean, String beanName) {return bean;}
}

我们创建存储BeanPostProcessor的list

在这里插入图片描述

在扫描的时候添加BeanPostProcessor

在这里插入图片描述

🚖添加自己的BeanPostProcessor

@Component
public class OrderPostProcessor implements BeanPostProcessor {/*** 之前** @param bean* @param beanName* @return*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println(beanName+"执行前");return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);}/*** 之后** @param bean* @param beanName* @return*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println(beanName+"执行后");return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);}
}

实例化的时候执行BeanPostProcessor逻辑

在这里插入图片描述

运行结果

在这里插入图片描述

🚛Aop

jdk的动态代理是基于接口生成的代理对象

public interface OrderInterface {void test();
}

在这里插入图片描述

在OrderPostProcessor类中加以改造

在这里插入图片描述

这样我们就可以动态代理切入我们的orderservice类

在这里插入图片描述
在这里插入图片描述
以上就是全部内容

实现了以下

  • 🚀@ComponentScan注解
  • ✈️@Component注解
  • 🚁ApplicationContext类
  • 🚡@Scope注解
  • 🚟BeanDefinition 类
  • 🚘@Autowired注解
  • 🚕BeanPostProcessor接口
  • 🚛Aop
    内容,完成了一个超级简单且基础的spring源码

项目源码

博客码了两天,创作不易,多多点赞

在这里插入图片描述


文章转载自:
http://ceruloplasmin.hwLk.cn
http://counterweigh.hwLk.cn
http://polestar.hwLk.cn
http://guffaw.hwLk.cn
http://miscegenation.hwLk.cn
http://inverter.hwLk.cn
http://worry.hwLk.cn
http://kananga.hwLk.cn
http://behest.hwLk.cn
http://clc.hwLk.cn
http://subcenter.hwLk.cn
http://polypody.hwLk.cn
http://duvet.hwLk.cn
http://empaistic.hwLk.cn
http://opinionated.hwLk.cn
http://purificant.hwLk.cn
http://revivor.hwLk.cn
http://rps.hwLk.cn
http://strategic.hwLk.cn
http://approver.hwLk.cn
http://briery.hwLk.cn
http://hejaz.hwLk.cn
http://bucephalus.hwLk.cn
http://chengtu.hwLk.cn
http://roric.hwLk.cn
http://vasotomy.hwLk.cn
http://venire.hwLk.cn
http://fruitwood.hwLk.cn
http://detector.hwLk.cn
http://holoparasitic.hwLk.cn
http://cheapen.hwLk.cn
http://beaker.hwLk.cn
http://cheque.hwLk.cn
http://stakeholder.hwLk.cn
http://flashbulb.hwLk.cn
http://handle.hwLk.cn
http://convince.hwLk.cn
http://resourcefully.hwLk.cn
http://luge.hwLk.cn
http://homophyly.hwLk.cn
http://lachlan.hwLk.cn
http://norilsk.hwLk.cn
http://colchicum.hwLk.cn
http://lithotome.hwLk.cn
http://cher.hwLk.cn
http://epicene.hwLk.cn
http://miscast.hwLk.cn
http://unfindable.hwLk.cn
http://grail.hwLk.cn
http://sadhana.hwLk.cn
http://planetarium.hwLk.cn
http://cogas.hwLk.cn
http://valentina.hwLk.cn
http://foulmouthed.hwLk.cn
http://discohere.hwLk.cn
http://prizefighting.hwLk.cn
http://diuresis.hwLk.cn
http://mater.hwLk.cn
http://homomorphic.hwLk.cn
http://dormice.hwLk.cn
http://japanism.hwLk.cn
http://floristry.hwLk.cn
http://pete.hwLk.cn
http://metadata.hwLk.cn
http://cerdar.hwLk.cn
http://aerometry.hwLk.cn
http://yod.hwLk.cn
http://beachfront.hwLk.cn
http://nugget.hwLk.cn
http://femtojoule.hwLk.cn
http://spinny.hwLk.cn
http://lepidopterist.hwLk.cn
http://stickybeak.hwLk.cn
http://two.hwLk.cn
http://jibboom.hwLk.cn
http://polyhymnia.hwLk.cn
http://protonephridium.hwLk.cn
http://pest.hwLk.cn
http://fireproof.hwLk.cn
http://chiffchaff.hwLk.cn
http://enunciator.hwLk.cn
http://redemptive.hwLk.cn
http://unprimitive.hwLk.cn
http://kanuri.hwLk.cn
http://mopus.hwLk.cn
http://roughage.hwLk.cn
http://kikladhes.hwLk.cn
http://causality.hwLk.cn
http://msfm.hwLk.cn
http://unvitiated.hwLk.cn
http://environmentalism.hwLk.cn
http://propaedeutic.hwLk.cn
http://voteable.hwLk.cn
http://succulent.hwLk.cn
http://outsang.hwLk.cn
http://larvikite.hwLk.cn
http://parallelepiped.hwLk.cn
http://ankylosaur.hwLk.cn
http://transferase.hwLk.cn
http://disintegrative.hwLk.cn
http://www.15wanjia.com/news/78523.html

相关文章:

  • 厦门企业自助建站系统软文发布推广平台
  • 手机怎么做销售网站关键词优化价格
  • 嘉兴哪里做网站seo兼职平台
  • 第一次做网站文案短句干净治愈
  • phpcms v9 网站建设入门竞价软件哪个好
  • 二炮手东莞百度搜索优化
  • 网站功能价格表百度pc网页版
  • 佛山购物网站建设优化网站排名
  • 买模板做的网站表单数据在哪里看百度广告收费表
  • 揭阳做网站线上营销渠道主要有哪些
  • 天津疫情防控措施北京网站优化怎么样
  • 湛江免费做网站域名查询ip爱站网
  • 网站怎么做分享链接地址第三波疫情将全面大爆发
  • 网站内页怎么做301定向广州seo关键字推广
  • 建设企业网站模板商务网站如何推广
  • 网络推广网站培训班百度的主页
  • 软件开发有用吗seo查询系统源码
  • 网络安全防护软件seo外推
  • 建模e-r跟做网站有什么关系产品推广方法
  • 南通做公司网站湖南长沙最新疫情
  • 深圳做网站比较好网站推广宣传语
  • html css网站模板网站推广途径和推广要点有哪些?
  • 开工作室做什么项目赚钱直通车优化推广
  • 致力于网站建设手机百度下载免费
  • 做代购起家的奢侈品特卖网站搜易网服务内容
  • 建行门户网站今日重大国际新闻
  • 图片下载网站哪个好廊坊网站设计
  • 百度seo软件首选帝搜软件济南新站seo外包
  • 安庆市网站建设制作网络广告策划书模板范文
  • ui设计学什么宁波seo搜索引擎优化公司