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

深圳网站建设 宝华大厦做网站东莞选哪家公司好

深圳网站建设 宝华大厦,做网站东莞选哪家公司好,小型企业建设网站,中移建设有限公司网站【README】 本文diy代码实现了 spring 依赖注入#xff0c;一定程度上揭示了依赖注入原理#xff1b; 【1】控制反转-Inversion of Control 是一种编码思想#xff0c;简而言之就是 应用程序A可以使用组件B#xff0c;但A无法控制B的生命周期#xff08;如创建#xff…【README】 本文diy代码实现了 spring 依赖注入一定程度上揭示了依赖注入原理 【1】控制反转-Inversion of Control 是一种编码思想简而言之就是 应用程序A可以使用组件B但A无法控制B的生命周期如创建内部属性赋值销毁若需等等而交由第三方控制如容器 这里的容器不仅仅是spring容器spring容器只是一种实现方式 还有其他容器如 PicoContainer参见文末引用资料这里的组件指的是 封装了属性和方法的java类实例如业务逻辑处理类实例dao层实例数据源日志发送器http客户端kafka客户端各种客户端等等很多 这样做的原因 是可以把 应用程序A 与 组件B 解耦1可以简化代码开发2提高代码复用3代码易于维护 补充控制反转反转的是 组件或javabean的创建存储与管理权到第三方容器by wikipedia  https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC 【早期控制反转例子】 spring容器出现前的IOC例子即 IOC 在spring之前就已经提出来了IOC并非是spring提出而是 spring使用了IOC的编程思想 关于命令行用户界面的主控权命令行用户界面交互的主控权由应用程序来控制应用程序可以设计一系列命令如linux上的zkkafka客户端命令等应用程序逐条输出信息和给出响应如 window命令行界面linux vim编辑器zk客户端kafka客户端等 而在图形用户界面环境下包括CSBSUI框架将负责执行一个主循环监听事件应用程序只需要提供处理函数即可代码适配浏览器无需关心界面交互方式界面IO事件等它也没法关心因为每个浏览器有自己特有的交互方式有少许差别这才会产生浏览器兼容性问题 这样的UI框架如浏览器。显然前端应用程序如htmljs无法控制界面响应只能适配而由底层UI框架来控制这时交互控制权发生了反转从应用程序转移到了UI框架 虽然应用程序无法控制界面响应但它可以使用UI组件渲染前端 小结可以理解 在IoC的编程思想下应用程序对使用的组件只有使用权没有所有权所有权由第三方容器或框架控制* 如何理解所有权 即 当应用程序消亡时其使用的组件并没有随它而消亡而是继续存在因为前者对后者没有所有权无法管理后者的生命周期 【1.1】实现控制反转主要有两种方式依赖注入和依赖查找。 1依赖注入DI被动接受属性对象赋值在类A实例a的创建过程中同时创建了类A依赖对象b仅创建对象没有赋值然后第三方容器通过类型或名称把 b 注入赋值给类A实例的属性这个过程叫做依赖注入 【代码1-依赖注入代码示例】 A a new A(); // 主类A实例 步骤1 B b new B(); // 依赖实例b 步骤2 a.setB(b); // 第三方容器注入bean或赋值给实例a的属性 步骤3 // 以上3步均由 第三方容器通过反射工厂来完成 这里反转的是 类A实例对依赖属性对象b的创建存储和管理权利或生命周期权而由第三方容器来管理因为按照传统编程方式类A依赖属性对象b那属性b就应该由类A来创建和赋值 2依赖查找主动索取对象主动索取相应类型的对象获得依赖对象的时间也可以在代码中自由控制。 【1.2】自动装配 Autowire 表示第三方容器通过类型或名称把创建的依赖对象 赋值给主类实例的属性对象的过程前提是属性对象被Autowire注解标识 【小结】 上文详细阐述了  IoC DI autowire 的概念这是spring核心概念应该是比较清楚了 IoC是一种编程模型讲的是 依赖对象不由 使用者创建交由 第三方容器来创建和管理DI是IoC思想的一种实现 讲的是  使用者实例依赖对象实例都由 第三方容器来创建实例创建完成后 容器通过类型或名称把依赖对象赋值给 使用者实例的属性对象以便建立依赖关系的过程autowire是DI过程的一部分讲的是   容器通过类型或名称把依赖对象赋值给 使用者实例的属性对象的过程【2】diy代码实现 spring  依赖注入 【2.1】自定义4个注解 // 标识 controller后的步骤 Documented Inherited Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface MyStep {public String value() default ; }// 标识 dao bean Documented Inherited Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface MyRepository {public String value() default ; }// 标识bean Documented Inherited Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) public interface MyBean {public String value() default ; }// 标识自动注入bean Documented Inherited Target({ElementType.FIELD, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MyAutowire {public String value() default ; } 【2.2】自定义容器 /*** Description bean工厂 * author xiao tang* version 1.0.0* createTime 2021年12月16日*/ public interface BeanFactory {T T getBean(ClassT clazz);T T getBean(String beanName); } /*** Description spring容器 * author xiao tang* version 1.0.0* createTime 2021年12月16日*/ public class SpringContext implements BeanFactory {/** 类路径根目录 */private static String appRoot D:\\workbench_idea\\study4vw\\vwstudy10\\target\\classes;private static SpringContextSupport springContextSupport new SpringContextSupport(appRoot);public static void insertBean(String key, Object value) {SpringContextSupport.container.put(key, value);}Overridepublic T T getBean(ClassT clazz) {return (T) SpringContextSupport.container.get(clazz.getName());}Overridepublic T T getBean(String beanName) {return (T) SpringContextSupport.container.get(beanName);} } /*** Description spring容器支持类扫描注解使用反射创建bean注入bean* author xiao tang* version 1.0.0* createTime 2021年12月19日*/ public class SpringContextSupport {/** clazz名称列表 */ListString allClazzNameList;/** 自定义注解映射 */MapString, Class defineAnnotationMap;/** bean clazz名称列表 */ListString beanClazzNameList;/** spring容器 */static ConcurrentMapString, Object container new ConcurrentHashMap();public SpringContextSupport(String appRootPath) {// 扫描所有文件的clazzthis.allClazzNameList scanAllFileClazz(appRootPath);// 扫描所有自定义注解this.defineAnnotationMap scanAnnotation(allClazzNameList);// 剔除注解类clazzthis.beanClazzNameList allClazzNameList.stream().filter(x-!defineAnnotationMap.containsKey(x)).collect(Collectors.toList());this.loadBean();}/*** description 加载bean* author xiao tang* date 2021/12/25*/private void loadBean() {// 扫描被注解修饰的类并添加到容器for (String x : beanClazzNameList) {try {Class beanClazz Class.forName(x);for (Class defineAnnoClazz : defineAnnotationMap.values()) {if (beanClazz.isAnnotationPresent(defineAnnoClazz)) { // bean是否被定义的注解修饰Annotation defineAnnoBean beanClazz.getAnnotation(defineAnnoClazz);try {// 获取注解的value方法值value方法值bean名称 可以认为这里约定注解的value()值为beanNameString beanName (String)defineAnnoBean.getClass().getDeclaredMethod(value).invoke(defineAnnoBean);// 若value方法值为空则取类名首字母小写beanName !BusiStringUtils.isBlank(beanName) ? beanName : BusiStringUtils.lowerFirstChar(beanClazz.getSimpleName());// 若bean在容器中存在直接breakif (container.containsKey(beanName)) break;// 实例化bean之前先扫描是否有属性bean若有被 MyAutowired修饰的属性则注入Object beanObj beanClazz.newInstance();// 装配bean属性this.autowireField(beanClazz, beanObj);// 注入beanSpringContext.insertBean(beanName, beanObj);SpringContext.insertBean(beanClazz.getName(), beanObj);break;} catch(Exception e) {e.printStackTrace();}}}} catch (Exception e) {throw new IllegalStateException(类 x 实例化失败, e);}}}/*** description 装配属性bean* param beanClazz bean class对象* author xiao tang* date 2021/12/25*/private void autowireField(Class beanClazz, Object beanObj) {for (Field field : beanClazz.getDeclaredFields()) {if (field.isAnnotationPresent(MyAutowire.class)) { // 若属性被 MyAutowire 修饰String beanNameOfMyAutowire field.getAnnotation(MyAutowire.class).value(); // 获取 MyAutowire的value方法值beanNameOfMyAutowire !BusiStringUtils.isBlank(beanNameOfMyAutowire) ? beanNameOfMyAutowire : field.getType().getName(); // 获取autowire的value方法值// 装配beantry {// 若容器不存在该bean则创建并放入容器if (!container.containsKey(beanNameOfMyAutowire)) {Object beanObjOfAutowire field.getType().newInstance();// 注入属性beanSpringContext.insertBean(beanNameOfMyAutowire, beanObjOfAutowire);SpringContext.insertBean(field.getClass().getName(), beanObjOfAutowire);}field.setAccessible(true); // 设置可以访问field.set(beanObj, container.get(beanNameOfMyAutowire)); // 注入bean} catch (Exception e) {}}}}/*** description 扫描所有注解* param clazzNameList 类名列表* return 注解集合* author xiao tang* date 2021/12/19*/public static MapString, Class scanAnnotation(ListString clazzNameList) {/** 自定义注解名称 */MapString, Class annotationMap new HashMap();for (String x : clazzNameList) {try {Class clazz Class.forName(x);if (Class.forName(x).isAnnotation()) { // 若为注解添加到缓存annotationMap.put(clazz.getName(), clazz);}} catch (ClassNotFoundException e) {}}return annotationMap;}/*** description 扫描所有文件* param appRoot 根目录* return 类名列表* author xiao tang* date 2021/12/17*/public static ListString scanAllFileClazz(String appRoot) {// class文件列表ListString clazzFileList new ArrayList();// 文件夹队列LinkedListFile dirList new LinkedList();dirList.add(new File(appRoot));// 遍历文件夹while (!dirList.isEmpty()) {File[] files dirList.removeFirst().listFiles();for (File tempFile : files) {// 文件夹if (tempFile.isDirectory()) {dirList.add(tempFile);} else if (tempFile.getName().endsWith(.class)) {// 非文件夹且以 .class 结尾添加到文件列表clazzFileList.add(prcFilePath(tempFile.getAbsolutePath()));}}}return clazzFileList;}/*** description 加工文件名获取全限定类名* param filePath 文件绝对路径* return 全限定类名* author xiao tang* date 2021/12/25*/public static String prcFilePath(String filePath) {String flag target\\classes\\;return filePath.substring(filePath.indexOf(flag)flag.length(), filePath.lastIndexOf(.class)).replace(\\, .);} } 【2.3】工具   /*** Description 字符串工具 * author xiao tang* version 1.0.0* createTime 2021年12月17日*/ public class BusiStringUtils {private BusiStringUtils(){}public static String lowerFirstChar(String raw) {raw.charAt(0);char[] charArr raw.toCharArray();charArr[0] 32;return new String(charArr);}/** * description 判断字符串是否为空* param * return * author xiao tang * date 2021/12/25 */public static boolean isBlank(String raw) {if (raw null) return true;for (int i 0; i raw.length(); i) {if (!Character.isWhitespace(raw.charAt(i))) return false;}return true; } } 【2.4】 使用以上自定义容器 【2.4.1】自定义 step /*** Description 查询参数* author xiao tang* version 1.0.0* createTime 2021年12月25日*/ MyStep(VWPAMQRY) public class VWPAMQRY {MyAutowireParamDAO paramDAO;/*** description 业务逻辑 * param key 键* return 响应报文* author xiao tang * date 2021/12/19 */public String doBusi(String key) {// 其他逻辑 XXX// 调用dao层api查询参数值 return paramDAO.qryValueByKey(key);} }【2.4.2】dao 层 /*** Description dao层 * author xiao tang* version 1.0.0* createTime 2021年12月19日*/ MyRepository(diyParamDao) public class ParamDAO {private static MapString, String params new HashMap();static {params.put(k1, v1);params.put(k2, v2);}/*** description 根据key查询value* param key 键* return 值* author xiao tang* date 2021/12/19*/public String qryValueByKey(String key) {return params.get(key);} } 【3】main程序 拉起整个应用 /*** Description spring ioc 实现机制* author xiao tang* version 1.0.0* createTime 2021年12月16日*/ public class Topic16Main {public static void main(String[] args) {SpringContext springContext new SpringContext();// 通过clazz 获取ParamDAO paramDAO springContext.getBean(ParamDAO.class);String value paramDAO.qryValueByKey(k1);System.out.println(value); // v1// 通过 name 获取paramDAO springContext.getBean(diyParamDao);value paramDAO.qryValueByKey(k1);System.out.println(value); // v1// 从容器获取 stepVWPAMQRY vwpamqry springContext.getBean(VWPAMQRY.class);System.out.println(vwpamqry.doBusi(k1));// v1System.out.println(vwpamqry.doBusi(k2)); // v2} } 打印结果 v1 v1 v1 v2 【Reference】 IoC容器和Dependency Injection模式 - Thoughtworks洞见https://insights.thoughtworks.cn/injection/依赖注入和控制反转的理解写的太好了。_路在脚下-CSDN博客_依赖注入和控制反转的区别学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念对于初学Spring的人来说总觉得IoC 、DI这两个概念是模糊不清的是很难理解的今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。一、分享Iteye的开涛对Ioc的精彩讲解  首先要分享的是Iteye的开涛这位技术牛人https://blog.csdn.net/bestone0213/article/details/47424255
http://www.sadfv.cn/news/278497/

