框架 订阅
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。框架这个广泛的定义使用的十分流行,尤其在软件概念。框架也能用于机械结构。 展开全文
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。框架这个广泛的定义使用的十分流行,尤其在软件概念。框架也能用于机械结构。
信息
注    音
ㄎㄨㄤˋ ㄐㄧㄚˋ
拼    音
kuàng jià
英    译
Framework
释    义
联结而成的结构
中文名
框架
应用领域
软件、机械结构等
框架释义
1、释义:(1)建筑工程中,由梁、柱等联结而成的结构;(2)比喻事物的组织、结构。2、土木工程中,由梁、柱等构件刚性连结而成的结构体系。3、比喻事物的组织、结构:这部长篇小说已经有了一个大致的框架。
收起全文
精华内容
参与话题
问答
  • 初识Spring Boot框架

    万次阅读 多人点赞 2016-12-19 20:42:04
    前面的铺垫文章已经连着写了六篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过“约定大于配置”...

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

    前面的铺垫文章已经连着写了六篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置,可是使用Spring或者SpringMVC的话依然有许多这样的东西需要我们进行配置,这样不仅徒增工作量而且在跨平台部署时容易出问题。OK,由于这些已经存在的问题,Spring Boot应运而生,使用Spring Boot可以让我们快速创建一个基于Spring的项目,而让这个Spring项目跑起来我们只需要很少的配置就可以了。Spring Boot主要有如下核心功能:

    1.独立运行的Spring项目

    Spring Boot可以以jar包的形式来运行,运行一个Spring Boot项目我们只需要通过java -jar xx.jar类运行。非常方便。

    2.内嵌Servlet容器

    Spring Boot可以内嵌Tomcat,这样我们无需以war包的形式部署项目。

    3.提供starter简化Maven配置

    使用Spring或者SpringMVC我们需要添加大量的依赖,而这些依赖很多都是固定的,这里Spring Boot 通过starter能够帮助我们简化Maven配置。

    4.自动配置Spring
    5.准生产的应用监控
    6.无代码生成和xml配置

    OK,关于SpringBoot更详细的优缺点小伙伴们也可以自行搜索,我这里不再罗列,我们还是来看看代码。
    #项目创建
    初次接触,我们先来看看如何创建一个Spring Boot项目,这里以IntelliJ IDEA为例,其他的IDE工具小伙伴们自行搜索创建方式:

    首先创建一个项目,创建时选择Spring Initializr,然后Next,如下图:

    这里写图片描述

    填写项目信息,如下图:

    这里写图片描述

    填写项目使用到的技术,上面的Spring Boot版本建议选择最新的稳定版,下面勾选上Web就可以了,如下图:

    这里写图片描述

    最后一步,填写工程名字点击finish:

    这里写图片描述
    OK,第一次创建时系统会去下载需要的依赖等,耗时稍长,以后每次都会很快创建好。
    OK,项目创建成功之后接下来我们来看看这个东西要怎么样去运行。首先我们看到在项目创建成功之后,在项目的根目录下会有一个artifactId+Application命名规则的入口类,如下图:
    这里写图片描述,就是这个Test19SpringBoot2Application类,这是我们整个项目的入口类,这个类有一个@SpringBootApplication注解,这是整个Spring Boot的核心注解,它的目的就是开启Spring Boot的自动配置。OK,那么我在这个类上再添加一个@RestController注解,使之变为一个Controller,然后里边提供一个地址转换方法,如下:

    @RestController
    @SpringBootApplication
    public class Test19SpringBoot2Application {
    
    	public static void main(String[] args) {
    		SpringApplication.run(Test19SpringBoot2Application.class, args);
    	}
    
    	@RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")
    	String index(){
    		return "Hello Spring Boot!";
    	}
    }
    

    然后点击项目启动按钮运行,在IntelliJ中就是这个按钮:
    这里写图片描述
    启动成功之后我们就可以直接在浏览器中访问了,如下:
    这里写图片描述
    OK,至此,我们一个简单的Spring Boot工程已经创建出来了,并且成功的从浏览器中访问到了,但是为什么它最终会跑起来呢?想必小伙伴们还有许多疑问,我们来分析下。
    #入口类和@SpringBootApplication注解

    上文说过,我们新建一个Project系统都会帮我们创建一个名为artifactId+Application的入口类,这个类中有一个main方法,这个main方法就是一个标准的Java应用程序的入口方法。而这里的@SpringBootApplication则是一个组合注解,我们可以看看它的源码:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    )}
    )
    public @interface SpringBootApplication {
    
    }
    

    我们可以看到它组合了@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan,我们在开发的过程中如果不使用@SpringBootApplication,则可以组合使用这三个注解。这三个注解中,@SpringBootConfiguration实际上就是我们前面几篇博客提到的@Configuration注解,表明这个类是一个配置类,@EnableAutoConfiguration则表示让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置,最后一个@ComponentScan的作用我也不赘述了,唯一要注意的是如果我们使用了@SpringBootApplication注解的话,系统会去入口类的同级包以及下级包中去扫描实体类,因此我们建议入口类的位置在groupId+arctifactID组合的包名下。

    #关闭特定的自动配置
    在上面一小节中我们看到@ComponentScan注解是有一个过滤器的,如果我们只想要@SpringBootApplication去扫描特定的类而不是全部类,那么就可以关闭自动配置,如下:

    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
    

    #定制Banner
    ##修改Banner
    我们在启动Spring Boot项目的时候,在控制台会默认输出一个启动图案,如下:
    这里写图片描述
    当然,这个图案如果你需要的话是可以自己修改的,修改方式很简单:

    1.在src/main/resources下新建一个banner.txt文档
    2.通过http://patorjk.com/software/taag网站生成需要的字符,将字符拷贝到步骤1所创建的txt文档中,比如我这里为Hello Sang!生成字符,如下:

    这里写图片描述
    点击左下角的选择和拷贝按钮,将这个字符拷贝到txt文档中,然后再启动项目,这个时候控制台输出的文本就会自动改变,如下:
    这里写图片描述
    ##关闭Banner
    可以修改当然也可以关闭,关闭Banner需要我们稍微修改一下main方法中的代码,如下:

    public static void main(String[] args) {
    		SpringApplicationBuilder builder = new SpringApplicationBuilder(Test19SpringBoot2Application.class);
    		//修改Banner的模式为OFF
    		builder.bannerMode(Banner.Mode.OFF).run(args);
    	}
    

    OK,如此修改之后当我们再次启动Project的时候就看不到Banner了。

    #Spring Boot的配置文件
    Spring Boot使用一个全局的配置文件application.properties或者application.yml,配置文件放在src/main/resources目录下。properties是我们常见的一种配置文件,Spring Boot不仅支持properties这种类型的配置文件,也支持yaml语言的配置文件,我这里以properties类型的配置文件为例来看几个案例。

    1.修改Tomcat默认端口和默认访问路径

    Tomcat默认端口是8080,我将之改为8081,默认访问路径是http://localhost:8080,我将之改为http://localhost:8081/helloboot,我们来看看这两个需求要怎么样通过简单的配置来实现。
    很简单,在application.properties文件中添加如下代码:

    server.context-path=/helloboot
    server.port=8081
    

    然后再启动Project,在浏览器中就得这样来访问了:
    这里写图片描述

    常规属性配置

    在前面的博客( Spring常用配置 )中我们介绍了如何在使用Spring容器框架下注入properties文件里的值。如果我们使用了Spring Boot,这项工作将会变得更加简单,我们只需要在application.properties中定义属性,然后在代码中直接使用@Value注入即可。
    如下:

    book.author=罗贯中
    book.name=三国演义
    book.pinyin=sanguoyanyi
    

    我这里专门设置了中文,因为中文不做特殊处理会乱码,处理方式为继续在application.properties中添加如下代码:

    server.tomcat.uri-encoding=UTF-8
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.enabled=true
    spring.http.encoding.force=true
    spring.messages.encoding=UTF-8
    

    然后 在IntelliJ IDEA中依次点击File -> Settings -> Editor -> File Encodings
    将Properties Files (*.properties)下的Default encoding for properties files设置为UTF-8,将Transparent native-to-ascii conversion前的勾选上。(参考【Springboot 之 解决IDEA读取properties配置文件的中文乱码问题】【Springboot 之 解决IDEA读取properties配置文件的中文乱码问题】)。
    然后在变量中通过@Value直接注入就行了,如下:

    	@Value(value = "${book.author}")
    	private String bookAuthor;
    	@Value("${book.name}")
    	private String bookName;
    	@Value("${book.pinyin}")
    	private String bookPinYin;
    

    修改index方法,使之返回这些值:

    @RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")
    	String index(){
    		return "Hello Spring Boot! The BookName is "+bookName+";and Book Author is "+bookAuthor+";and Book PinYin is "+bookPinYin;
    	}
    

    然后在浏览器中访问,结果如下:
    这里写图片描述

    很简单吧。

    类型安全的配置

    刚刚说的这种方式我们在实际项目中使用的时候工作量略大,因为每个项目要注入的变量的值太多了,这种时候我们可以使用基于类型安全的配置方式,就是将properties属性和一个Bean关联在一起,这样使用起来会更加方便。我么来看看这种方式怎么实现。

    1.在src/main/resources文件夹下创建文件book.properties

    文件内容如下:

    book.name=红楼梦
    book.author=曹雪芹
    book.price=28
    

    2.创建Book Bean,并注入properties文件中的值

    代码如下:

    @Component
    @ConfigurationProperties(prefix = "book",locations = "classpath:book.properties")
    public class BookBean {
        private String name;
        private String author;
        private String price;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getPrice() {
            return price;
        }
    
        public void setPrice(String price) {
            this.price = price;
        }
    }
    

    prefix是指前缀,location指定要注入文件的位置。

    3.添加路径映射

    在Controller中添加如下代码注入Bean:

    @Autowired
    	private BookBean bookBean;
    

    添加路径映射:

    @RequestMapping("/book")
    	public String book() {
    		return "Hello Spring Boot! The BookName is "+bookBean.getName()+";and Book Author is "+bookBean.getAuthor()+";and Book price is "+bookBean.getPrice();
    	}
    

    运行效果如下:

    #日志配置
    默认情况下Spring Boot使用Logback作为日志框架,也就是我们前面几篇博客中用到的打印日志方式,当然如果有需要我们可以手动配置日志级别以及日志输出位置,相比于我们在Spring容器中写的日志输出代码,这里的配置简直就是小儿科了,只需要在application.properties中添加如下代码:

    logging.file=/home/sang/workspace/log.log
    logging.level.org.springframework.web=debug
    

    上面表示配置日志输出位置,下面配置日志级别。

    #Profile配置问题
    Spring常用配置 这篇文章中,我们已经介绍了Profile的作用,已经如何在Spring框架下使用Profile,但是当时小伙伴们看到了还是稍微有点麻烦,在Spring Boot 中系统提供了更为简洁的方式。全局Profile配置我们使用application-{profile}.properties来定义,然后在application.properties中通过spring.profiles.active来指定使用哪个Profile。OK,那么接下来我们来看一个简单的案例。

    1.在src/main/resources文件夹下定义不同环境下的Profile配置文件,文件名分别为application-prod.properties和application-dev.properties,这两个前者表示生产环境下的配置,后者表示开发环境下的配置,如下:

    这里写图片描述

    application-prod.properties:

    server.port=8081
    

    application-dev.properties:

    server.port=8080
    

    然后在application.properties中进行简单配置,如下:

    spring.profiles.active=dev
    

    这个表示使用开发环境下的配置。然后运行项目,我们得通过8080端口才可以访问:
    这里写图片描述
    如果想换为生产环境,只需要把spring.profiles.active=dev改为spring.profiles.active=prod即可,当然访问端口这是也变为8081了,如下:
    这里写图片描述

    本案例下载地址:
    本项目GitHub地址

    以上。

    参考资料:
    《JavaEE开发的颠覆者 Spring Boot实战》第五章、第六章

    展开全文
  • SSH2框架搭建实例源码

    万次下载 热门讨论 2013-04-25 09:53:29
    SSH2框架搭建实例(spring3.2+strust2.3.4+hibernate4.2)全部采用最新版本.演示了用户登录和用户管理
  • Qt图形视图框架详解

    千人学习 2016-12-07 16:50:42
    Qt图形视图框架详解视频教程,介绍Qt中的Graphics View Framework,涉及View、Scene、Item的关系,如何自定义QGraphicsItem、处理Item之间的关联、如何布局及定义自己的布局Item、如何变幻Item、如何应用动画、如何...
  • 框架

    2020-07-02 15:58:06
    为什么我用了框架,却感觉不到框架的用处
  • if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }

    1. 环路执行对象模型、碎片化执行模型(假递归式调用)

    这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频频出现这样的模型,这些模型帮助我理解LINQ的设计原理。其实在最早接触环路模型和碎片化模型是在前两个月,那个时候有幸接触企业应用架构方面的知识,里面就有很多业务碎片化的设计技巧。其实理解这些所谓的设计模型后将大大开阔我们的眼界,毕竟研究框架是要研究它的设计原理,它的存在必然是为了解决某一类问题,问题驱动它的设计模型。所以我们在研究这样的模型的时候其实已经在不知不觉的理解问题的本质。

    到底环路执行模型是什么?它与碎片化之间是什么关系?假递归式调用又是什么奥秘?这些种种问题我们必须都要把它解决了才能畅通无阻的去研究下面的东西。其实环路执行、碎片化、假递归式都是问题的不同角度的称呼,就好比我们经常会用依赖倒置、控制反转、依赖注入这些词汇去形容设计原则、设计方法一样,他们都是为了解决某种问题而存在,通过巧妙的设计来达到很完美的效果。这里其实也是如此,我们来一一的分解说明。

    想必没有人不了解递归的原理,对递归的使用也是很常见的,通过递归算法我们可以解决一下无法解决的大问题,通过将大问题分解成多个同样数据结构的小问题然后让计算机重复的去计算就行了。最为常见的就是遍历树形结构的对象,如:XML,它的每个节点都是一样的对象,所以递归调用的方法也是同一个方法,只不过不断的调用将产生多个调用栈,最后在按照调用顺序的反向出栈就得出一个完整的数据结构。

    那么在LINQ中来说,我们无法通过一个方法多次调用来产生我们想要的表达式树,一个Where查询表达式扩展方法可能不仅仅是被LINQ查询表达式所使用,还有可能被ORM的入口方法所使用,比如Update更新的时候就需要Where给出更新的条件,Delete也同样如此。(当然我们这里讨论是LINQ背后的设计原理不单单针对LINQ的技术,而是某一类问题的通用设计模式。)那么我们如何构造出一个类似递归但不是递归的算法结构,方法1可能被方法2调用,方法2也可能被方法1所调用,这样的方法很多,N个方法分别表达不同的语义,具体的构造看使用者的需求,所以这里就出现碎片化的概念了,只有碎片化后才能最大程度的重组,既然能重组了就形成了环路的执行模型。非常完美,看似简单却深不见底的模型我们只了解到冰山一角而已,在企业架构、领域驱动设计方向都已经有着很多成功的案例,要不然也不会被称为设计模式了更为强大的称呼是企业应用架构模式才对。用文字的方式讲解计算机程序问题似乎有点吃力,用代码+图形分析的方式来讲解最适合我们程序员的思维习惯了。下面我用一个简单的例子再附上一些简单的图示来跟大家分享一下这几个模式语言的关系。

    大家肯定都知道每逢过年过节都会有很多礼品摆放在超市里商场里买,但是我们都知道一个潜规则,就是这些商品的包装花费了很多功夫,一层套一层,其实里面的东西可能很不起眼,这也是一种营销手段吧。我们暂且不管这里面是什么东西,我们现在要设计一个能够任意进行N层次包装的模型出来,一件商品左一层右一层的反复包装,包装几次我们不管,我们提供能进行N层包装的方法出来就行了。

    /// <summary> 
       /// 商品抽象类 
       /// </summary> 
       public abstract class Merchandise 
       { 
           /// <summary> 
           /// 商品名 
           /// </summary> 
           public string MerchandiseName { get; protected set; } 
           /// <summary> 
           /// 单价 
           /// </summary> 
           public int UnitPrice { get; protected set; } 
           /// <summary> 
           /// 数量 
           /// </summary> 
           public int Number { get; protected set; } 
    
       } 
       /// <summary> 
       /// 苹果 
       /// </summary> 
       public class Apple : Merchandise 
       { 
           public Apple() { } 
           private void Init() 
           { 
               base.MerchandiseName = "进口泰国苹果"; 
               base.UnitPrice = 8;//8块钱一个 
               base.Number = 3;//3个一篮装 
           } 
       } 
       /// <summary> 
       /// 香蕉 
       /// </summary> 
       public class Banana : Merchandise 
       { 
           public Banana() { } 
           private void Init() 
           { 
               base.MerchandiseName = "云南绿色香蕉"; 
               base.UnitPrice = 3;//3块钱一根 
               base.Number = 10;//10根一篮装 
           } 
       } 
    
       /// <summary> 
       /// 商品包装类 
       /// </summary> 
       public static class MerchandisePack 
       { 
           /// <summary> 
           /// 贴一个商标 
           /// </summary> 
           public static Merchandise PackLogo(this Merchandise mer) 
           { 
               return mer; 
           } 
           /// <summary> 
           /// 包装一个红色的盒子 
           /// </summary> 
           public static Merchandise PackRedBox(this Merchandise mer) 
           { 
               return mer; 
           } 
           /// <summary> 
           /// 包装一个蓝色的盒子 
           /// </summary> 
           public static Merchandise PackBlueBox(this Merchandise mer) 
           { 
               return mer; 
           }
    

    这么简单的代码我就不一一解释了,这里只是为了演示而用没有添加没用的代码,免得耽误大家时间。

    我们看关键部分的代码:

    Apple apple = new Apple(); 
               apple.PackLogo().PackBlueBox().PackRedBox().PackLogo(); 
    
               Banana banana = new Banana(); 
               banana.PackRedBox().PackBlueBox().PackLogo();
    

    这段代码我想完全可以说服我们,碎片化后体现出来的扩展性是多么的灵活。apple在一开始的时候都是需要在上面贴一个小logo的,我们吃苹果的都知道的。由于现在是特殊节日,我们为了给接收礼品的人一点小小的Surprise,所以商家要求商品都统一的套了几层包装,有了这个模型确实方便了很多。

    完全实现了独立扩展的能力,不会将包装的方法牵扯到领域对象中去,很干净明了。
    在这里插入图片描述
    通过这种架构模式进行系统开发后,我们一目了然的就知道系统的每一个逻辑的过程,更像一种工作流的执行方式,先是什么然后是什么。不像在IF ELSE里面充斥乱七八糟的逻辑,很难维护。不愧为企业应用架构模式的一种啊。当然LINQ中只有Linq to Object才会出现重复的使用一到两个方法来完成功能,像Linq to Entity 几乎不会出现这种情况。一般针对查询的化只是关键字存在于不同的查询上下文中,这里是为了讲解它的背后设计原理。

    2.N层对象执行模型(纵横向对比链式扩展方法)

    其实本来不打算加这一小节的,但是考虑到肯定有部分朋友不是很理解多个对象如何协调的去解决某类问题的。IQueryable接口貌似是一个对象,但是它们都属于一个完整的IQueryable中的一员。N层对象体现在哪里?从一开始的IQueryable被扩展方法所处理就已经开始第一层的对象处理,重复性的环路假递归似的调用就形成N层对象模型。在LINQ中的查询表达式与查询方法其实是一一对应的,扩展方法是纵向的概念,而LINQ查询表达式是横向的,其实两者属于对应关系。详情可以参见本人的“NET深入解析LINQ框架(第四篇)”一文;

    3.LINQ查询表达式和链式查询方法其实都是空壳子

    LINQ的真正意图是在方便我们构建表达式树(ExpressionTree),手动构建过表达式树的朋友都会觉得很麻烦(对动态表达式有兴趣的可以参见本人的“.NET深入解析LINQ框架(第三篇)”一文),所以我们可以通过直接编写Lambda的方式调用扩展方法,由于LambdaExpression也是来自于Expression,而Expression又是来自LambdaExpression,别被这些搞晕,Expression其实是简化我们使用表达式的方式。对于Expression的编译方式是编辑器帮我们生成好的,在运行时我们只管获取ExpressionTree就行了。LINQ的查询表达式是通过扩展方法横向支撑的,你不用LINQ也一样可以直接使用各个扩展方法,但是那样会很麻烦,开发速度会很慢,最大的问题不在于此,而是没有统一的查询方式来查询所有的数据源。LINQ的本意和初衷是提供统一的方式来供我们查询所有的数据源,这点很重要。

    4详细的对象结构图(对象的执行原理)

    这篇文章的重点就在这一节了,上面说了那么多的话如果朋友能懂还好不懂的话还真是头疼。这一节我将给出LINQ的核心的执行图,我们将很清楚的看见LINQ的最终表达式树的对象结构,它是如何构建一棵完整的树形结构的,IQueryable接口是怎么和IQueryProvider接口配合的,为什么IQueryable具备延迟加载的能力。文章的最后将给出一个完整的Linq to Provider的小例子,喜欢扩展LINQ的朋友肯定会喜欢的。
    在这里插入图片描述
    上图看上去可能会很乱,但是静下心来看还是能理解的,按照DbQueryable生命周期来看,之上而下,如果有问题可以回复评论进一步探讨。

    5.IQueryable与IQueryProvider一对一的关系能否改成一对多的关系

    IQueryable对象都有一个配套的IQueryProvider对象,在频繁的创建IQueryable的时候都会重新创建IQueryProvider对象,毕竟是一种浪费。我们可以适当的修改实现IQueryable类的内部结构,让每次创建IQueryable之后能重用上一次的IQueryProvider的对象,毕竟IQueryProvider对象没有任何的中间状态的数据,只是CreateQuery、 Execute两个方法。这里只是本人的一点小小的改进想法,不一定需要考虑这些。

    6.完整的自定义查询

    LINQ的分析接近尾声了,这篇文章将是深入分析LINQ的最后一篇。既然已经结束了LINQ的全部分析,那么我们动手写一个小例子,作为想扩展LINQ的小雏形。该例子不会涉及到对表达式树的分析,毕竟表达式树的分析并非易事,后面会有专本的文章来剖析表达式树的完整结构,这里只是全盘的IQueryable和IQueryProvider的实现。

    ORM一直是我们比较喜欢去写的框架,这里就使用自定义的IQueryable来查询相应的对象实体。首先我们需要继承IQueryable接口来让LINQ能查询我们自己的数据上下文。

    public class DbQuery<T> : IQueryable<T>, IDisposable 
        { 
            public DbQuery() 
            { 
                Provider = new DbQueryProvider(); 
                Expression = Expression.Constant(this);//最后一个表达式将是第一IQueryable对象的引用。 
            } 
            public DbQuery(Expression expression) 
            { 
                Provider = new DbQueryProvider(); 
                Expression = expression; 
            } 
    
            public Type ElementType 
            { 
                get { return typeof(T); } 
                private set { ElementType = value; } 
            } 
    
            public System.Linq.Expressions.Expression Expression 
            { 
                get; 
                private set; 
            } 
    
            public IQueryProvider Provider 
            { 
                get; 
                private set; 
            } 
    
            public IEnumerator<T> GetEnumerator() 
            { 
                return (Provider.Execute<T>(Expression) as IEnumerable<T>).GetEnumerator(); 
            } 
    
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
            { 
                return (Provider.Execute(Expression) as IEnumerable).GetEnumerator(); 
            } 
    
            public void Dispose() 
            { 
    
            } 
        }
    

    下面需要实现提供程序:

     public class DbQueryProvider : IQueryProvider
        {
            public IQueryable<TElement> CreateQuery<TElement>(System.Linq.Expressions.Expression expression)
            {
                return new DbQuery<TElement>();
            }
    
            public IQueryable CreateQuery(System.Linq.Expressions.Expression expression)
            {
                //这里牵扯到对表达式树的分析,就不多说了。
                throw new NotImplementedException();
            }
    
            public TResult Execute<TResult>(System.Linq.Expressions.Expression expression)
            {
                return default(TResult);//强类型数据集
            }
    
            public object Execute(System.Linq.Expressions.Expression expression)
            {
                return new List<object>();//弱类型数据集
            }
        }
    

    我们看看如何使用;

    using (DbQuery<Order> dbquery = new DbQuery<Order>()) 
    { 
        var OrderList = from order in dbquery where order.OrderName == "111" select order; 
        OrderList.Provider.Execute<List<Order>>(OrderList.Expression);//立即执行 
        foreach (var o in OrderList) 
        { 
            //延迟执行 
        } 
    }
    

    喜欢编写ORM框架的朋友完全值得花点时间搞一套自己的LINQ TO ORM,这里只是让你高兴一下。

    展开全文
  • SSM框架概念(什么是SSM框架

    千次阅读 多人点赞 2019-08-21 13:36:53
    SSM框架 全称为Spring+SpringMVC+MyBatis ,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。 由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容...

            SSM框架

            全称为Spring+SpringMVC+MyBatis ,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。

            由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。

            Spring

            Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
      Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地'new'一个对象,而是让Spring框架帮你来完成这一切。

           简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
      SpringMVC
      SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。

            Mybatis
      Mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

           页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

    展开全文
  • 二、微服务架构实现技术选型:参考标准的两个维度+微服务实现框架对比 (一)技术选型的两个参考标准 1.核心组件完备性 2.关键要素实现难度 (二)微服务实现框架对比 Spring Boot/Cloud Dubbo gRPC 新锐...

    目录

    一、微服务架构实现需求

    二、微服务架构实现技术选型:参考标准的两个维度+微服务实现框架对比

    (一)技术选型的两个参考标准

    1.核心组件完备性

    2.关键要素实现难度

    (二)微服务实现框架对比

    Spring Boot/Cloud

    Dubbo

    gRPC

    新锐微服务框架:Istio  (Service Mesh的设计理念)

    参考书籍、文献和资料:


    一、微服务架构实现需求

    技术实现取决于需求,也就是微服务架构需要的考虑的基本技术问题。一个基本的微服务架构需要实现基本的五大核心功能:服务注册和发现、服务间通信、服务容错、数据管理和API网关,基本实现需求如下:

    二、微服务架构实现技术选型:参考标准的两个维度+微服务实现框架对比

    所谓技术选型,就是选择一个合适的技术体系来支持微服务的开发工作,首先,要明确选型的参考标准。

    (一)技术选型的两个参考标准

    1.核心组件完备性

    基本要求考虑以下5大核心组件:

    • 服务通信
    • 事件驱动
    • 负载均衡
    • API网关
    • 服务路由
    • 配置管理

    具体内容如https://blog.csdn.net/xiaofeng10330111/article/details/85682513.

    2.关键要素实现难度

    这点上我们主要需要明确注册中心及服务可靠性实现上的难度。

    • 注册中心

    关于服务注册和服务发现,比较常见的分布式一致性协议是Paxos和Raft协议。主要实现方案对比如下:

    服务的健康检查

    Euraka 使用时需要显式配置健康检查支持;Zookeeper,Etcd 则在失去了和服务进程的连接情况下任务不健康,而 Consul 相对更为详细点,比如内存是否已使用了90%,文件系统的空间是不是快不足了。

    多数据中心支持

    Consul 通过 WAN 的 Gossip 协议,完成跨数据中心的同步;而且其他的产品则需要额外的开发工作来实现;

    KV 存储服务

    除了 Eureka ,其他几款都能够对外支持 k-v 的存储服务,所以后面会讲到这几款产品追求高一致性的重要原因。而提供存储服务,也能够较好的转化为动态配置服务哦。

    产品设计中 CAP 理论的取舍

    Eureka 典型的 AP,作为分布式场景下的服务发现的产品较为合适,服务发现场景的可用性优先级较高,一致性并不是特别致命。其次 CP 类型的场景 Consul,也能提供较高的可用性,并能 k-v store 服务保证一致性。 而Zookeeper,Etcd则是CP类型 牺牲可用性,在服务发现场景并没太大优势;

    多语言能力与对外提供服务的接入协议

    Zookeeper的跨语言支持较弱,其他几款支持 http11 提供接入的可能。Euraka 一般通过 sidecar的方式提供多语言客户端的接入支持。Etcd 还提供了Grpc的支持。 Consul除了标准的Rest服务api,还提供了DNS的支持。

    Watch的支持(客户端观察到服务提供者变化)

    Zookeeper 支持服务器端推送变化,Eureka 2.0(正在开发中)也计划支持。 Eureka 1,Consul,Etcd则都通过长轮询的方式来实现变化的感知;

    自身集群的监控

    除了 Zookeeper ,其他几款都默认支持 metrics,运维者可以搜集并报警这些度量信息达到监控目的;

    安全

    Consul,Zookeeper 支持ACL,另外 Consul,Etcd 支持安全通道https.

    Spring Cloud的集成

    目前都有相对应的 boot starter,提供了集成能力。

    总的来看,目前Consul 自身功能,和Spring Cloud对其集成的支持都相对较为完善,而且运维的复杂度较为简单(没有详细列出讨论),Eureka 设计上比较符合场景,但还需持续的完善。

    • 服务可靠性

    相关功能主要包括服务容错、服务隔离、服务限流和服务降级,而且都偏向于实现策略而不是实现工具。

    具体内容如https://blog.csdn.net/xiaofeng10330111/article/details/86772740.

    (二)微服务实现框架对比

    总体来说,微服务之一种架构风格,对于一个大型复杂的业务系统,特的业务功能可以拆分为多个相互交互的微服务,各个微服务之间是松耦合的,通过各种远程协议进行同步/异步通信,各微服务均可以被独立部署、扩缩容以及升降级。实现框架对比主要如下:

      Spring Cloud Dubbo Motan MSEC 其他
    功能 微服务完整方案 服务治理框架 服务治理框架 服务开发运维框架
    通信方式 REST/HTTP RPC协议 RPC/Hessian Protocol buffer grpc、thrift
    服务发现/注册 Eurreka(AP) ZK、Nacos ZK/Conusl 只有服务发现 Etcd
    负载均衡 Ribbon 客户端负载 客户端负载 客户端负载 Nginx+Lua
    容错机制 6种容错策略 6种容错策略 2种容错策略 自动容错

    Keepaliced、

    HeartBeat

    熔断机制 Hytrix 提供过载保护
    配置中心 Spring Cloud Config Nacos Apollo、Nacos
    网关 Zuul、Gateway Kong、自研
    服务监控 Hytrix、Turbine Dubbo+Monitor Monitor ELK
    链路监控 Sleuth+Zipkin Pinpoint
    多语言 Rest支持多语言 Java Java Java、C++、PHP Java、PHP、Node.js
    社区活跃 高,背靠spring 高,背靠阿里 一般 未知

    服务框架是一个比较成熟的领域,有太多可选项。

    • Spring Boot/Cloud

    由于 Spring 社区的影响力和 Netflix 的背靠,目前可以认为是构建 Java 微服务的一个社区标准,Spring Boot 目前在 GitHub 上有超过 20k 星。

    基于 Spring 的框架本质上可以认为是一种 RESTful 框架(不是 RPC 框架),序列化协议主要采用基于文本的 JSON,通讯协议一般基于 HTTP。RESTful 框架天然支持跨语言,任何语言只要有 HTTP 客户端都可以接入调用,但是客户端一般需要自己解析 payload。目前 Spring 框架也支持 Swagger 契约编程模型,能够基于契约生成各种语言的强类型客户端,极大方便不同语言栈的应用接入,但是因为 RESTful 框架和 Swagger 规范的弱契约特性,生成的各种语言客户端的互操作性还是有不可坑的。

    • Dubbo

    Dubbo是阿里多年构建生产级分布式微服务的技术结晶,服务治理能力非常丰富,在国内技术社区具有很大影响力,目前 github 上有超过 16k 星。Dubbo 本质上是一套基于 Java 的 RPC 框架,当当 Dubbox 扩展了 Dubbo 支持 RESTful 接口暴露能力。

    Dubbo 主要面向 Java 技术栈,跨语言支持不足是它的一个弱项,另外因为治理能力太丰富,以至于这个框架比较重,完全用好这个框架的门槛比较高,但是如果你的企业基本上投资在 Java 技术栈上,选 Dubbo 可以让你在服务框架一块站在较高的起点上,不管是性能还是企业级的服务治理能力,Dubbo 都做的很出色。

    新浪微博开源的 Motan(GitHub 4k stars)也不错,功能和 Dubbo 类似,可以认为是一个轻量裁剪版的 Dubbo。

    • gRPC

    gRPC是谷歌近年新推的一套 RPC 框架,基于 protobuf 的强契约编程模型,能自动生成各种语言客户端,且保证互操作。支持 HTTP2 是 gRPC 的一大亮点,通讯层性能比 HTTP 有很大改进。Protobuf 是在社区具有悠久历史和良好口碑的高性能序列化协议,加上 Google 公司的背靠和社区影响力,目前 gRPC 也比较火,GitHub 上有超过 13.4k 星。

    目前看 gRPC 更适合内部服务相互调用场景,对外暴露 RESTful 接口可以实现,但是比较麻烦(需要 gRPC Gateway 配合),所以对于对外暴露 API 场景可能还需要引入第二套 RESTful 框架作为补充。总体上 gRPC 这个东西还比较新,社区对于 HTTP2 带来的好处还未形成一致认同,建议谨慎投入,可以做一些试点。

    • 新锐微服务框架:Istio  (Service Mesh的设计理念)

    Istio作为用于微服务服务聚合层管理的新锐项目,是Google、IBM、Lyft(海外共享出行公司、Uber劲敌)首个共同联合开源的项目,提供了统一的连接,安全,管理和监控微服务的方案。

    目前首个测试版是针对Kubernetes环境的,社区宣称在未来几个月内会为虚拟机和 Cloud Foundry等其他环境增加支持。 Istio将流量管理添加到微服务中,并为增值功能(如安全性,监控,路由,连接管理和策略)创造了基础。

    主要体现在以下几点:HTTP、gRPC和 TCP网络流量的自动负载均衡;提供了丰富的路由规则,实现细粒度的网络流量行为控制;流量加密、服务间认证,以及强身份声明;全范围(Fleet-wide)的策略执行;深度遥测和报告。

    现如今企业在采用云计算首选开源,而选择一个开源框架,社区的活跃度将作为重要参考选项。结合项目背景、提供功能、社区更新活跃度和稳定性来看,对于使用 Java系开发业务较多的企业,SpringCloud是目前阶段最为稳妥的可执行微服务框架方案;对于更多企业来说,Istio作为支持对于 Kubernetes的优先支持来讲,也是一个值得关注的方案,其与语言几乎无绑定的特性也值得期待。目前对比来看,Dubbo则显得稍逊下来。

    参考书籍、文献和资料:

    【1】郑天民. 微服务设计原理与架构. 北京:人民邮电出版社,2018.

    【2】徐进,叶志远,钟尊发,蔡波斯等. 重新定义Spring Cloud. 北京:机械工业出版社. 2018.

    【3】https://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/.

    【4】https://www.cnblogs.com/dadadechengzi/p/8416102.html.

    【5】 https://blog.csdn.net/bigtree_3721/article/details/78564591.

    展开全文
  • Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载

    万次下载 热门讨论 2014-07-21 12:06:07
    本资源对应博文:http://blog.csdn.net/zhshulin/article/details/37956105,可以通过博文进行学习,不建议下载完整源码,博文有详细教程,以及代码。
  • 常见python爬虫框架

    万次阅读 2017-07-21 16:26:34
    一、python爬虫框架  一些爬虫项目的半成品 二、常见python爬虫框架  (1)Scrapy:很强大的爬虫框架,可以满足简单的页面爬取(比如可以明确获知url pattern的情况)。用这个框架可以轻松爬下来如亚马逊商品...
  • SpringSpringMVCMybatis框架

    万人学习 2017-09-28 10:15:09
    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java...
  • MVC设计模式和MVC框架的区别

    千次阅读 多人点赞 2017-11-20 09:34:14
    MVC框架和MVC设计模式的区别
  • 前端框架存在的意义

    千次阅读 2017-11-23 17:30:48
    对于前端框架存在的意义?这个问题我思考了很久,稍微有一点头绪,把自己的想法说出来我感觉非常的爽,前端框架为什么存在?这都是我们应该考虑的问题。
  • 2018几大主流的UI/JS框架——前端框架

    万次阅读 多人点赞 2018-07-28 11:37:07
    这一年中有很多热门的前端开发框架,下面源码时代web小编为大家总结2016年至今最受欢迎的几款前端框架。 在这互联网飞速发展的信息时代,技术的更新迭代也在加快。目前看来,火了十几年的Java技术现在仍然是棵常青...
  • 简述SSM框架与SSH框架

    千次阅读 2019-06-27 17:21:43
    简述SSM框架与SSH框架 一. 简介SSM框架 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。 Spring  Spring就...
  • SSH框架总结(框架分析+环境搭建+实例源码下载)

    万次阅读 多人点赞 2013-04-25 10:00:28
    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。   集成SSH框架的系统从职责上分为四层:表示层...
  • C#.NET NFine快速开发框架_V1.1 程序

    万次下载 热门讨论 2016-08-20 00:31:12
    NFine 是基于 C# 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展,让Web开发更迅速、简单。能解决60%重复工作。为您节约更多时间,去陪恋人、家人和朋友。...
  • 什么是框架

    千次阅读 2018-10-10 09:29:05
    在编程领域,软件框架是指一种抽象形式,它提供了一个具有通用功能的软件,这些功能可以由使用者编写代码来有选择的进行更改,从而提供服务于特定应用的软件。软件框架提供了一种标准的方式来构建并部署应用。 软件...
  • 本课程把我们公司团队的...框架纯实战级,实用、简单、暴力。并支持插件化开发,功能还支持微信开发集成。 课程学完后,整个课件源代码就是一个完整的中型web前端开发框架。大家可以任意复制、学习、修改或占为己有
  • Android从View衍生出一个...于是,规划一个小框架来达成这个目标,对App开发者而言,这个小框架可以帮忙很多。App开发者可以从这个小框架衍生出子类,就能轻易开发出漂亮的ListBox了。本课程就来详细明ListView框架
  • 深度学习主流框架Caffe视频教程

    千人学习 2016-09-28 15:54:14
    深度学习主流框架caffe上手实战是由韦玮老师推出的一期关于Caffe的上手的实战技术公开课,Caffe是目前一款主流的深度学习框架,课程主要通过实战让大家上手深度学习,并通过实战掌握深度学习框架Caffe的基本应用。
  • web服务器和web框架的作用及其关系

    千次阅读 多人点赞 2018-10-15 21:24:27
    web服务器和web框架的作用及其关系 1.web服务器作用: 1)解析请求报文,调用框架程序处理请求。 2)组织响应报文,返回内容给客户端。 2.web框架程序的作用: 1)路由分发(根据url找到对应的处理函数) 。 2)在处理...
  • SSM框架——使用MyBatis Generator自动创建代码

    万次阅读 多人点赞 2014-04-17 10:18:03
    这两天需要用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所以可利用MyBatis生成器自动生成实体类、DAO接口和...
  • 深度学习框架Tensorflow案例实战视频培训课程概况: Tensorflow是谷歌开源的深度学习(包括机器学习)框架,伴随着人工智能业的兴盛其大名早已响彻云霄。本课程从Tensorflow安装开始讲起,从基本计算结构到深度学习...
  • Android第三方开源框架ImageLoader的完美Demo

    千次下载 热门讨论 2013-08-19 17:26:28
    Android第三方开源框架ImageLoader的完美Demo,很好地体现了ImageLoadr异步加载图片的优越性。
  • 作为前端开发者,各种框架的层出不穷,促使我们要不断学习才能防止落后,但是我们不可能做到每个框架都有学习的时间,我们只需要掌握流行的,坑少的即可。从以下三个方面了解目前流行的前端开发框架。 02. 跨多平台...
  • 开源一个功能完整的SpringBoot项目框架

    万次阅读 多人点赞 2019-10-11 14:14:39
    最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户...
  • web开发框架技术有哪些?

    千次阅读 2018-11-07 16:07:30
    如果你是做Web开发的,Web框架一定会很熟悉,框架是Web架构开发中必不可少的工具,不仅可以提高开发效率,还能让开发项目更成熟,并且可以提升代码的可再用性,Web框架开发离不开相应的开发语言,以下是常用的Web...
  • 最近因为工作关系,因效率问题 被逼花3天时间写了个类似Thinkphp3.2的YuYan框架,速度是Thinkphp3.2的5倍(运用到了以前2个现成DB类)。另花7天时间,也就是10号到现在。根据新框架写了个自动生成代码的系统。同时,...
  • 架构设计之路自主编写Web开发框架

    万人学习 2016-01-17 15:36:57
    以从零开始编写一个类似Struts2框架的方式来思考和架构,手把手带你从开始分析到结构设计到终实现的整个过程,完成Struts2框架的核心内容,从而更好的理解Struts2框架的设计理念和提升自身的框架编写能力。...
  • 深度学习Caffe框架入门视频课程

    万人学习 2016-12-23 18:13:18
    深度学习框架caffe入门,详解网络配置中每一个层的结构和参数项,对于超参数配置文件详解每一个参数的含义以及选择策略。对于数据源实例演示了两种常用的数据源LMDB和HDF5格式。课程涉及许多caffe框架的小技巧如绘制...

空空如也

1 2 3 4 5 ... 20
收藏数 1,151,523
精华内容 460,609
关键字:

框架