day03-Spring管理Bean-IOC-01

Spring管理Bean-IOC

1.Spring配置/管理bean介绍

  • Bean管理包括两方面:
    • 创建bean对象
    • 给bean注入属性
  • Bean的配置方式:
    • 基于xml文件配置方式
    • 基于注解配置方式

2.基于XML配置bean

2.1通过类型来获取bean

通过id来获取bean在Spring基本介绍中已经使用过,这里不再赘叙

2.1.1应用案例

  • 案例说明:

    1. 通过spring的ioc容器,获取一个bean对象
    2. 说明:获取bean的方式:按类型
  • 完成步骤:

    1. 创建一个Java对象Monster.java
    2. 在beans.xml中配置

Monster.java:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 * Javabean / Entity
 */
public class Monster {
    private Integer monsterId;
    private String name;
    private String skill;

    //无参构造器一定要有,spring底层反射创建对象时需要使用
    public Monster() {
    }

    public Monster(Integer monsterId, String name, String skill) {
        this.monsterId = monsterId;
        this.name = name;
        this.skill = skill;
    }

    public Integer getMonsterId() {
        return monsterId;
    }

    public void setMonsterId(Integer monsterId) {
        this.monsterId = monsterId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monsterId=" + monsterId +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

beans.xml:

<!--配置Monster,希望通过类型来获取-->
<bean class="com.li.bean.Monster" >
    <property name="monsterId" value="10086"/>
    <property name="name" value="孙悟空"/>
    <property name="skill" value="筋斗云"/>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //通过Bean的类型来获取对象
    @Test
    public void getBeanByType() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        //直接传入class对象/类型
        Monster bean = ioc.getBean(Monster.class);
        System.out.println(bean);
    }
}
image-20230116180921657

2.1.2细节说明

  1. 按照类型来获取bean,要求ioc容器中的同一个类的bean只能有一个,否则会抛出异常NoUniqueBeanDefinitionException

    image-20230116174142838
  2. 用类型来获取bean的应用场景:XxxAction/Servlet/Controller或者XxxService,在一个线程中只需要一个对象实例的情况(单例情况)

  3. 在容器配置文件(比如beans.xml)中给属性值,底层是通过setter方法完成的,这也是为什么需要在java对象中提供setter方法,否则会报错

2.2通过构造器配置bean

2.2.1应用实例

  • 案例说明:

    使用spring的ioc容器,可以通过构造器来来配置bean对象

  • 完整步骤:

    1. 配置bean.xml

在beans.xml配置:

前提是Monster类中有对应的构造器

   <!--配置Monster对象,并指定构造器-->
    <!--
        1. constructor-arg 标签可以指定使用构造器的参数
        2. index 表示构造器的第几个参数,从0开始计算
        3. 除了通过index,还可以通过 name/ type 的方式来指定参数
        4. 类构造器可以有多个,但是不能有参数完全相同的类型和顺序的构造器,
           这就决定了 通过构造器参数type 可以唯一确定一个构造器)
    -->
    <bean id="monster03" class="com.li.bean.Monster">
        <constructor-arg value="200" index="0"/>
        <constructor-arg value="白骨精" index="1"/>
        <constructor-arg value="吸血" index="2"/>
    </bean>
    <!--通过 name 的方式来指定参数-->
    <bean id="monster04" class="com.li.bean.Monster">
        <constructor-arg value="200" name="monsterId"/>
        <constructor-arg value="白骨精" name="name"/>
        <constructor-arg value="吸血" name="skill"/>
    </bean>
    <!--通过 type 的方式来指定参数-->
    <bean id="monster05" class="com.li.bean.Monster">
        <constructor-arg value="200" type="java.lang.Integer"/>
        <constructor-arg value="白骨精" type="java.lang.String"/>
        <constructor-arg value="吸血" type="java.lang.String"/>
    </bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

import java.io.File;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //通过构造器来设置属性
    @Test
    public void setBeanConstructor() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster monster03 = ioc.getBean("monster03", Monster.class);
        System.out.println("monster03=" + monster03);
    }
}
image-20230116183701893

2.2.2细节说明

  1. 通过index属性来区分是第几个参数
  2. 通过type属性来区分是什么类型(按照顺序)

2.3通过p名称空间配置bean

2.3.1应用实例

  • 案例说明:

    在spring的ioc容器,可以通过p名称空间来配置bean对象

  • 完成步骤:

    1. 在beans.xml配置,增加命名空间配置,如下,点击Create namespace declaration,成功后在配置文件头会自动添加xmlns
    image-20230116185329089 image-20230116185421380

