外贸公司网站素材/痘痘该如何去除效果好

外贸公司网站素材,痘痘该如何去除效果好,怎么做刷会员网站,太原市网站建设网站需求说明: 自己写一个简单的 Spring 容器, 通过读取类的注解(Component ControllerService Reponsitory) ,将对象注入到 IOC 容器,自己使用 IOAnnotaion反射集合 技术实现 思路分析: 一、新建一个包component并在包下创建bean类 …

需求说明:

        自己写一个简单的 Spring 容器, 通过读取类的注解(@Component @Controller@Service @Reponsitory) ,将对象注入到 IOC 容器,自己使用 IO+Annotaion+反射+集合 技术实现

思路分析:


一、新建一个包component并在包下创建bean类

环境配置:导入jar包

新建component包

这里将Servlet层,Service层等等的对象放入component包下,因为手写的Spring基于注解配置的程序是一个简化的程序,没有原生的Spring功能强大,这里就将各个对象放入一个包下面便于io读取

UserAction类:

package com.study.Spring.component;import org.springframework.stereotype.Controller;
//控制层Servlet
@Controller
public class UserAction {
}

UserComponent类: 

package com.study.Spring.component;import org.springframework.stereotype.Component;
//使用component注解可以将该类扫描放入ioc容器中
@Component
public class UserComponent {
}

UserDao类: 

package com.study.Spring.component;import org.springframework.stereotype.Repository;
//这是持久层、dao
@Repository
public class UserDao {
}

 UserService类:

package com.study.Spring.component;import org.springframework.stereotype.Service;
//这是Service层
@Service
public class UserService {
}

 


二、自定义注解(相当于原配置文件中的component-scan)

新建一个包用于存放自己手写的程序

创建一个自定义注解:ComponentScan

package com.study.Spring.mySpringByAnnotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 这个自定义的注解的作用相当于原配置文件中的component-scan* @Target(ElementType.TYPE)表示该注解作用的对象* @Retention(RetentionPolicy.RUNTIME)表示该注解的生命周期* String value() default "";表示注解的属性value用于存放包名(即:要扫描的包路径),默认是空字符串*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ComponentScan {String value() default "";
}

三、创建一个类代替beans.xml文件

创建一个类:MySpringConfig作用相当于beans.cml文件

package com.study.Spring.mySpringByAnnotation;/*** MySpringConfig这个类作用相当于beans.xml文件* "com.study.Spring.component"这个包名传给该注解的value属性*/
@ComponentScan("com.study.Spring.component")
public class MySpringConfig {
}

四、创建MySpringApplicationContext类作为容器对象

这个类相当于容器对象:扫描配置文件,初始化Bean,反射创建Bean,保存Bean都在这里执行

