Spring 知识点详解

1、Spring

1.1、简介

  • Spring:春天------>给软件行业带来了春天!

  • 2002,首次推出了Spring框架的雏形: interface21框架!

  • Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。

  • Rod Johnson ,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。

  • spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!

  • SSH : Struct2 + Spring + Hibernate !

  • SSM : SpringMvc + Spring + Mybatis!

官网: https:/lspring.io/projects/spring-framework#overview

官方下载地址: http://repo.spring.io/release/orglspringframework/spring

GitHub: https:/lgithub.comlspring-projects/spring-framework

1 <!-- https : //mvnrepository.com/artifact/org.springframework/spring-webmvc -->2<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</ artifactId>
<version>5.2.O.RELEASE</version></ dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->8<dependency>
<groupId>org.springframework</groupId>
<artifactid>spring-jdbc</artifactId>
<cversion>5.2.0.RELEASE</version></ dependency>

1.2、优点

  • Spring是一个开源的免费的框架(容器)!
  • Spring是一个轻量级的、非入侵式的框架!
  • 控制反转(IOC),面向切面编程(AOP) !
  • 支持事务的处理,对框架整合的支持!

总结一句话: Spring就是一个轻量级的控制反转(IOC))和面向切面编程(AOP)的框架!

2、IOC理论推导

  1. UserDao 接口

  2. UserDaoImpl 接口实现类

  3. UserService 业务接口

  4. UserServiceImpl 业务实现类

在之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码,如果程序代码量十分大,修改一次的成本代价十分昂贵!

我们使用一个Set接口实现,已经发生了革命性的变化!

//利用set动态实现值的注入
public void setUserDao(UserDao userDao) {this.userDao = userDao;
}
  • 之前,程序是主动创建对象,控制权在程序员手上!
  • 使用了Set注入后,程序不再具有主动性,二十变成了被动的接受对象

这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建!系统的耦合性大大降低,可以更加专注在业务的实现上!这是IOC的原型!

IOC本质

**控制反转loC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。**没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是︰获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl)。

3、IOC创建对象的方式

1.使用无参构造创建对象,默认!

2.假设我们要使用有参构造创建对象

  1. 下标赋值

    <!--第一种:下标赋值-->
    <bean id="user" class="com.nynu.qdy.pojo.User"><constructor-arg index="0" value="qdy学Java"/>
    </bean>
    
  2. 通过类型创建

    <!--第一种:通过类型创建,不建议使用-->
    <bean id="user" class="com.nynu.qdy.pojo.User"><constructor-arg type="java.lang.String" value="qidayang"/>
    </bean>
    

    3.参数名

    <!--第三种方式:直接通过参数名创建--><bean id="user" class="com.nynu.qdy.pojo.User"><constructor-arg name="name" value="其打样"/></bean>
    

**总结:**在配置文件加载的时候,容器中管理的对象就已经初始化了!

4、Spring配置

4.1、别名

<!--如果添加了别名,我们也可以通过别名获取这个对象-->
<alias name="user" alias="userNew"/>

4.2、Bean的配置

<!--id:bean的唯一标识符,也就是我们学的对象名
class:bean所对应的全限定名:包名+类名
name:也是别名,而且name可以去多个别名-->
<bean id="userT" class="com.nynu.qdy.pojo.UserT" name="userTNew,userTNew2 u3;u4"><constructor-arg name="name" value="xiahouxue"/>
</bean>## 4.3import这个import,一般用于团队开发使用,他可以将多个配置文件,导入合并为一个!假设,现在项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!- 张三- 李四- 王五- applicationContext.xml```xml<import resource="beans.xml"/><import resource="beans1.xml"/>

使用的时候,直接使用总的配置就可以了!

5、依赖注入(DI)

5.1、构造器注入

前面已经说过

5.2、Set方式注入 【重点】

  • 依赖注入:Set注入!
    • 依赖:bean对象的创建依赖于容器!
    • 注入:bean对象中的所有属性,由容器来注入!

【环境搭建】

​ 1.复杂类型

​ 2.真实测试对象

5.3、扩展方式注入

实体类