beans.xml:

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

    <!--通过p名称空间来配置bean
        将光标放在p,输入alt+enter,就会自动添加 xmlns
     -->
    <bean id="monster06" class="com.li.bean.Monster"
          p:monsterId="500"
          p:name="红孩儿"
          p:skill="风火轮"
    />
</beans>

SpringBeanTest:

package com.li.test;

import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //通过p名称空间来设置属性
    @Test
    public void setBeanByP() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster monster06 = ioc.getBean("monster06", Monster.class);
        System.out.println("monster06=" + monster06);
    }
}
image-20230116190503876

2.3.2细节说明

注意要引入p名称空间

2.4引用/注入其他bean对象

2.4.1应用实例

  • 案例说明:

    在spring的ioc容器中,可以通过 ref (reference)来实现bean对象的相互应用

  • 完成步骤:

    1. 创建MemberDAOImpl.java,MemberServiceImpl.java
    2. 配置beans.xml

beans.xml:

<!--配置MemberDAOImpl对象-->
<bean class="com.li.dao.MemberDAOImpl" id="memberDAO"/>

<!--配置MemberServiceImpl对象
     1.ref="memberDAO" 表示
        MemberServiceImpl 对象的属性memberDAO 引用的对象是id=memberDAO的对象
     2.这就体现了spring容器的依赖注入
     3.注意在spring容器中,是作为一个整体来执行的,也就是说如果你引用到了一个bean对象,对你配置的顺序没有要求
        (在底层,对spring配置文件进行扫描,将关联的关系自动梳理,并放到beanDefinitionMap中,
         也就是说,是从beanDefinitionMap中查找关联关系的。与spring配置文件的配置顺序无关)
     4.但是建议按照顺序配置,易于阅读
  -->
<bean class="com.li.service.MemberServiceImpl" id="memberService">
    <property name="memberDAO" ref="memberDAO"/>
</bean>

MemberDAOImpl:

package com.li.dao;

/**
 * @author 李
 * @version 1.0
 * DAO 对象
 */
public class MemberDAOImpl {
    //构造器
    public MemberDAOImpl() {
        System.out.println("MemberDAOImpl 构造器...");
    }

    //方法
    public void add() {
        System.out.println("MemberDAOImpl add()方法被执行");
    }

}

MemberServiceImpl:

package com.li.service;

import com.li.dao.MemberDAOImpl;

/**
 * @author 李
 * @version 1.0
 * Service类
 */
public class MemberServiceImpl {
    private MemberDAOImpl memberDAO;

    public MemberDAOImpl getMemberDAO() {
        return memberDAO;
    }

    public void setMemberDAO(MemberDAOImpl memberDAO) {
        this.memberDAO = memberDAO;
    }

    public void add() {
        System.out.println("MemberServiceImpl add() 方法被调用...");
        memberDAO.add();
    }
}

SpringBeanTest:

package com.li.test;

import com.li.service.MemberServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;


/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //通过ref 来设置 bean属性
    @Test
    public void setBeanByRef() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        MemberServiceImpl memberService =
                ioc.getBean("memberService", MemberServiceImpl.class);

        memberService.add();
    }
}
image-20230116194020346 image-20230116194601208

2.4.2细节说明

注意:在spring容器中,是作为一个整体来执行的,也就是说如果你引用到了一个bean对象,对你配置的顺序没有要求。例如这里的例子,如果我们将Memb erDAOImpl对象的配置,放到MemberServiceImpl对象的配置之后也是可以的。

因为在底层,会对spring的配置文件进行扫描,将关联的关系自动梳理,并放到beanDefinitionMap中。

也就是说,是从beanDefinitionMap中查找关联关系的。与spring配置文件的配置顺序无关。

但是建议按照顺序配置,易于阅读

2.5引入/注入内部bean对象

2.5.1应用实例

  • 案例说明:

    在spring的ioc容器中,可以直接配置内部bean对象

  • 完成步骤:

    1. 创建MemberDAOImpl.java,MemberServiceImpl.java
    2. 配置beans.xml

创建MemberDAOImpl.java,MemberServiceImpl.java(见2.4)

beans.xml:

<!--配置MemberService对象(使用内部bean)-->
<bean class="com.li.service.MemberServiceImpl" id="memberService2">
    <!--自己配置一个内部bean-->
    <property name="memberDAO">
        <bean class="com.li.dao.MemberDAOImpl"/>
    </property>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.service.MemberServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //通过内部 bean来设置 bean属性
    @Test
    public void setBeanByProper() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        MemberServiceImpl memberService2 =
                ioc.getBean("memberService2", MemberServiceImpl.class);

        memberService2.add();
    }
}
image-20230116204507000