package com.study.Spring.mySpringByAnnotation;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.io.File;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;/*** 这个类相当于容器对象:扫描配置文件,初始化Bean,反射创建Bean,保存Bean都在这里执行*/
public class MySpringApplicationContext {//容器的属性:MySpringConfig是配置类的Class对象,用于反射创建注解读取类名//ioc属性相当于原生的SingleTonObjects用于存储单例bean对象private Class MySpringConfig;private final ConcurrentHashMap<String,Object> ioc =new ConcurrentHashMap<>();public MySpringApplicationContext(Class mySpringConfig){this.MySpringConfig=mySpringConfig;//反射获取自定义的注解对象,再获取注解中的包名ComponentScan componentScan =(ComponentScan) MySpringConfig.getDeclaredAnnotation(ComponentScan.class);String path = componentScan.value();path= path.replace(".", "/");//根据包名获取实际工作目录的路径,再通过io流获取扫描的类的绝对路径
//file:/C:/Users/DELL/IdeaProjects/Spring/out/production/Spring/com/study/Spring/component//这里拿到类加载器用于获取实际工作目录ClassLoader classLoader = MySpringConfig.getClassLoader();URL realPath = classLoader.getResource(path);
//     /C:/Users/DELL/IdeaProjects/Spring/out/production/Spring/com/study/Spring/componentString filePath = realPath.getFile();File file = new File(filePath);//通过目录获取目录下的所有Class文件if (file.isDirectory()){File[] files = file.listFiles();for (File item : files) {String name = item.getName();if (name.contains(".class")){//通过字符串的拼接获取包下面的全类名path = path.replace("/", ".");String className = name.substring(0, name.indexOf("."));//获取全类名String fullPath=path+"."+className;
//   再根据Class文件进行一次筛选:判断是否有四种注解的类才进行创建实例对象并存储在容器中try {//通过classloader获取的Class对象时轻量级的,不会初始化时调用静态方法Class<?> aClass = classLoader.loadClass(fullPath);//根据不同类的Class对象判断是否有指定的注解if (aClass.isAnnotationPresent(Component.class)||aClass.isAnnotationPresent(Controller.class)||aClass.isAnnotationPresent(Service.class)||aClass.isAnnotationPresent(Repository.class)){//如果存在指定的注解那么就通过反射创建Class对象并创建实例对象Class<?> aClass1 = Class.forName(fullPath);//反射创建实例对象作为valueObject instance = aClass1.newInstance();//默认将首字母是小写的类名作为keyclassName = StringUtils.uncapitalize(className);//将bean保存到容器中ioc.put(className,instance);}} catch (Exception e) {throw new RuntimeException(e);}}}}}public Object getBean(String id){return ioc.get(id);}
}

解释:

        获取配置文件类MySpringConfig的Class对象,就可以用反射创建annotation注解对象,用注解对象获取包名,有了包名后可以调用ClassLoader的方法得到实际工作目录,再根据io流的方法+字符串的拼接得到包下面的各个类的全类名,再通过反射得到各个类的Class对象,再进一步筛选,通过反射Class对象调用isAnnotationPresent方法判断是否存在指定的注解来选择性初始化对象,最后将对象存储在concurrentHashmap中,在MySpringApplicationContext类中添加getBean方法获取bean对象


五、编写测试类MySpringApplicationContextTest

package com.study.Spring.mySpringByAnnotation;public class MySpringApplicationContextTest {public static void main(String[] args) {MySpringApplicationContext ioc = new MySpringApplicationContext(MySpringConfig.class);Object userAction = ioc.getBean("userAction");Object userComponent = ioc.getBean("userComponent");Object userDao = ioc.getBean("userDao");Object userService = ioc.getBean("userService");System.out.println(userAction);System.out.println(userComponent);System.out.println(userDao);System.out.println(userService);}
}

运行结果: 

通过调试也可以看出已经初始化了四个bean对象 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用selenium来获取数据集

使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…

(二)VMware:VMware虚拟机安装CentOS教程

目录 1、准备CentOS 7镜像1.1、官网镜像下载1.2、清华大学开源镜像下载​1.3、阿里云开源镜像下载 2、使用 VMware安装CentOS 72.1、创建虚拟机2.2、选择自定义安装2.3、硬件兼容性&#xff0c;保持默认2.4、选择下载的ISO镜像2.5、设置虚拟机名称以及存放磁盘位置2.6、按照需求…

【Agent】Dify Docker 安装问题 INTERNAL SERVER ERROR

总结&#xff1a;建议大家选择稳定版本的分支&#xff0c;直接拉取 master 分支&#xff0c;可能出现一下后面更新代码导致缺失一些环境内容。 启动报错 一直停留在 INSTALL 界面 我是通过 Docker 进行安装的&#xff0c;由于项目开发者不严谨导致&#xff0c;遇到一个奇怪的…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…

flutter 开发web端的性能优化

