2015年加入携程,目前主要负责搜索平台的前端+数据挖据工作。 一、前言 随着旅游业的发展,人们对搜索的要求越来越高。智能化大趋势下,个性化的推荐系统的应用及用户需求也越来越广泛。...针对以上面临的问题和挑战,本文将分享携程推荐系统的更新迭代过程。 二、推荐系统架构 携程搜索推荐系统架构如下: ? 抛开业务和数据部分,这里只简单介绍推荐服务的结构,其简要构造如下: ?...这部分可以细分成几大召回策略(以推荐实际酒店、文章、景点的系统为例): 2.3.1 补充策略 这部分主要输出当前热门的产品信息,比如当季热门的酒店、景点等。...2.4 排序 上述召回策略,会召回大量的产品,如何对这些产品进行合理排序,是推荐系统的核心部分,同时也是反映系统优劣的指标。 这部分,经历几次迭代。...每个场景的输出,都不太一样,就需要对其数据进行筛选。比如进入搜索默认页时,提前给出推荐产品,减少用户操作。还可以在用户搜某个具体城市时,输出相应的结果。 这里需要注意的是马太效应。
今天是小浩算法“365刷题计划”第74天。继续为大家分享一道有趣的概率类问题(是有小伙伴咨询我的,在面试时会被问到哈~) 01 PART 硬币问题 ?...为了让游戏过程更加刺激,A提出了这样一个方案:连续抛掷硬币,直到最近三次硬币抛掷结果是“正反反”或者“反反正”。如果是前者,那么A获胜;如果是后者,那么B获胜 问题是:B应该接受A的提议吗?...每一个季节为13个星期,所以扑克牌中每种花色为13张;而每一个季节为91天,13张牌点数相加相加刚好是91点,再加上小王的1点,一共为365点代表了365天;加上大王的1点则表示闰年的366天。...如果出现连续三张牌,花色依次是红黑黑,那么玩家A加一分;同时把翻开了的牌都丢掉,继续一张张翻没翻开的牌;类似地,一 旦出现连续三张牌恰好是黑黑红,则玩家B得一分,弃掉已翻开的牌后继续。结果会如何呢?...上面的问题请认真思考(毕竟硬币题目只是简化版本,下面这种才是面试时更容易被问到的),评论区留下你们的想法,写的好的顶你到天花板。
比如可以将一个Integer类型的对象分配给Object类型的对象,因为Object 是Integer的超类。...那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型的对象是如何实现子类型化的吧。...因此当我们在传递参数时,ArrayList类型的是可以给List或者Collection传递的。 只要不改变类型参数,类型之间的子类型关系就会保留。...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。
进入大公司的几种渠道 名牌大学毕业基础过硬,一般通过校招或者社招的方式进入,一般名校毕业的学生在基本功以及接收能力上平均看还是要高出普通毕业的大学生,从国内就业情况看毕业的院校对于找到第一份工作还是起到非常关键的作用...,对于程序员岗位来讲,找第一份编程的工作影响也会是有的,但在真正掌握了编程的技能之后,学历的影响就会变得低了许多。...很多创新点都是来源于小的公司,在小的公司可能工作做起来比较杂,但从锻炼人的角度考虑还是挺合适,所以毕业的前几年在小的企业磨练两年也是一种不错的经历,很多运气不错的公司从小的公司慢慢壮大起来甚至业务爆发直接完成了上市...,直接从小公司变成了大企业,这种也没有必要选择去大公司了,和公司以前成长起来了,如果是核心成员还能拿到一部分期权股份。...大公司相对来讲技术能力高手比例会高一些,真正被大家尊重比例还是比较少,所以有些技术能力很强的并不喜欢呆在大公司,虽然在小公司可能在工作强度上更加大一些,但是接触到的广度还是要高于大企业,对于技术人员的岗位来讲
--配置bean的后置处理器,不需要配置id,IOC是一个自动识别BeanPostProcessor--> ②.为Bean的属性设置值和对其他的Bean的引用。 ...,Spring容器将会扫描这个基类暴力以及其子类包的所有类。...当需要扫描多个包时,可以使用逗号分隔 如果仅希望扫描特定的类而非基类包下的所有类,可以使用resource-pattern属性过滤特定的类 子节点表示包含的目标类...,当Spring招不到匹配的Bean装配置是,会抛异常。...默认情况下,当IOC容器里面存在多个类型兼容的Bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称,Spring允许对方法的入参标注@Qualifier已指定注入
SpringIOC容器对Bean的生命周期进行管理的过程: 通过构造器或工厂方法创建Bean的实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 当容器关闭时,调用Bean的销毁方法...,当客户端需要请求对象时,只需要简单地调用一下该实例方法而无需关心对象的创建细节。...容器将会扫描这个基类包及其子包中的所有类 resource-pattern:如果仅希望扫描特定的类而非基类包下的所有类,可以使用该属性进行过滤 context:include-filter:子节点,表示要包含的目标类...时,就会抛出异常,若某一个属性允许不被设置,可以设置@Autowired注解的required属性为false 默认情况下,当IOC容器中存在多个类型相同的Bean时,通过类型的自动装配将无法工作,此时可以在...切面的优先级 当一个方法有多个切面起作用时,如何决定切面之间的优先级呢?
SpringIOC容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法创建Bean的实例 2.为Bean的属性设置值和对其它Bean的引用 3.调用Bean的初始化方法 4.当容器关闭时,...,当客户端需要请求对象时,只需要简单地调用一下该实例方法而无需关心对象的创建细节。...容器将会扫描这个基类包及其子包中的所有类 2.resource-pattern:如果仅希望扫描特定的类而非基类包下的所有类,可以使用该属性进行过滤 3.context:include-filter:子节点...Bean时,就会抛出异常,若某一个属性允许不被设置,可以设置@Autowired注解的required属性为false 3.默认情况下,当IOC容器中存在多个类型相同的Bean时,通过类型的自动装配将无法工作...切面的优先级 当一个方法有多个切面起作用时,如何决定切面之间的优先级呢?
以上的是对car类里面的属性赋值为250; 如果是集合属性该如何赋值呐?...1、使用Bean的scope属性来配置bean的作用域,singleton:默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建这一个bean,他是单例的 prototype:原型的容器...,初始化时创建bean实例,而在每次请求时都创建一个新的bean实例并返回。...value="#{prefixGenerator}"> 2)、引用其他对象的属性 SPEL:调用静态方法或静态属性,通过T()调用一个类的静态方法...,spring容器将会扫描这个基类包以及其子包里面所有的类" resource-pattern="希望扫描特定的类而非基包下的所有类,过滤特定的类,例如: <context:component-scan
源码介绍之前,看几个问题: Bean的承载对象是什么? Bean的定义如何存储的? Bean工厂是如何生产bean的? Bean的依赖关系由谁来解决?...对于@Autowire、@Resource等注解,在启动SpringIOC容器时,容器会装载一个AutowiredAnnotationBeanPostProcessor 后置处理器,当容易扫描到@Autowire...、@Resource等注解时,就会在IOC容器中自动查找需要的Bean,并装配给该对象的属性,在使用@Autowire时,首先在容器中查询对应类型的bean,如果查询不止一个,则根据名称来查,如果名称没有则抛异常...对于bean之间相互引用的情况,比如A依赖B,B依赖A,这种情况时,先去实例化A,然后发现依赖B,接着去实例化B,如果此时发现B依赖A,容器会获取A的一个早期引用(early reference),将这个早期引用的...当然对于这种循环引用的代码应该规避,这种不是正常的场景。
4.1 自动装配 Bean Spring 装配 bean 时,有时非常明确,就是需要将某个 bean 的引用装配给指定属性。...在 Spring 中,使用自动装配的方式是在 bean 元素中注明 autowire 属性。 以 byName 为例 假如有一个歌手类,含两个属性,一个是演唱的曲目,一个是演奏的乐器。...但是,当使用构造器装配时,只有一个构造器可以将 @Autowired 的 required 属性设置为 true,其他的只能置为 false。...Provider JSR-330中有个技巧:不直接注入一个引用,而是注入一个 Provider,Provider 接口可以实现 Bean 引用的延迟注入以及注入 Bean 的多个实例等功能。... 除了完成与 一样的工作,还允许 Spring 自动检测 Bean 和定义 Bean。 例 <?
同样的,你的类也变的更容易测试,尤其是依赖关系在接口或抽象基类之间的时候,这种情况下单元测试中会要求存桩或模拟实现。...下面的例子显示了一个类只能通过纯粹的setter注入进行依赖注入。这个类是常见的Java类。它是一个不依赖于容器中特定接口、基类或注解的POJO。...有时候,当处理没有源码的第三方类时,使用哪种方式取决于你。例如,如果第三方库没有提供任何setter方法,构造函数注入可能是依赖注入唯一可行的方式。...通常情况下你可以信任Spring去做正确的事情。在容器加载时它检测配置问题,例如引用不存在的beans和循环依赖。当bean实际创建时,Spring设置属性和解析依赖尽可能的晚。...一个更关键的限制是查找方法不能与工厂方法一起工作,尤其是在配置类中不能与@Bean方法同时起作用,由于那种情况下容器不能控制实例的创建,因此不能在飞速写入中创建一个运行时产生的子类。
Bean都起作用 管理连接池及引用外部配置文件 以数据库连接池为例,数据库连接池最好是单例模式的,一个连接池中有多个数据库连接....Person实体类中的Car属性及Map中的Car属性都自动装配上以及一些环境变量 如果容器中有多个Car,在xml中多配置一个Car Bean标签,执行测试 constructor Person实体类中增加只包含...Car的有参构造器 public Person(Car car) { System.out.println("只包含Car的有参构造器被调用"); this.car = car; } autowire.xml...中只保留一个car的xml配置,将person的xml配置中的autowire属性改为constructor,执行测试方法 如果存在多个car bean,增加一个car配置 <bean id="car01...,<em>当</em>存在多个同类型<em>的</em>Bean<em>时</em>,优先按照属性名进行自动赋值 自动装配即自动赋值 Spring 表达式 (SpEL) 使用#{}表示Spring 表达式 支持使用字面量 支持<em>引用</em>其他Bean及Bean
= null) { //解析给定类autowire相关注解元信息 metadata.clear(pvs); } //解析给定类autowire相关注解元信息...LinkedList elements = new LinkedList(); Class targetClass = clazz; //递归遍历当前类及其所有基类,解析全部注解元信息...= targetClass.getSuperclass(); } //如果给定类有基类,并且基类不是Object,则递归获取其基类的元信息 while (targetClass !...,Spring容器自身注册了很多Bean的依赖, //当使用者想要注入指定类型的Bean时,会优先从已注册的依赖内寻找匹配 for (Class autowiringType : this.resolvableDependencies.keySet...(即要注入的类不能是类本身,会触发无限递归注入) if (!
如何确定构造方法 在Spring中生成Bean实例的时候默认是调用对应的无参构造方法来处理。...实例的类可以实例化 Class<?...然后我们来看看他是如何实现循环检测的。...PropertyDescriptor[] filteredPds = null; //如果工厂拥有InstiationAwareBeanPostProcessor,那么处理对应的流程,主要是对几个注解的赋值工作包含的两个关键子类是...提前暴露 然后来看看是如何处理循环依赖的。
我们可以看到:当通过基类的引用去调用对象内的方法时,重写仍然能够找到定义在对象真正类型中的GetString方法,而隐藏则只调用了基类中的GetString方法。 ...(1)要解释这个问题产生的原因,我们需要详细地了解一个带有基类的类型(事实上是System.Object,所有的内建类型都有基类)被构造时,所有构造方法被调用的顺序。 ...在C#中,当一个类型被构造时,它的构造顺序是这样的: 执行变量的初始化表达式 → 执行父类的构造方法(需要的话)→ 调用类型自己的构造方法 我们可以通过以下代码示例来看看上面的构造顺序是如何体现的:...换句话说,当虚方法在基类的构造方法中被调用时,它的类型让然保持的是子类,子类的虚方法将被执行,但是这时子类的构造方法却还没有完成,任何对子类未构造成员的访问都将产生异常。 如何避免这类问题呢?...2.3 如何避免类型转换时的异常? 我们经常会面临一些类型转换的工作,其中有些是确定可以转换的(比如将一个子类类型转为父类类型),而有些则是尝试性的(比如将基类引用的对象转换成子类)。
在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的 模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。...反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本...int a = 10; 声明一个变量 a,初始化为 10,此时 a 就不代表字母 a 了,而是作为一个变量的名字。当我们引用 a 的时候,我们实际上拿到的值是 10。...String 类型转换成我们要的 Clazz 类型,说明我们使用 value 属性时,Spring 只把这个 属性看做一个普通的字符串,不会认为这是一个 bean 的 id,更不会根据它去找到 bean...当一些组件需要依赖其他组件时,我们可以使用自动装配来完成相关依赖的注入。Spring 会在应用加载时扫描组件并建立它们之间的依赖关系。
ref 是指向 Spring 的 IOC 容器中的另一个 bean 对象的,对于简单数据类型,没有对应的 bean 对象,该如何配置? <?... 上面已经完成了构造函数注入的基本使用,但是会存在一些问题: 当构造函数中方法的参数名发生变化后,配置文件中的 name 属性也需要跟着变 这两块存在紧耦合,具体该如何解决?..." autowire="byType"/> 注意事项: 需要注入属性的类中对应属性的 setter 方法不能省略 被注入的对象必须要被 Spring 的 IOC 容器管理 按照类型在...对应的名是一致的 如果按照名称去找对应的 bean 对象,找不到则注入 Null 当某一个类型在 IOC 容器中有多个对象,按照名称注入只找其指定名称对应的 bean 对象,不会报错...最后对于依赖注入,需要注意一些其他的配置特征: 自动装配用于引用类型依赖注入,不能对简单类型进行操作 使用按类型装配时(byType)必须保障容器中相同类型的 bean 唯一,推荐使用 使用按名称装配时
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。...使用依赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。依赖注入是一种优秀的解耦方式,其可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。...协调作用域不同步的Bean 当singleton作用域的Bean依赖于prototype作用域的Bean时,会产生不同步的现象,原因是因为当Spring容器初始化时,容器会预初始化容器中所有的singleton...容器中一旦注册了Bean后处理器,Bean后处理器就会自动启动,在容器中每个Bean创建时自动工作,Bean后处理器两个方法的回调时机如下图 ?...其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。
依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。...byName(按名称注入) java类中引用类型的属性名和spring容器中(配置文件)的id名称一样,且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。..." /> byType(按类型注入) java类中引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系的,这样的bean能够赋值给引用类型 <!...component-scan工作方式: spring会扫描遍历base-package指定的包, 把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,或给属性赋值。...@Resource只使用byName方式,需要增加一个属性 name,name的值是bean的id(名称) 指定name @Component("myStudent") public class Student
领取专属 10元无门槛券
手把手带您无忧上云