2.6引用/注入集合/数组类型

2.6.1应用实例

  • 案例说明

    在spring的ioc容器中,看看如何给bean对象的集合/数组类型属性赋值

  • 完成步骤:

    1. 创建Monster.java
    2. 创建Master.java
    3. 配置beans.xml

Monster.java:见2.1

Master.java:

package com.li.bean;

import java.util.*;

/**
 * @author 李
 * @version 1.0
 * Master类
 */
public class Master {
    private String name;

    private List<Monster> monsterList;
    private Map<String, Monster> monsterMap;
    private Set<Monster> monsterSet;

    //数组
    private String[] monsterName;

    // Properties 是 Hashtable 的子类,也是k-v形式
    // 这里Properties 的key和value都是String类型
    private Properties pros;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Monster> getMonsterList() {
        return monsterList;
    }

    public void setMonsterList(List<Monster> monsterList) {
        this.monsterList = monsterList;
    }

    public Map<String, Monster> getMonsterMap() {
        return monsterMap;
    }

    public void setMonsterMap(Map<String, Monster> monsterMap) {
        this.monsterMap = monsterMap;
    }

    public Set<Monster> getMonsterSet() {
        return monsterSet;
    }

    public void setMonsterSet(Set<Monster> monsterSet) {
        this.monsterSet = monsterSet;
    }

    public String[] getMonsterName() {
        return monsterName;
    }

    public void setMonsterName(String[] monsterName) {
        this.monsterName = monsterName;
    }

    public Properties getPros() {
        return pros;
    }

    public void setPros(Properties pros) {
        this.pros = pros;
    }

    @Override
    public String toString() {
        return "Master{" +
                "name='" + name + '\'' +
                ", monsterList=" + monsterList +
                ", monsterMap=" + monsterMap +
                ", monsterSet=" + monsterSet +
                ", monsterName=" + Arrays.toString(monsterName) +
                ", pros=" + pros +
                '}';
    }
}

beans.xml:

<!--配置Master对象-->
<!--体会Spring容器配置特点-->
<bean class="com.li.bean.Master" id="master">
    <property name="name" value="太上老君"/>

    <!--(1)给list属性赋值-->
    <property name="monsterList">
        <list>
            <!--方式1.引用的方式-->
            <ref bean="monster01"/>
            <ref bean="monster02"/>
            <!--方式2.内部bean-->
            <bean class="com.li.bean.Monster">
                <property name="name" value="黄袍怪"/>
                <property name="monsterId" value="1024"/>
                <property name="skill" value="吃人"/>
            </bean>
        </list>
    </property>

    <!--(2)给map属性赋值-->
    <property name="monsterMap">
        <map>
            <entry>
                <key>
                    <value>monster01</value>
                </key>
                <!--也可以通过内部 bean来配置,这里使用引用-->
                <ref bean="monster01"/>
            </entry>
            <entry>
                <key>
                    <value>monster02</value>
                </key>
                <!--也可以通过内部 bean来配置,这里使用引用-->
                <ref bean="monster02"/>
            </entry>
        </map>
    </property>

    <!--(3)给set属性赋值-->
    <property name="monsterSet">
        <set>
            <!--同理,依然可以使用ref或者内部 bean的方式配置-->
            <ref bean="monster05"/>
            <bean class="com.li.bean.Monster">
                <property name="name" value="金角大王"/>
                <property name="monsterId" value="888"/>
                <property name="skill" value="有钱"/>
            </bean>
        </set>
    </property>

    <!--(4)给数组属性赋值-->
    <property name="monsterName">
        <array>
            <!--这里根据数组的类型来选择对应的标签-->
            <value>小猪妖</value>
            <value>大鹏妖</value>
            <value>老狐狸</value>
            <!--同理,依然可以使用ref或者内部 bean的方式配置-->
        </array>
    </property>

    <!--(5)给Properties属性赋值,结构 k(String)-v(String)-->
    <property name="pros">
        <props>
            <prop key="username">root</prop>
            <prop key="pwd">1234</prop>
            <prop key="ip">127.0.0.1</prop>
        </props>
    </property>
</bean>

SpringBeanTest:

package com.li.test;

import com.li.bean.Master;
import com.li.bean.Monster;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

import java.util.Iterator;
import java.util.Map;

/**
 * @author 李
 * @version 1.0
 */