package com.nynu.qdy.pojo;public class Address {private String address;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Address{" +"address='" + address + '\'' +'}';}
}
package com.nynu.qdy.pojo;import java.util.*;public class Student {private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String, String> card;private Set<String> games;private String wife;private Properties info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbys() {return hobbys;}public void setHobbys(List<String> hobbys) {this.hobbys = hobbys;}public Map<String, String> getCard() {return card;}public void setCard(Map<String, String> card) {this.card = card;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public String getWife() {return wife;}public void setWife(String wife) {this.wife = wife;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", address=" + address.toString() +", books=" + Arrays.toString(books) +", hobbys=" + hobbys +", card=" + card +", games=" + games +", wife='" + wife + '\'' +", info=" + info +'}';}
}

测试类

import com.nynu.qdy.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) applicationContext.getBean("student");System.out.println(student.toString());}/*Student{name='qdy',address=Address{address='厦门'}, books=[红楼梦, 西游记, 水浒传],hobbys=[听歌, 敲代码, 看电影], card={身份证=1234567890, 银行卡=1234345234, =},games=[lol, 王者, 吃鸡],wife='null',info={学号=31, 性别=男, 年龄=19}}*/
}

完善注入信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.nynu.qdy.pojo.Address"><property name="address" value="厦门"/></bean><bean id="student" class="com.nynu.qdy.pojo.Student"><!--第一种:普通值注入--><property name="name" value="qdy"/><!--第二种:bean注入--><property name="address" ref="address"/><!--第三种:数组注入:ref--><property name="books" ><array><value>红楼梦</value><value>西游记</value><value>水浒传</value></array></property><!--List--><property name="hobbys"><list><value>听歌</value><value>敲代码</value><value>看电影</value></list></property><!--Map--><property name="card"><map><entry key="身份证" value="1234567890"/><entry key="银行卡" value="1234345234"/><entry key="" value=""/></map></property><!--Set--><property name="games"><set><value>lol</value><value>王者</value><value>吃鸡</value></set></property><!--null--><property name="wife" ><null/></property><!--Properties--><property name="info"><props ><prop key="性别"></prop><prop key="学号">31</prop><prop key="年龄">19</prop></props></property></bean>
</beans>

5.4、bean的作用域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RShuLO7Q-1620196766093)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210501170928751.png)]

1.单例模式(Spring默认机制)

1 <bean id="user2" class="com. kuang.pojo.user" c:age="18" c:name="狂神"
scope="sing1eton" />

2.原型模式:每次从容器中get的时候,都会产生一个新对象!

1<bean id="accountservice" class="com.something.Defau1tAccountservice"
scope="prototype" />

3.其余的request、session、 application、这些个只能在web开发中使用到!

6、Bean的自动装配

  • 自动装配是Spring满足bean依赖的一种方式!
  • Spring会在上下文中自动寻找,并自动给bean装配属性!

在Spring中有三中装配方式

  1. 在xml中显示的配置
  2. 在Java中显示配置
  3. 隐式的自动装配bean 【重要】

6.1、测试

环境搭建:一个人有两个宠物!

6.2、ByName自动装配

   <!--ByName:会自动在上下文中查找,和自己对象set方法后面的值对应的beanid--><bean id="people" class="com.nynu.qdy.pojo.People" autowire="byName"><property name="name" value="xq"/></bean>

6.3、ByType自动装配

    <bean id="dog" class="com.nynu.qdy.pojo.Dog"/><bean class="com.nynu.qdy.pojo.Cat"/><!--ByName:会自动在上下文中查找,和自己对象set方法后面的值对应的beanid--><!--ByType:会自动在上下文中查找,和自己对象属性相同的bean, bean的id属性可以省略--><bean id="people" class="com.nynu.qdy.pojo.People" autowire="byType"><property name="name" value="xq"/></bean>

小结:

  • ByName的时候,需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
  • ByType的时候,需要保证所有的bean的calss唯一,并且这个bean需要和自动注入的属性的类型一致!

6.4、使用注解自动装配

要使用注解须知:

  1. 导入约束,context约束
  2. == 配置注解的支持: context:annotation-config/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>

@Autowired

  • 直接在属性使用即可!也可以在set方法上使用!
  • 使用Autowired 我们可以不用编写Set方法了,前提是自动装配的属性在IOC(Spring) 容器中,且符合名字ByName!

