Spring入门概述及基本知识点

2023-11-11

Spring是什么:

我们常说的Spring,其实在官网中全称是SpringFrameWork。

Spring是一个轻量级,非入侵式的Java开发框架(主要用于业务层,和整合其他层),解决了业务层和表现层、持久层的耦合问题,将面向接口编程贯穿整个框架,解决了企业级应用的复杂性,使JavaWeb的开发更加简单。

Spring开发方式:

Spring的核心是控制反转(IOC)和面向切面编程(AOP)

Spring通过控制反转和依赖注入(DI)可以很好的对程序进行解耦,通过配置文件(applicationContext.xml)或注解的方式对类进行管理。通过Spring面向切面的编程方式,可以对指定代码进行增强。

使用Maven工程构建,pom文件需要的基础坐标依赖:

<dependencies>
		<!--maven传递依赖,导入依赖jar包:包括spring核心依赖包:spring-core、spring-beans、spring-aop等-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--Spring框架整合JUnit单元测试,必须先有Junit单元测试的环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!-- AOP联盟 -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- Spring Aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!-- aspectj -->
        <dependency>
                <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.3</version>
        </dependency>
        
        <!--Spring事务管理相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

</dependencies> 

什么是IoC(Inversion of Control,控制反转):

IoC是一种设计思想,将对象的创建权利(new)反转(交给)Spring框架,解决程序耦合度过高的问题。即原来是程序主动创建对象,控制权在我们手上;现在由Spring创建,管理,注入对象,控制权在Spring手上。

回想一下,之前我们在service层,经常会出现这样的代码:

public class OrderServiceImpl implements OrderService {

    //持久层对象,直接在程序中创建对象
    private OrderDao orderDao = new OrderDaoImpl();
	
	//其他逻辑
}

如果我们的业务在后续发生变化,业务层调用持久层的实现类发生变动,那么有关new OrderDaoImpl()的程序,要全部发生变化,虽然在这个例子中改变并不明显,但在真正的企业级应用开发中,牵一发而动全身,由于项目大且复杂,修改相关代码是一件吃力且昂贵的事情。

那么现在我们修改一下代码:

public class OrderServiceImpl implements OrderService {

    //持久层对象,直接在程序中创建对象
    private OrderDao orderDao;
	
	//利用set方法,动态实现对象的赋值。
	public void setOrderDao(OrderDao orderDao){
		this.orderDao = orderDao;
	}
	
	//其他逻辑
}

其实仅仅是一个set方法,就发生了革命性的变化。使用set方法后,对象不在由程序主动创建,而是成为了被动接受的对象。主动权给了调用者,即我们只需要改动传入对象的代码即可。

这种思想,使开发人员不用再主动去管理对象的创建,使系统耦合性大大降低,这种逻辑就是IOC的底层原理。

什么是DI(Dependency Injection,依赖注入):

Sprig的IoC需要DI,在Spring负责创建Bean对象时,动态的将其依赖的对象注入到Bean对象中。

Spring最核心的依赖注入,本质就是用set方法注入。使用bean标签下的property。

我们原来的业务逻辑:

在这里插入图片描述
SpringIoC的业务逻辑:

在这里插入图片描述
在这里插入图片描述

Spring配置文件开发

Spring框架在初始化时先读取配置文件,来决定管理哪些类,把哪些对象注入到另外的对象中去。

Spring配置文件命名格式:applicationContext.xml,使用schema约束。

Spring配置文件通过bean标签管理对象(自定义的类,Spring框架的类),交给IOC容器。

使用配置文件后,我们就只需要在配置文件中修改相关bean,即可解决上面所阐述耦合度问题。

Spring配置文件的主要内容:

<?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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--把UserServiceImpl类交给IoC容器进行管理,对象由IoC容器来创建,bean标签管理

        id:对象在IoC容器唯一的名称
        class:管理类的全路径(底层通过反射创建对象)
        scope:创建对象的生命周期(作用域)
            singleton(单例,加载配置文件,就会创建实例,且IOC容器只存在该类一个实例。生命周期和容器生命周期一致)  开发中大部分都是这个模式
            prototype(多例,每次从IOC容器中获取对象时,才会创建一个实例。容器不负责销毁对象,由GC销毁)
            request(多例,每次请求都会创建一个实例,存到request域对象,生命周期为一次请求)
            session(多例,每次会话都会创建一个实例,存到session域对象,生命周期为一次会话)
        init-method:当加载bean,创建对象后,调用init-method属性指定的方法
        destroy-method,当bean从容器中删除时,调用destroy-method属性指定的方法
    -->

    <!--实例化bean的三种方式,第一种最常用-->
    <!--1.默认调用无参构造构造器实例化对象-->

    <bean id="usImpl" class="cn.cx.service.UserServiceImpl" scope="singleton" init-method="init" destroy-method="destroy"/>

    <!--2.静态工厂方式实例化对象,class写我们自定义的静态工厂类,factory-method写该类里的静态方法,返回一个我们需要的实例对象
    <bean id="usImpl" class="xx.xx.xx.StaticFactory" factory-method="method"/>
    -->

    <!--3.动态工厂方式实例化对象,先配置一个bean,定义id和类的全路径,然后再配置一个bean,factory-bean:自定义的动态工厂,factory-method该类中的方法,返回一个我们需要的实例对象
    <bean id="dfactory" class="xx.xx.xx.Dfactory"/>
    <bean id="usImpl" factory-bean="dfactory" factory-method="method"/>
    -->

    <!--DI:属性的依赖注入-->
    <!--
        之前的方式:UserServiceImpl usImpl = new UserServiceImpl();
        现在创建对象,并给对象赋值由Spring完成。
        id相当于变量名,class相当于对象类型,property相当于对象,其中的name相当于属性名,value相当于属性值
        底层用set方法实现
        要想实现Bean的自动装配,要在bean标签加上autowire属性,常用的值类型有byName和byType
    -->
    <bean id="osImpl" class="cn.cx.service.OrderServiceImpl">
        <!--将odImpl注入到osImpl的orderDao属性上,引用数据类型用ref-->
        <property name="orderDao" ref="odImpl"/>
        <!--普通数据类型用value-->
        <property name="username" value="lisichen"/>
        <property name="size" value="45"/>
    </bean>

    <!--DI:构造器的依赖注入-->
    <bean id="osImpl1" class="cn.cx.service.OrderServiceImpl1">
        <constructor-arg name="orderDao" ref="odImpl"/>
        <constructor-arg name="username" value="duansl"/>
        <constructor-arg name="size" value="78"/>
    </bean>

    <bean id="odImpl" class="cn.cx.dao.OrderDaoImpl"></bean>

    <!--DI:数组,集合,Properties的依赖注入-->
    <bean id="cb" class="cn.cx.demo.CollectionBean">
        <property name="strs">
            <array>
                <value>断舍离</value>
                <value>立思辰</value>
                <value>王思傲</value>
            </array>
        </property>

        <property name="list">
            <list>
                <value>计算机</value>
                <value>互联网</value>
                <value>电商</value>
            </list>
        </property>

        <property name="map">
            <map>
                <!--如果是引用类型,加-ref-->
                <entry key="1" value="a"/>
                <entry key="2" value="b"/>
                <entry key="3" value="c"/>
            </map>
        </property>

        <property name="prop">
            <props>
                <prop key="username">root</prop>
                <prop key="password">adssd</prop>
            </props>
        </property>
    </bean>

    <!--可以引入其他加载文件,多人开发时使用
    <import resource="xxxx.xml"/>
    -->
</beans>

调用对象的逻辑:

public class Test {

    /**
     * 我们第一开始管理对象的方式:由我创建
     * */
    @org.junit.Test
    public void test(){
        UserService us = new UserServiceImpl();
        us.hello();
    }

    /**
     * 使用IoC方式管理对象:交给SpringIoC创建
     * */
    @org.junit.Test
    public void testIoc(){
        //创建SpringIoc的工厂(Spring上下文对象),加载applicationContext.xml配置文件,将配置文件中指定的类创建成对象,存入IOC容器中
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*可以以可变参数形式,加载多个配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","xxx.xml","xxxx.xml");*/
        System.out.println("=================");
        //从容器中获取对象(底层是一个Map集合),传入参数是配置文件中对应类的id值
        UserService usImpl = (UserService) ac.getBean("usImpl");
        usImpl.hello();
    }
}