参考资料 Flutter for Web 首次首屏优化 ——JS 分片优化_main.dart.js-CSDN博客文章浏览阅读1.4k次。本文介绍了如何通过延迟加载组件和js分片优化Flutter for Web应用的加载速度。在实践中&#xff0c;通过按需加载减少js文件大小&#xff0c;使用并行加载提升加载效率。通过…

Java定时任务的三重境界:从单机心跳到分布式协调

《Java定时任务的三重境界&#xff1a;从单机心跳到分布式协调》 本文将以生产级代码标准&#xff0c;揭秘Java定时任务从基础API到分布式调度的6种实现范式&#xff0c;深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异&#xff0c;并给出各方案的性能压…

QT QML实现音频波形图进度条,可点击定位或拖动进度

前言 本项目实现了使用QT QML创建一个音频波形图进度条的功能。用户可以在界面上看到音频波形图&#xff0c;并且可以点击进度条上的位置进行定位&#xff0c;也可以拖动进度条来调整播放进度。可以让用户更方便地控制音频的播放进度&#xff0c;并且通过音频波形图可以直观地…

高速网络包处理,基础网络协议上内核态直接处理数据包,XDP技术的原理

文章目录 预备知识TCP/IP 网络模型&#xff08;4层、7层&#xff09;iptables/netfilterlinux网络为什么慢 DPDKXDPBFPeBPFXDPXDP 程序典型执行流通过网络协议栈的入包XDP 组成 使用 GO 编写 XDP 程序明确流程选择eBPF库编写eBPF代码编写Go代码动态更新黑名单 预备知识 TCP/IP…

[每周一更]-(第137期):Go + Gin 实战:Docker Compose + Apache 反向代理全流程

文章目录 **1. Go 代码示例&#xff08;main.go&#xff09;****2. Dockerfile 多段构建**3.构建 Docker 镜像**4. docker-compose.yml 直接拉取镜像****5. 运行容器****6. 测试 API**7、配置域名访问**DNS解析&#xff1a;将域名转换为IP地址****DNS寻址示例** 8.错误记录 访问…

Qt之MVC架构MVD

什么是MVC架构&#xff1a; MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controll…

(C语言)理解 回调函数 和 qsort函数

一. 回调函数 1. 什么是回调函数&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是通过 函数指针 调用的函数。其本质是&#xff1a; 将函数作为参数传递给另一个函数&#xff0c;并在特定条件下被调用&#xff0c;实现 反向控制。 2. 回调函数的使用 回调函…

vscode记录

vs code 下载安装&#xff0c;git 配置&#xff0c;插件安装_vscode安装git插件-CSDN博客 手把手教你在VS Code中使用 Git_vscode如何输入git命令-CSDN博客 VS Code | 如何快速重启VS Code&#xff1f;_vscode 怎么一键全部重启-CSDN博客 1&#xff0c;安装插件与git集成 2&am…

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

SpringSecurity——前后端分离登录认证

SpringSecurity——前后端分离登录认证的整个过程 前端&#xff1a; 使用Axios向后端发送请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><script src"https://cdn…

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…

Mysql架构理论部分

Mysql架构是什么&#xff1f;实际可以理解为执行一条sql语句所要经历的阶段有哪些&#xff01; 1.连接层 &#xff08;1&#xff09;客户端发起连接 客户端通过TCP/IP、Unix Socket或命名管道等方式向Mysql服务器发起链接请求 想要了解tcp与udp的区别&#xff0c;可以参考这…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用

目录 ​编辑 一、RAID概述 1.1 磁盘阵列简介 1.2 功能 二、RAID级别 2.1 RAID 0&#xff08;不含校验与冗余的条带存储&#xff09; 2.2 RAID1&#xff08;不含校验的镜像存储&#xff09; 2.3 RAID 5 &#xff08;数据块级别的分布式校验条带存储&#xff09; 4、RAI…

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上&#xff0c;MySQL 8.0默认使用auth_socket插件进行身份验证&#xff0c;可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时&#xff0c;不需要输入密码或错误密码都可以正常登入mysql数据库&…