科普:

@Nullable 字段标记了这个注解,说明这个字段可以为null.

7、使用注解开发

在Spring 4 之后,要是用注解开发,必须要保证aop的包导入了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDTs6DJ4-1620196766095)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210503120036761.png)]

使用注解需要导入context约束,增加注解的支持!

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>
  1. bean
  2. 属性如何注解
//等价于 <bean id="user" class="com.nynu.qdy.pojo.User"/>
@Component
public class User {public String name;@Value("asdfas")public void setName(String name) {this.name = name;}
  1. 衍生的注解

    ​ @Component 有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!

    • dao 【@Repository】

    • service 【@Service】

    • controller 【@Controller】

      ​ 这四个注解功能都是一样的,都是将某个类注册到Spring中,装配Bean!

  2. 自动装配置

@Autowired : 自动装配通过类型。名字如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value="xxx")- @Nullable字段标记了这个注解,说明这个字段可以为null;
@Resource:自动装配通过名字。类型。
  1. 作用域
//等价于 <bean id="user" class="com.nynu.qdy.pojo.User"/>
@Component
@Scope("prototype")
public class User {public String name;@Value("asdfas")public void setName(String name) {this.name = name;}
  1. 小结

xml与注解:

  • xml更加万能,适合用于任何场合!维护简单方便
  • 注解:不是自己的类使用不了,维护相对复杂!

xml与注解最佳实践:

  • xml用来管理bean
  • 注解只负责完成属性的注入
  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持!
<!--指定扫描包,这个包下的注解就会生效--><context:component-scan base-package="com.nynu.qdy"/><context:annotation-config/>

8、使用Java的方式配置Spring

我们现在要完全不使用Spring的xml配置了,全权交给Java来做!

JavaConfig 是Spring的一个子项目,在Spring 4之后,它成为了一个核心功能!

实体类:

//这里这个注解的意思,就是说明这个类被Spring接管了,注册到了Spring容器中
@Component
public class User {public String name;public String getName() {return name;}@Value("其打样") //属性注入值public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}

配置文件:

@Configuration
//这个也会被Spring容器托管,注册到容器中,因为他本来就是一个@Component
//@Configuration 代表这是一个配置类,就和我们之前看的beans.xml是一样的
@ComponentScan("com.nynu.qdy")
@Import(UserConfig2.class)
public class UserConfig {//注册一个bean,就相当于之前写的一个bean标签//这个方法的名字就相当于bean标签中的id属性//这个方法的返回值就相当于bean标签中的class属性@Beanpublic User getUser() {//就是返回要注入到bean中的对象!return new User();}

测试类:

public class MyTest {public static void main(String[] args) {//如果完全使用了配置类方式去做,我们就只能通过AnnotationConfig 上:下文来获取容器,通过配置类的cLass对象加载!ApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class);User user =(User) context.getBean("getUser");System.out.println(user.getName());}
}

这种纯Java的配置文件,在SpringBoot中随处可见!

9、代理模式

为什么要学习代理模式?因为就是SpringAOP的底层!【SpringAOP 和 SpringMVC】

代理模式:

  • 静态代理
  • 动态代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzJWtsGJ-1620196766097)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210504103610050.png)]

9.1、静态代理

角色分析:

  • 抽象角色 ︰ 一般会使用接口或者抽象类来解决
  • 真实角色 ︰ 被代理的角色
  • 代理角色 ∶ 代理真实角色,代理真实角色后,我们一般会做一些附属操作
  • 客户 : 访问代理对像的人!

代码步骤:

1.接口

/*** @author 平卉陌路*/
public interface Rent {//出租房屋public void rent();
}

2.真实角色

/*** @author 平卉陌路*/
public class Host implements Rent{@Overridepublic void rent() {System.out.println("房东要出租房子!");}
}

3.代理角色

/*** @author 平卉陌路*/
public class Proxy implements Rent{private Host host;public Proxy() {}public Proxy(Host host) {this.host = host;}@Overridepublic void rent() {host.rent();seeHouse();signAgreement();free();}//看房public void seeHouse(){System.out.println("中介带你看房!");}//签合同public void signAgreement(){System.out.println("签租赁合同");}//收中介费public void free(){System.out.println("收中介费");}
}

4.客户端访问代理角色

/*** @author 平卉陌路*/
public class Client {public static void main(String[] args) {//房东要出租房子Host host = new Host();/*host.rent();*///代理,中介帮房东出租房子,但中介会有一些附属操作Proxy proxy = new Proxy(host);//你不用面对房东,找中介租房即可!proxy.rent();}
}

代理模式的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业会公共也就就交给代理角色!
  • 实现了业务的分工!
  • 公共业务发生扩展的时候,方便集中管理!

缺点:

  • 一个真实角色就会产生一个代理角色;代码量会翻倍开发效率会变低

9.2、加深理解

聊聊横向AOP开发:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6mCq27F-1620196766099)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210504142911218.png)]

9.3、动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们直接写好的!
  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
    • 基于接口—JDK动态代理 ----【我们在这里使用】
    • 基于类:cglib
    • java字节码实现: javasist

需要了解两个类: Proxy:代理,InvocationHandler:调用处理程序

动态代理的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
  • 公共也就就交给代理角色!实现了业务的分工!
  • 公共业务发生扩展的时候,方便集中管理!
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务。
  • 一个动态代理类可以代理多个类,只要是实现了同一个接口即可!

10、AOP

10.1、什么是AOP

AOP (Aspect Oriented Programming)意为: 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sG68kfs5-1620196766100)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210504213617773.png)]

10.2 、Aop在Spring中的作用

提供声明式事务;允许用户自定义切面。

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等…
  • 切面(ASPECT)︰横切关注点被模块化的特殊对象。即,它是一个类。
  • 通知(Advice) :切面必须要完成的工作。即,它是类中的一个方法。
  • 目标(Target)︰被通知对象。
  • 代理(Proxy)∶向目标对象应用通知之后创建的对象。
  • 切入点(PointCut):切面通知执行的“地点"的定义。
  • 连接点(JointPoint):与切入点匹配的执行点。

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Hdm9vfF-1620196766101)(C:\Users\17728\AppData\Roaming\Typora\typora-user-images\image-20210504215028586.png)]

即Aop在不改变原有代码的情况下,去增加新的功能.

10.3、使用Spring实现Aop【重点】

使用AOP织入,需要导入一个依赖包!

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version>
</dependency>

注册bean:

 <!--注册bean--><bean id="userService" class="com.nynu.qdy.service.UserServiceImpl"/><bean id="log" class="com.nynu.qdy.log.Log"/><bean id="afterLog" class="com.nynu.qdy.log.AfterLog"/>

方式一 :使用Spring的接口 【主要是SpringAPI接口实现】

<!--方式一:使用原生Spring API接口-->
<!--配置aop:需要导入aop的约束--><aop:config><!--切入点 expression :表达式 execution:要执行的位置--><aop:pointcut id="pointcut" expression="execution(* com.nynu.qdy.service.UserServiceImpl.*(..))"/><!--执行环绕增加--><aop:advisor advice-ref="log" pointcut-ref="pointcut"/><aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/></aop:config>

方式二 :自定义类实现AOP (XML)【主要是切面定义】

    <!--方式二:基于xml的声明式AspectJ--><bean id="diy" class="com.nynu.qdy.diy.DiyPointCut"/><aop:config><!-- 自定义切面 ref:要引用的类--><aop:aspect ref="diy"><!--切入点--><aop:pointcut id="pointcut" expression="execution(* com.nynu.qdy.service.UserServiceImpl.*(..))"/><!--配置通知--><!--前置通知--><aop:before method="before" pointcut-ref="pointcut"/><!--后置通知--><aop:after method="after" pointcut-ref="pointcut"/><!--环绕通知--><aop:around method="around" pointcut-ref="pointcut"/><!--异常通知--><aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="throwable"/><!--最终通知--><aop:after-returning method="afterReturning" pointcut-ref="pointcut"/></aop:aspect></aop:config>

方式三 :使用注解实现