Spring注解开发:

想使用注解,需要在Spring配置文件中引入相关schem约束的名称空间,并开启注解扫描:

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        
    <!--开启注解扫描 cn.cx.所有的包中的所有的类 -->
    <context:component-scan base-package="cn.cx"/>

</beans>

之后想要将哪个类交给IOC容器管理,就在哪个类上加上对应注解。

IOC管理常用注解:

@Component:把注解的类加入IOC容器管理,在非三层类上使用。
@Repository:作用同@Component,在持久层使用。
@Service:作用同@Component,在业务层使用。
@Controller:作用同@Component,在控制层使用。

DI常用注解(实现Bean的自动装配):

@Value:用于注入普通类型(String,int,Double等)
@Autowired:用于注入引用类型,默认按类型进行自动装配(byType),使用后可以省略对应的set方法,如果进行注解的类没有加上IoC管理的注解,编辑器会报错
@Qualifier:强制按id名称注入,不能单独使用,要与@Autowired一起使用
@Resource:Java的原生注解,也可以实现自动装配,默认通过byName查找,如果匹配不到,再通过byType查找

替换扫描包的注解:

@Configuration:声明当前类为配置类
@ComponentScan:扫描指定包结构,与@Configuration一起使用,可代替 <context:component-scan base-package=“cn.cx”/>
@Import:引入新的配置类
@Bean:把该方法创建的对象存入到IoC容器中,当有一些开源对象需要使用注解时,如果采用纯注解开发,我们无法在其源码上加注解,就可以使用该标签。

Spring整合Junit单元测试的注解:

@RunWith
@ContextConfiguration,与@RunWith一起使用,可以代替加载配置文件的API使用。

什么是AOP(Aspect Oriented Programming):

意为面向切面编程,是一种编程规范,采取横向抽取机制,采取横向抽取机制,优化了传统纵向继承体系的重复代码,可以在不修改程序的前提下,进行增强,解耦。
用于处理系统中分布于各个模块的横切关注点,比如事务管理、权限控制、缓存控制、日志打印等等。

SpringAOP底层原理:

JDK动态代理:代理对象实现真实对象功能(还可增强功能)。生成代理对象必须实现被代理对象所实现的相同接口(基于接口),由java反射包下的Proxy类和InvocationHandler接口实现动态代理功能,Proxy提供了创建动态代理类和实例的静态方法,InvocationHandler处理代理实例上的方法调用并返回结果(通过invoke方法),其本质是通过反射实现的。

CGLIB代理:生成代理对象继承被代理对象(基于类)

AOP术语:

Joinpoint(连接点):被代理类中(实现类)的各个方法
Pointcut(切入点):程序增强的入口,需要编写表达式(Spring框架使用AspectJ切入点表达式语言),指示程序哪些方法进行增强(自己编写),可以将切入点理解为需要被拦截的连接点
Advice(通知/增强):切面类中的方法,代码的具体逻辑,有前置、后置、最终、异常、环绕几种(自己编写)
Target(目标对象): 被代理对象
Proxy(代理):代理对象(真正执行方法的)
Aspect(切面):切入点+增强构成切面,自定义的切面类(增强方法写在里面)要先加入IOC容器。
Weaving(织入):把增强逻辑应用到被代理对象来创建新的代理对象的过程。

AOP配置格式:
<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--配置切面类,把该类交给IOC容器管理-->
    <bean id="myXmlAspect" class="cn.cx.aop.MyXmlAspect"/>

    <!--配置AOP的通知增强-->
    <aop:config>
        <!--使用切面类-->
        <aop:aspect ref="myXmlAspect">
        	<!--
                method()表示切面类中的方法(执行的增强方法)
                pointcut表示切入点:save()
            -->
            <aop:before method="log" pointcut="execution(public void cn.cx.aop.OrderServiceImpl.sava())"/>
        </aop:aspect>
    </aop:config>
</beans>

AOP通知类型:

前置通知aop:before:目标方法执行前进行增强
最终通知aop:after:目标方法执行成功或者失败进行增强
后置通知aop:after-returning:目标方法执行成功进行增强
异常通知aop:after-throwing:目标方法执行失败进行增强
环绕通知aop:around:目标方法执行前后都可以进行增强。目标对象方法需要手动执行