相关文章:

  • 电视台网站开发软件培训学校
  • 米特号类似网站品牌建设实施方案
  • 祥云县网站个旧网络推广
  • 网页新建站点免费的会员卡管理软件
  • 网站地图添加网络综合设计实验报告
  • 网站目录怎么做301跳转用asp制作一个简单的网站
  • 做个视频网站建设网站的目的和功能定位
  • 汕头建设网站关于做ppt的网站有哪些
  • 两学一做知识问答网站用户图片上传wordpress
  • 兰州新区小程序建站长沙发布致全体
  • 怎样给公司做一个网站电脑网页制作模板
  • 做装修公司网站视频制作公司排行
  • 返利网站怎么做上海设计公司 快消品
  • 网站建设对标行业分析开山云匠网
  • 住房和城乡建设部办公厅网站做外贸必看的网站和论坛有哪些
  • 做网站怎么跑业务温州本地网站
  • 温州制作网站wordpress淘宝客pid
  • 事业单位网站开发工作规程昆明网站seo
  • 网页设计与网站开发教程全网营销平台
  • 西安优秀的定制网站建设公司哪家好外网设计灵感网站
  • 南阳网站建设seo广州骏域网站
  • 为什么做网站要用谷歌浏览器购物分享网站怎么做盈利
  • 杭州网站建设网络公司网站设计培训学校有哪家
  • 网站建设 就业方向步骤怎么读
  • 微信清粉网站开发wordpress不能上传主题
  • 广州市城乡和建设局网站首页网站建设及宣传管理规定
  • 网站软件有哪些深圳外贸网站制作公司
  • 做网站和做公众号北京云邦网站建设
  • 如何做网站地图做网站常用图标
  • 网页给别人做的 网站后续收费网站建设的ppt