public class SpringBeanTest {

    //给集合/数组属性进行配置值
    @Test
    public void setBeanByCollection() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Master master = ioc.getBean("master", Master.class);

        System.out.println("========master的list属性=========");
        for (Monster monster : master.getMonsterList()) {
            System.out.println(monster);
        }

        System.out.println("\n========master的map属性=========");
        Iterator<Map.Entry<String, Monster>> iterator =
                master.getMonsterMap().entrySet().iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("\n========master的set属性=========");
        for (Monster monster : master.getMonsterSet()) {
            System.out.println(monster);
        }

        System.out.println("\n========master的数组属性=========");
        for (int i = 0; i < master.getMonsterName().length; i++) {
            System.out.println(master.getMonsterName()[i]);
        }

        System.out.println("\n========master的Properties属性=========");
        Iterator<Map.Entry<Object, Object>> iterator1
                = master.getPros().entrySet().iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }
    }
}
image-20230116215438988 image-20230116215457915

2.6.2细节说明

  1. 主要掌握List/Map/Properties三种集合的使用

  2. Properties集合的特点:

    (1)Properties是Hashtable的子类,也是key-value形式

    (2)key是String类型,value也是String类型

本文转载于网络 如有侵权请联系删除

相关文章

  • I/O模型分类

    在学习I/O模型的学习总结,如有错误,不吝指正(^.^)I/O复用场景:当客户处理多个描述字时;一个客户处理多个套接口;一个TCP服务器既要处理监听套接口,又要处理已连接套接口;一个服务器既要处理TCP,又要处理UDP;如果一个服务器处理多个服务或多个协议;一个输入操作分为:等待数据准备好(等待数据到达,然后拷贝到内核的缓冲区);从内核到进程拷贝数据(从内核缓冲区拷贝到应用缓冲区);阻塞I/O模型:函数调用阻塞至数据到达且拷贝到应用缓冲区,或者出错时返回(如信号中断);非阻塞I/O模型:函数调用若内核无数据准备好返回EWOULDBLOCK错误,若内核数据准备好则将数据拷贝到应用缓冲区,返回成功指示;I/O复用模型:阻塞在select或poll模型,而非真正的I/O系统调用阻塞,等待数据报套接口可读时调用读操作函数拷贝数据到应用缓冲区。其中使用两次系统调用,好处是可以等待多个描述字准备好;信号驱动I/O模型:先允许套接口进行信号驱动I/O(UNIXv122.2),并通过系统调用sigaction安装一个信号处理程序,当数据报准备好被读时就为该进程生成一个SIGIO信号,随后可以在信号处理

  • 人工智能在5G网络中的应用

    摘要:随着5G的商业化运行,通信网络运营正面临巨大挑战,传统运维管理方式难以适应5G空前庞大的网络规模、复杂的网络结构、激增的网络流量和多元化动态业务等新的需求,成为制约5G应用推广和效能提升的最大瓶颈。人工智能近年来发展迅猛,在许多传统行业成功应用。将人工智能应用于5G网络,可以有效提升网络的自动化、自主化程度,使过去的“傻瓜式”网络逐步向“智能化”的自动运行网络演进,为5G的商业化部署和更新迭代扫清障碍。 关键词:5G;人工智能;智能通信网络论文全文摘编如下引言5G网络对运营商带来了巨大的挑战,5GPPP论坛(5GInfrastructurePublicPrivatePatnership)明确了5G部署的关键挑战,例如提供1000倍的无线区域容量、更多样化的服务能力、服务节省高达90%的能源、减少平均服务创建时间周期从90h~90min、创建一个安全可靠的互联网、为服务提供“零感知”停机时间等[1]。空前庞大和复杂的网络规模、前所未有的服务质量要求和更加复杂多变的业务需求,远远超过了人工规划、运维的极限,引入人工智能(AI)已势在必行。通过将5G网络与人工智能相结合,可有效提高5G

  • AtCoder Beginner Contest 170

    A.题意:查找0的个数#include<iostream> #include<algorithm> usingnamespacestd; intmain(){ inta[5]; for(inti=1;i<=5;i++){ cin>>a[i]; if(a[i]==0)cout<<i<<endl; } }复制B.题意:算是一个鸡兔同笼的问题吧,然后就是暴力去看是否满足条件#include<iostream> #include<algorithm> usingnamespacestd; intmain(){ intx,y; cin>>x>>y; inttot; boolflag=0; for(inti=0;i<=x;i++){ tot=0; tot+=i*2+(x-i)*4; if(tot==y){ cout<<"Yes"<<endl; flag=1; break; } }

  • 如何评测语音技能的智能程度(1)——意图理解

    《如何评测语音技能的智能程度》是5篇系列文字,来自一位创业者,也是DuerOS开发者的投稿,老曹尽量不做变动和评价,尽量保持系列文章的原貌,这是第1篇。从事AI-NLP领域已经一年半了,一直潜心学习。平日里研究各种各样的语音助手,输出各种类型的调研分析报告,以培养自己的业务敏锐度,同时也研究各种框架型知识以丰富自己的知识库。在仔细、反复研读完了《Google对话式交互规范指南》《亚马逊语音交互设计规范》《DuerOS技能交互设计规范》 几大交互规范后,累积过往的工作过程中所遇见的问题,自己努力尝试着提炼出一个知识框架,并期望把这些规范类的东西,内化成为自己的被动技能,继而为自己以后做出更好用的产品做出积累。Part1我心中的超级人工智能私以为,最理想的人工智能,就像《Her》里面的萨曼莎;《钢铁侠》里面的贾维斯;《超能陆战队》里面的大白;《多啦A梦》里面的机器猫;这些超级英雄总能解决我们生活中的各种各样的问题。虽然我们的世界距离这种超级人工智能还非常遥远,也许永远达不到,但是不妨以一种非常高的标准对AI去做出苛求,继而去倒逼自己做出更好的产品。文章开始前,请先短暂忘记自己是AI从业者这

  • 实战 Spine 骨骼动画,教你如何换皮游戏动画!

    武汉位游出品的《梦幻厨房》目前已经获得了14位伙伴的支持,5折活动今天下午16:30结束,即将恢复原价,需要的朋友请赶快了!《梦幻厨房》之骨骼动画《梦幻厨房》人物造型采用Spine骨骼动画制作,可使资源量更小,动画更细腻!6组Spine骨骼包含人物动作、行走、表情等变化;可包含一个动画或多个动画。每一个骨骼动画仅由三个文件构成:切图坐标、人物位置及动画描述、图集文件。sp.Skeleton是CocosCreator内Spine骨骼动画的Compoent,仅需挂载上图中间的文件给SkeletonData即可,运行时通过脚本控制动画。《梦幻厨房》每个人物内置5组动画,看下图idle_angry:长时间等待未用餐时生气表情idle_common:进店时的正常表情idle_happy:准时取餐时开心表情idle_unhappy:长时间等待时不开心表情walk:行走进店及出店动作。 Spine骨骼动画代码调用(如下):如果需要对游戏进行二次开发,更换角色动画,需要适配好角色动画文件名、动作名字即可问题反馈这两天收到一位伙伴对这款游戏的BUG反馈,晓衡第一时间通知到「武汉位游」已经在积极处理!微信

  • 疫情现状分析

    前言从今年1月下旬开始,疫情开始全面爆发,全国人民与疫情的对抗拉开了正式的帷幕。从疫情开始后,全国人民开始了禁足模式,尽量少出门,大家的信息来源都是互联网,通过互联网来了解疫情实时情况。小编通过数据的可视化分析,来形象直观的展示疫情现状。疫情现状小编的数据是截至到2月15日,截至到这天,全国各个省份的疫情确诊数以湖北为中心的周边地区人数较多,离湖北越远,确诊人数也随之相应的减少:确诊最多的是湖北省,紧随其后的省份是广东,河南,浙江,湖南:虽然湖北省是确诊数最多的省份,同时也是治愈数最多的省份,其次是浙江,广东,湖南,河南,治愈数或许与各个地区的习惯风俗,当地人的免疫力以及医疗水平有关:不幸的是,湖北省也是全国所有地区中死亡最多的省份:全国的确诊数,治愈数,死亡数比例如下,可以看出,死亡的比例还是很小的一部分:全国的确诊,治愈,死亡走势也一直处于上升阶段,可以看出死亡数是最少的,治愈数高于死亡数。 所以大家平时多可以多锻炼增强自身免疫力。在走势图中可以发现12号以前确诊数都是比较平稳增长,13号突然剧增,小编查了查资料得知2月9日之后是全国各地的上班日,之后的几天确诊数就剧增,推测可能是

  • 欠驱动空间车辆在非参数化路径下的鲁棒输出反馈VFO-ADR控制

    本文研究了欠驱动车辆在三维空间运动时的矢量场定向自抗扰(vfoadr)级联路径跟踪控制器。级联控制结构的概念将系统运动学与系统动力学解耦,类似于非完整系统的方法。由于在动态级控制器中使用了ADR控制方法,所提出的控制结构对即使是显著的模型不确定性和外部干扰也具有很强的鲁棒性。在ADR内环控制器中实现的扩展状态观测器(ESO)的基于错误的形式的应用,意味着控制结构的输出反馈特性,即,只测量车身的位置和姿态。根据VFO方法设计了运动级控制器,利用非参数化路径表示来计算控制速度。在描述了所提出的控制结构之后,利用输入状态稳定(ISS)定理进行了理论分析,并对所提出的解决方案进行了仿真验证。原文题目:Robustoutput-feedbackVFO-ADRcontrolofunderactuatedspatialvehiclesinataskoffollowingthenon-parametrizedpath原文:ThisarticleconcernsthedevelopmentoftheVectorFieldOrientation-ActiveDisturbanceRejection(VFO

  • 超越Cookie,当今的客户端数据存储技术有哪些

    当cookie被首次引入时,它是浏览器保存数据的唯一方式。之后又有了很多新的选择:WebStorageAPI、IndexedDB和CacheAPI。那么cookie死了吗?我们来看看这些在浏览器中存储数据的技术。 CookiesCookie是由服务器发送或在客户端上设置的信息单位,保存在用户的本地浏览器上。它们会自动附加到每个请求上。由于HTTP是无状态协议,因此cookie允许将信息存储在客户端上,以便将其他上下文数据传给该服务器。Cookie有一些标志,对于提高数据的安全性非常有用。 HttpOnly 标志阻止用JavaScript访问cookie的行为,只有附加在HTTP请求上时才能访问它们。这非常适合防止通过XSS(跨站点脚本)攻击造成数据泄露。此外,Secure 标志确保仅在通过HTTPS协议发送请求时才发送cookie。 SameSite 标志,可以设置为 lax 或 strict(它们的差异看这里),可用于帮助防止CSRF(跨站点请求伪造)请求。它告诉浏览器只有在请求是与请求者在同一域中的URL时才发送cookie。什么时候使用cookies?那么,在哪些情况下你希望获得

  • Git安装及密钥的生成并上传本地文件到GitHub上

    之前用的GitHub,不太熟练,一直在上传的过程中遇到了一些问题,看了网上诸多教程,总觉得很乱,特参考一些资料,总结了一篇完整的操作步骤,从下载安装到上传文件,亲测有效1.下载Git软件:https://git-scm.com/downloads2.安装git软件(很简单)。安装成功后,在[开始]->[程序]->[git],下就会看见GitBash和GitGUI,打开GitBash,进入bash界面。接下来是重点,若这一步没有通过的话;秘钥没有认证完成,就不能上传文件,这个已经踩坑了,一直英语提示tellwhoareyou;3.注册邮箱在git bash界面输入如下内容即可完成邮箱的注册:$ git config --global user.name "user.name"(说明:双引号中需要你的用户名,这个可以随便输入,比如“wangting”)$ git config --global user.email "yourmail@youremail.com.cn"(说明: 双引号中需要输入你的有效邮箱,比如“1357097537@q

  • 揭秘:4种数据科学工作,8项求职技能

    大数据文摘翻译翻译:LindaBi校对:王翕然原文:http://blog.udacity.com/2014/11/data-science-job-skills.html转载需保留以上信息【专题众筹】 为了更好的服务广大读者,大数据文摘发起《手把手教你XXX》专题众筹活动,XXX可以是“数据营销”“数据运营”“可视化”“数据安全”“数据治理”等系列文章,希望有能力愿分享的朋友一并参加,与我们一道推动数据思维、数据文化的传播。我们筹集的是大家的经验和时间,给大家的回报是(1)为各位参与者提供一个交流平台(2)文摘愿意免费宣传有贡献者个人及团队。有意者,请后台留言报名,谢谢!“数据科学家”被誉为21世纪最性感的工作(ThomasDavenport和D.J.Patil在哈佛商业评论上曾发表的一篇文章中称),但如何成为一个数据科学家?怎样才能入门呢?许多的信息可能导致你认为成为一个数据科学家需要全面的精通一些领域,比如软件开发,数据整理,数据库,统计学,机器学习和数据可视化。不用担心。从我作为一个数据科学家的经验来说,事实并非如此。你并不需要马上学会一辈子受用的与数据相关的信息和技能。与之相

  • SQLite 预写式日志

         SQLite在3.7.0版本引入了WAL(Write-Ahead-Logging),WAL的全称是WriteAheadLogging,它是很多数据库中用于实现原子事务的一种机制,引入WAL机制之前,SQLite使用rollbackjournal机制实现原子事务。      rollbackjournal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。      WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。      同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行,默认是在WAL文件积累到1000页修改的时候;当然,在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口。执行checkpoint

  • C# 防止同一个账号多次登录(cache方法)

    c#中防止同一账号重复登录的方法有不少,比如用数据库来记录用户登录情况、用Application来保存用户登录信息、用Cache来保存信息等。 本文为大家介绍如何利用缓存Cache方便地实现此功能。  Cache与Session这二个状态对像的其中有一个不同之处,Cache是一个全局对象,作用的范围是整个应用程序,所有用户;而Session是一个用户会话对象,是局部对象,用于保存单个用户的信息。  只要把每次用户登录后的用户信息存储在Cache中,把Cache的Key名设为用户的登录名,Cache的过期时间设置为Session的超时时间,在用户每次登录的时候去判断一下Cache[用户名]是否有值,如果没有值,证明该用户没有登录,否则该用户已登录。 为大家举一个例子吧。   ///<summary> ///防止多次登录 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> privatevoid

  • Java中的try-catch-finally异常处理

    Java中的try-catch-finally异常处理 一、异常处理 异常(Exception):是在运行发生的不正常情况。 原始异常处理: if(条件) {   处理办法1   处理办法2   处理办法3 } if(条件) {   处理办法4   处理办法5   处理办法6 } 复制   代码阅读性差,臃肿不堪,与正常流程代码结合的很紧密,所以,在JAVA中进行一系列的改良,将一系列常见的问题,用面向对象的思考方式,对其进行了描述、封装。 class处理办法 { 处理办法1() { 举例1 } 处理办法2() { 举例2 } } if(出错了) {   抛出new处理办法1();此方法可能包含问题的名称,信息,时间,地点等。 } 复制    在JAVA中,用类的形式对不正常情况进行了描述和封装对象。当程序出现问题时,调用相应的处理办法。 描述不正常情况的类,就称为异常类。将流程代码和异常代码进行分离。 异常就是JAVA通过面向对象的思想,将问题封装成了对象。用异常类对其进行描述。不同的问题,用不同的类进行描述。那么意味着,问题有多少,类就有多少。 二、异常体系 问题很多,意味

  • POJ1745动态规划

    Divisibility TimeLimit: 1000MS   MemoryLimit: 10000K TotalSubmissions: 11622   Accepted: 4178 Description Consideranarbitrarysequenceofintegers.Onecanplace+or-operatorsbetweenintegersinthesequence,thusderivingdifferentarithmeticalexpressionsthatevaluatetodifferentvalues.Letus,forexample,takethesequence:17,5,-21,15.Thereareeightpossibleexpressions:17+5+-21+15=16 17+5+-21-15=-14 17+5--21+15=58 17+5--21-15=28 17-5+-21+15=6 17-5+-21-15

  • 阿里私服 maven 配置settings.xml

    复制   复制   <?xmlversion="1.0"encoding="UTF-8"?> <settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>D:\repositories</localRepository> <pluginGroups> <!--pluginGroup |Specifiesafurthergroupidentifiertouseforpluginlookup. <pluginGroup>com.your.plugins</pluginGroup&

  • WPF 客户端自动升级

    参考  https://www.cnblogs.com/xianyuxihuamao/p/12849209.html https://www.cnblogs.com/akwkevin/p/14946496.html   一个Wpf控件库(Wpf客户端框架使用)   Wpf登录验证方式(1)-滑动拼图的实现 https://www.cnblogs.com/akwkevin/p/14125321.html  

  • cybersploit

    靶机准备 将ova文件导入虚拟机中,设置网络模式为NAT 从靶机描述得知包含3个flag kali扫描其ip netdiscover-r192.168.164.0/24 复制 渗透测试 namp扫描端口 nmap-sS-sV-T5-A-p-192.168.164.187 复制 只开放了22、80端口 访问80端口 查看源码,发现信息 扫描一下目录 dirbhttp://192.168.164.187 复制 发现robots.txt,访问 得到一串密文,尝试base64解码 成功获得flag1 接下来尝试ssh连接 利用刚才获得的username进行尝试猜测密码为flag1: cybersploit{youtube.com/c/cybersploit} 成功登录 不是root权限 查看一下目录,发现flag2,读取 得到一串二进制数据,可能有用 011001110110111101101111011001000010000001110111011011110111001001101011001000000010000100001010011001100110110

  • 安装基于XenServer的DevStack

    Openstack默认的hypervisior是基于KVM的,可以修改nova-compute.conf的libvirt_type改成使用其他,网上可以搜到个别文章 但是Openstack官方文档却说这不是推荐的方式: “ItispossibletomanageXenusinglibvirt.ThiswouldbenecessaryforanyXen-basedsystemthatisn'tusingtheXCPtoolstack,suchasSUSELinuxorOracleLinux.Unfortunately,thisisnotwell-testedorsupported.” Openstack以变化太快著称,一年大概出一两个大的版本,四月份刚出的G,也很难面面俱到 在Github上的Devstack有如何安装基于XenServer的说明 可惜有些过时了,是基于5.6的,现在都6.2了 而且用得脚本也过时了,跟Citrix的工程师咨询了一下,给了我一个新的脚本 https://raw.github.com/citrix-openstack/qa/master/install-de

  • 郭盛华:黑客能通过电线顺走你的数据

    这种被称为SATAn的技术利用了计算机总线接口的普遍性,使其“在广泛的计算机系统和IT环境中非常容易被攻击者使用”。 近日,一种设计用于泄漏信息和跳过气隙的新方法利用串行高级技术附件(SATA)或串行ATA电缆作为通信介质,增加了一长串电磁、磁、电、光学和声学方法被证明是为了掠夺数据。 知名白帽黑客、东方联盟创始人郭盛华他在上周发表的一篇论文中写道:“虽然气隙计算机没有无线连接,但我们表明攻击者可以使用SATA电缆作为无线天线来传输6GHz频段的无线电信号”。 简而言之,目标是使用SATA电缆作为隐蔽通道来发射电磁信号,并将少量敏感信息从高度安全的气隙计算机无线传输到1m以外的附近接收器。 气隙网络是与任何其他网络物理隔离以提高其安全性的网络。气隙被视为保护高价值系统的重要机制,这些高价值系统对以间谍为动机的威胁行为者非常感兴趣。 在最后的数据接收阶段,传输的数据通过隐藏的接收器捕获,或者依靠组织中的恶意内部人员在气隙系统附近携带无线电接收器。“接收器监控6GHz频谱的潜在传输、解调数据、解码数据并将其发送给攻击者,”郭盛华解释说。 作为对策,建议采取措施防止威胁行为者获得初始立

  • [HNOI2016]最小公倍数

    [HNOI2016]最小公倍数 分块,并查集 对边(a)和询问(b)分别排序 边分块处理,找出当前块内所有的询问一起处理 对于每一个块的询问: 对于前面块内的边,a肯定比当前询问小,所以按b排序,一条条加入并查集,直到超过询问的b(这一步可以双指针维护,就不用标记了) 暴力遍历该块,找到符合要求的边,加入并查集,同时标记 并查集判联通,最大值,最小值,得到询问答案 清空此次询问带标记的并查集操作(栈记录),进入下一个询问 清空并查集,进入下一个块 细节: 初始化最大a、b赋为-1,因为\(0\lea,b\le10^9\) 边界处理,比如最后一个块 优化: 发现瓶颈在于访问每个块时对前面的b排序,而前面大部分的b又是有序的,所以可以归并排序以降低时间复杂度 #include<bits/stdc++.h> #definereregister //#defineintlonglong #definepairpair<int,int> //#defineFile(a)freopen(a".in","r",stdin),freopen(a".out","

  • HUAWEI防火墙通过IPSec隧道使总部与分部在多业务场景下实现业务隔离互访

    组网图形      组网需求 如图所示,总部通过FW_A与Internet连接,分支机构通过FW_B与Internet连接。FW_A和FW_B之间通过IPSec方式建立安全通信隧道。为了避免FW_A上的IPSec业务受到该防火墙上其他业务的影响,企业用户要求在FW_A上新建一个VPN实例,并将IPSec隧道单独配置到该VPN实例下,以达到业务隔离的目的。 配置思路 根据用户需求,配置思路如下: 1.在FW_A上新建一个VPN实例(vpn1)。 2.配置VPN实例下的路由。 3.配置VPN实例下的IPSec策略相关参数。   配置IKE对等体时,需要指定IPSec与VPN实例的绑定关系,详见配置FW_A中的步骤。 操作步骤 1.配置FW_A(总部)。   1.1配置VPN实例vpn1。 <sysname>system-view [sysname]sysnameFW_A [FW_A]ipvpn-instancevpn1 [FW_A-vpn-instance-vpn1]route-distinguisher100:1 [FW_A-vpn-instance-vpn1]qu

相关推荐

推荐阅读