<!--方式三:基于注解的声明式AspectJ--><bean id="annotationPointCut" class="com.nynu.qdy.diy.AnnotationPointCut"/><!--开启注解支持 jdk(默认proxy-target-class="false")  cglib(proxy-target-class="true")--><aop:aspectj-autoproxy proxy-target-class="true"/>
```xml
ointcut" expression="execution(* com.nynu.qdy.service.UserServiceImpl.*(..))"/><!--配置通知--><!--前置通知--><aop:before method="before" pointcut-ref="pointcut"/><!--后置通知--><aop:after method="after" pointcut-ref="pointcut"/><!--环绕通知--><aop:around method="around" pointcut-ref="pointcut"/><!--异常通知--><aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="throwable"/><!--最终通知--><aop:after-returning method="afterReturning" pointcut-ref="pointcut"/></aop:aspect></aop:config>

方式三 :使用注解实现

<!--方式三:基于注解的声明式AspectJ--><bean id="annotationPointCut" class="com.nynu.qdy.diy.AnnotationPointCut"/><!--开启注解支持 jdk(默认proxy-target-class="false")  cglib(proxy-target-class="true")--><aop:aspectj-autoproxy proxy-target-class="true"/>

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

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

相关文章

Hadoop的FileSystem.copyToLocalFile两个参数 空指针异常

转载自 Hadoop的FileSystem.copyToLocalFile两个参数 空指针异常 在网上一搜&#xff0c;直接改成fileSystem.copyToLocalFile&#xff08;false&#xff0c;xx&#xff0c;xx&#xff0c;true&#xff09;即可。 Exception in thread "main" java.lang.NullPointe…

开源纯C#工控网关+组态软件(五)从网关到人机界面

一、 引子 之前都在讲网关&#xff0c;不少网友关注如何实现界面。想了解下位机变量变化&#xff0c;是怎样一步步触发人机界面动画的。 这个步步触发&#xff0c;实质上是变量组&#xff08;Group&#xff09;的批量数据变化&#xff08;DataChange&#xff09;事件&#xf…

【Vue】小案例

Vue挂载的方式 Vue创建组件的方式 Vue自调用函数 Vue Vue Vue Vue动画案例 Vue计数器 Vue路由创建 Vue路由动画展示 Vue李白评论 Vue v-mode绑定在input中&#xff0c;关联data相关的数据 相当于input中的value&#xff0c;但是他能关联多个 <div id"app">&l…

P1315,jzoj3029-观光公交【费用流】

前言 你绝对想不到&#xff0c;我用费用流神仙构图做了一道 的题 正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1315 题目大意 有nnn个地方&#xff0c;iii到第i1i1i1的长度为did_idi​。 有mmm个人&#xff0c;从tit_iti​出发&#xff0c;从l…

Spring依赖注入和控制反转

文章目录1、依赖注入1.1、依赖注入和控制反转的概念1.2、依赖注入的实现方式1.3、控制反转的具体实现1.4、依赖注入的具体实现1.5、依赖注入和控制反转总结1、依赖注入 1.1、依赖注入和控制反转的概念 依赖注入(Dependency Injection, 简称DI)与控制反转(IoC)的含义相同&…

Hadoop入门(五)IO操作

一、HadoopIO操作意义 Hadoop自带一套用于I/O的原子性的操作 &#xff08;不会被线程调度机制打断&#xff0c;一直到结束&#xff0c;中间不会有任何context switch&#xff09; 特点 基于保障海量数据集的完整性和压缩性 Hadoop提供了一些用于开发分布式系统的API&#xff…

使用Identity Server 4建立Authorization Server (1)

预备知识: 学习Identity Server 4的预备知识 本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详细的. 使用OAuth可以更安全, 这里我们的authorization server和web api 以及网站将分别独立运行. 建立authorization ser…

欢乐纪中某B组赛【2019.1.18】

前言 新年新气象&#xff0c;我们又一度迎来新一年的模拟赛(谁想迎来) 总之&#xff0c;有来到了熟悉的地方——纪中。 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCCDDD2222017myself2017myself2017myself300300300100100100100100…

Python和SQL Server 2017的力量

Python是SQL Server 2017的新功能。 它主要是为了允许在SQL Server中使用基于Python的机器学习&#xff0c;但是它可以与任何Python库或框架一起使用。为了提供可能的例子&#xff0c;Hitendra展示了如何安全地使用该功能来提供智能应用程序缓存&#xff0c;其中SQL Server可以…

Spring中的Bean配置、属性配置、装配内容详细叙述

文章目录1、Bean的配置1.1、配置方式2、Bean的实例化2.1、构造器实例化2.2、静态工厂方式实例化2.3、实例工厂方式实例化3、Bean的作用域3.1、作用域的种类4、Bean的生命周期5、Bean的装配方式5.1、基于XML的装配5.2、基于Annotation的装配5.3、自动装配1、Bean的配置 1.1、配…

Hadoop入门(六)Mapreduce

一、Mapreduce概述 MapReduce是一个编程模型&#xff0c;用以进行大数据量的计算 二、Hadoop MapReduce &#xff08;1&#xff09;MapReduce是什么 Hadoop MapReduce是一个软件框架&#xff0c;基于该框架能够容易地编写应用程序&#xff0c;这些应用程序能够运行在由上千个…

github详细搜索

in:name vue in:description 爬虫 stars:>1000 language:JavaScript

jzoj2941-贿赂【数学期望,dfs】

正题 题目大意 nnn个人&#xff0c;有投票几率aia_iai​和级别bib_ibi​&#xff0c;kkk个糖&#xff0c;每个可以让一个官员增加0.10.10.1的投票几率。 然后如果有超过一半的人投你&#xff0c;你就可以成功。 不然成功概率就是A/(A∑i∈Sbi)A/(A\sum^{i\in S}b_i)A/(A∑i∈S​…

Ocelot API网关的实现剖析

在微软Tech Summit 2017 大会上和大家分享了一门课程《.NET Core 在腾讯财付通的企业级应用开发实践》&#xff0c;其中重点是基于ASP.NET Core打造可扩展的高性能企业级API网关&#xff0c;以开源的API网关Ocelot为基础结合自己的业务特性&#xff0c;当天课程只有40分钟&…

Hadoop入门(十二)Intellij IDEA远程向hadoop集群提交mapreduce作业

Intellij IDEA远程向hadoop集群提交mapreduce作业&#xff0c;需要依赖到hadoop的库&#xff0c;hadoop集群的配置信息&#xff0c;还有本地项目的jar包。 一、软件环境 &#xff08;1&#xff09;window本地安装hadoop软件 首先将集群上的hadoop环境下载到本地&#xff0c;…

接口测试(备用)

音乐地址 http://k1998.xyz/php/public/index.php/index/music/lists 随机一个段子 https://autumnfish.cn/api/joke/list 随机十条段子(数字10可更改&#xff09; https://autumnfish.cn/api/joke/list?num10

Spring AOP知识点简介

文章目录1、什么是AOP1.1、AOP术语1.2、AOP框架2、动态代理2.1、JDK动态代理2.2、CGLIB动态代理3、基于代理类的AOP实现3.1、Spring的通知类型3.2、ProxyFactoryBean4、AspectJ开发4.1、基于XML的声明式AspectJ4.2、基于注解的声明式AspectJ1、什么是AOP 面向切面编程&#xf…

jzoj2940-生成输入数据【最小生成树,并查集】

正题 题目大意 给一个完全图的唯一一颗最小生成树&#xff0c;求完全图最小边权之和。 解题思路 我们考虑在计算最小生成树的时候&#xff0c;将两个联通块合并时&#xff0c;我们会选择连接这两个联通块的最小的边。 那么我们就可以让每个联通块合并时&#xff0c;让其他边都…

SQL2017 Azure SQL新功能:图形数据库

图形数据库是什么呢&#xff1f;如果从字面理解是进行图形处理的数据库&#xff0c;那么你就错了哈哈。 我们先来解释什么是图形数据库。 图形数据库是NoSQL数据库的一种类型&#xff0c;它应用图形理论存储实体之间的关系信息。最常见的例子&#xff0c;就是社会网络中人与人之…

git创建tag标签

创建标签 添加tag git tag v1.0 查看所有的tag版本 git tag 后可加-m添加注释 这时只能在本地可以看到自己新建Tag&#xff0c;在远程中央仓库中还是看不到在Tags下有如何内容&#xff0c;因为我们还没把它推送到中央仓库上 推送到远端 git push origin v1.0 如果没有和远程没…