切入点表达式语法:

execution():固定写法。
public可以省略不写,返回值必须写,返回值可以用 * 通用的表示,重载方法都会被查找到。
包名+类名必须写,也可以用 * 通用表示,如cn.tx. * /cn.tx. * . * /cn.tx. * . * ServiceImpl。
方法名必须写,也可以使用*表示全部方法。
参数列表,(…)表示任意类型和个数的参数,可以想成可变参数。

AOP注解开发,要在配置文件中先加上:

<!--开启自动代理-->
<aop:aspectj-autoproxy/>
AOP常用注解:

@Aspect:声明当前类切面类,相当于<aop:aspect ref=“xxx”>
@Before:在切面类中增强方法上使用该注解,相当于<aop:before >,后置,最终效果和该标签同理。
@After: 后置通知:目标方法之后执行(始终执行)
@AfterReturning:返回之后通知:执行方法结束之前执行(异常不执行)
@Around:环绕通知:环绕目标方法执行
@AfterThrowing:异常通知:出异常后执行
@EnableAspectJAutoProxy:开启AOP自动代理

Spring加载属性文件:

<!--加载properties属性文件-->
<context:property-placeholder location="classpath:xxx.properties"/>

Spring声明式事务管理:

相关的类:
PlatformTransactionManager:平台事务管理器,不同的持久层框架,使用不同的实现类。

TransactionDefinition:事务定义信息类,传播行为(一个方法内调用另一方法,牵扯到两个事务)、超时、只读等等。

TransactionStatus:事务状态。

事务管理配置文件格式:

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd
                http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--配置平台事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!--配置事务的通知(没有自己编写切面类,通知方法也不是自己编写,Spring框架提供的)-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--对方法进行增强,设置隔离级别,传播行为,超时的时间-->
            <tx:method name="xxx" isolation="DEFAULT" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <!--配置AOP的增强-->
    <aop:config>
        <!--Spring框架提供系统通知,使用advisor标签-->
        <aop:advisor advice-ref="txAdvice" pointcut="execution(public * cn.cx.pay.AccountServiceImpl.pay(..))" />
    </aop:config>

</beans>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring入门概述及基本知识点 的相关文章

  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • vue2.0 自定义指令 + 案例:v-lazy-loading、v-drag、v-resize、v-copy

    文章目录 1 自定义指令 文档说明 1 1 全局注册 局部注册 1 2 钩子函数 2 案例一 property 的自定义钩子样例 3 案例二 动态指令参数 4 案例三 element ui 自定义el select的下拉懒加载指令v laz
  • C函数调用机制及栈帧指针

    转载 http bbs csdn net topics 90317145 http blog chinaunix net uid 26817832 id 3347227 html 帧指针 和栈指针到底是什么 有什么联系吗 帧指针指向帧头 栈
  • NCRE——网络工程师——网络技术

    对计算机发展具有重要影响的广域网 ARPANET 第一个运营的封包交换网络 IP电话系统有4个原件 网关 终端 网守 多点控制单元 通过MCU实现多点通信 网关可以看作H 323设备 IP电话中 网关的功能包括 A 号码查询 B 信号调制
  • 时序预测

    时序预测 MATLAB实现BP神经网络未来多步预测 目录 时序预测 MATLAB实现BP神经网络未来多步预测 预测效果 基本介绍 模型描述 程序设计 参考资料 致谢 预测效果 基本介绍 本次MATLAB实现BP神经网络时间序列未来多步预测
  • cmake生成动态链接库

    使用CMake生成动态链接库的步骤如下 1 在CMakeLists txt文件中指定要编译的源文件 例如使用add library命令 2 使用CMake生成Makefile文件 3 在终端中进入到CMake生成的Makefile文件所在的
  • 二、nginx server基础配置[root、alias、index]

    一 root 解释 root与alias类似 root其寻找文件是root地址 location 如下例子会去 var www html work下面寻找文件 如http localhost 80 work ab html其会寻找 var
  • STM32学习笔记:adc采样得到的电压值用485发送给pc

    采用adc1的通道10 将采集到的电压值用485发送给PC显示 先上原理图 源代码见附件 这里想说的是几个要注意的问题 1 ad输入的电压经过了R42和R44进行分压 所以pc显示的电压值将会减半 2 采用这个函数进行发送数据的时候 每次都
  • react中使用markdown组件——react-md-editor

    react中使用markdown组件 组件推荐 react md editor https github com uiwjs react md editor 在项目中使用过后是这样的 左侧内容可以默认 可以手动回填 简单介绍 下载依赖 np
  • 利用python自定义图片大小

    from PIL import Image import os 生成图片 并使用二进制方式打卡 读取图片中的内容 读取图片中的内容 img Image name RGB 1024 1024 255 160 255 img sane pyim
  • word怎么改一张纸的方向_word怎样单独改变一张纸的方向

    现在 您想要实现这样的效果 想设置其中的某一页为横向的 而其它页则统一为纵向的 如何设置呢 方法如下 相当简单 单独设置Word某页为横向 纸张大小 页边距等 均使用如下方法 比如 您的Word文档总的有十页 现在 您要将第二页的纸型方向设
  • servlet的基本使用

    目录 一 servlet的概念 二 servlet的生命周期 三 servlet实现登录的案例 登录界面 实现式开发 继承式开发 servlet的配置 配置式开发 注解式开发 一 servlet的概念 狭义的 Servlet 是指 Java
  • 密码学基础系列之(2.1传统对称密钥密码之三)

    多码代换密码 多码代换中 明文字符与密文字符的关系是一对多 密文C除了与明文P有关外 还与P的位置有关 自动密钥密码 autokey cipher P P1P2P3 C C1C2C3 k k1 P1 P2 加密 Ci Pi ki mod N
  • c语言 adt实验报告,Android实验报告

    Android实验报告 由会员分享 可在线阅读 更多相关 Android实验报告 90页珍藏版 请在人人文库网上搜索 1 Android 实验报告 专业 计算机科学与技术 班级 13419011 学号 1341901124 姓名 武易 精品
  • 已经上架的app(可供销售)在AppStore上搜不到的解决办法

    能搜索到但是是旧版本的情况 把你的app价格调为6元RMB 然后地区只选择中国 保存 这样你的app状态就会变成pending contract 然后把你的app调整成免费 地区全选 保存 再等半小时左右 AppStore就可以搜到了 亲测
  • 【机器学习项目实战】Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐

    说明 这是一个机器学习实战项目 附带数据 代码 文档 代码讲解 如需数据 代码 文档 代码讲解可以直接到文章最后获取 1 项目背景 电子商务网站数量迅速上升 将电子商务网站浏览者变为实际消费者 满足消费者需求 通过不同形式提升消费者忠诚度是
  • 兼容性测试方案

    目的 快速覆盖用户的各种操作环境 进行快速验证 1 常规项目测试策略 提高重视度 在需求分析 测试设计 测试执行 收尾阶段都要加大兼容性测试的比重 1 1 需求阶段 在需求阶段要获取兼容性测试环境的来源 来源为产品经理和用户现场使用情况 更
  • java动态规划,求最大子段和,并且求出开始位置,结束位置

    public static void main String args int x 1 3 2 11 8 4 13 5 4 8 5 System out println 最大子段和为 MaxAdd x private static int
  • 基础设计一——FPGA学习笔记<2>

    目录 零 设计流程 一 按键点亮LED灯 1 硬件资源 2 项目设计 3 波形设计 4 创建Vivado工程 编辑 lt 1 gt 添加设计文件 lt 2 gt 添加仿真文件 5 引脚约束 6 生成比特流文件 7 下载验证 8 程序固化 二
  • for-loop 与 json.Unmarshal 性能分析概要

    原文地址 for loop 与 json Unmarshal 性能分析概要 前言 在项目中 常常会遇到循环交换赋值的数据处理场景 尤其是 RPC 数据交互格式要转为 Protobuf 赋值是无法避免的 一般会有如下几种做法 for for
  • Spring入门概述及基本知识点

    Spring是什么 我们常说的Spring 其实在官网中全称是SpringFrameWork Spring是一个轻量级 非入侵式的Java开发框架 主要用于业务层 和整合其他层 解决了业务层和表现层 持久层的耦合问题 将面向接口编程贯穿整个