Spring1~~~

news2024/9/24 7:20:19

快速入门

javaBean规范要有set方法,底层反射赋值

    <!--   id表示在该java对象在spring容器中的id-->
    <bean class="spring.bean.Monster" id="monster01">
        <property name="Id" value="100"/>
        <property name="name" value="牛魔王"/>
        <property name="skill" value="芭蕉扇"/>
    </bean>
public class SpringBeanTest {
    @Test
    public void getMonster() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");

        //第一种
        //Object monster01 = ioc.getBean("monster01");
        Monster monster01 = (Monster) ioc.getBean("monster01");
        System.out.println(monster01);

        //第二种
        Monster monster011 = ioc.getBean("monster01", Monster.class);
        System.out.println(monster011);


        //类加载路径
        //D:\Atest\spring\out\production\spring
        File file = new File(this.getClass().getResource("/").getPath());
        System.out.println(file);

    }

分析

beanDefinitionMap 

table存放bean对象信息

ConcurrentHashMap$Node 

singletonObjects

真正创建的对象

beanDefinitionNames

先在beanDefintionMap中查找,再判断是否单例,是的话在单例池中找到返回,否则通过反射创建再返回

实现简单基于XML配置程序

public class HspApplicationContext {
    private ConcurrentHashMap<String,Object> singletonObejcts = new ConcurrentHashMap();
    public HspApplicationContext(String iocBeanXmlFile) throws Exception {
        //加载类路径
        String path = this.getClass().getResource("/").getPath();
        SAXReader reader = new SAXReader();
        //得到Document对象
        Document document = reader.read(path + iocBeanXmlFile);
        //得到rootDocument
        Element rootElement = document.getRootElement();
        Element bean = (Element) rootElement.elements("bean").get(0);
        //获取第一个bean的 id 和 全路径
        String id = bean.attributeValue("id");
        String classFullPath = bean.attributeValue("class");

        //获取第一个bean的属性
        List<Element> property = bean.elements("property");
        Integer monsterId = Integer.parseInt(property.get(0).attributeValue("value"));
        String name = property.get(1).attributeValue("value");
        String skill = property.get(2).attributeValue("value");

        //使用反射创建对象,属性赋值
        Class<?> cls = Class.forName(classFullPath);
        Monster o = (Monster)cls.newInstance();
        o.setId(monsterId);
        o.setName(name);
        o.setSkill(skill);

        //创建好的对象放入单例池
        singletonObejcts.put(id, o);
    }

    public Object getBean(String id) {
        return singletonObejcts.get(id);
    }
}

Spring原生容器底层结构 

注意

bean不带id,系统会默认分配id,分配id的规则是 全类名#0, 全类名#1 这样的规则来分配id

<bean class="spring.bean.Monster">
</bean>

<bean class="spring.bean.Monster">
</bean>
Monster monster01 = ioc.getBean("spring.bean.Monster#0", Monster.class);

 Spring管理Bean - IOC

基于XML配置Bean

通过id获取bean

<bean class="spring.bean.Monster" id="monster01">
</bean>
Monster monster011 = ioc.getBean("monster01", Monster.class);

通过类型获取bean

    <bean class="spring.bean.Monster">
        <property name="Id" value="100"/>
        <property name="name" value="牛魔王"/>
        <property name="skill" value="芭蕉扇"/>
    </bean>
public void getBeanByType() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster bean = ioc.getBean(Monster.class);
        System.out.println(bean);
    }

要求ioc容器中的同一个类的bean只能有一个

应用场景:比如XxxAction/Servlet/Controller, 或 XxxService 在一个线程中只需要一个对象实例(单例)的情况

通过构造器配置bean

老师解读
    1. constructor-arg标签可以指定使用构造器的参数
    2. index表示构造器的第几个参数 从0开始计算的
    3. 除了可以通过index 还可以通过 name / type 来指定参数方式
    4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定
    -->

    <bean id="monster03" class="spring.bean.Monster">
        <constructor-arg value="200" index="0"/>
        <constructor-arg value="白骨精" index="1"/>
        <constructor-arg value="吸人血" index="2"/>
    </bean>

    <bean id="monster04" class="spring.bean.Monster">
        <constructor-arg value="200" name="monsterId"/>
        <constructor-arg value="白骨精" name="name"/>
        <constructor-arg value="吸人血" name="skill"/>
    </bean>


    <bean id="monster05" class="spring.bean.Monster">
        <constructor-arg value="300" type="java.lang.Integer"/>
        <constructor-arg value="白骨精~" type="java.lang.String"/>
        <constructor-arg value="吸人血~" type="java.lang.String"/>
    </bean>

通过p名称空间配置bean

    //将光标放在p , 输入alt+enter , 就会自动的添加xmlns
    <bean class="spring.bean.Monster" id="monster01"
          p:id="100"
          p:name="红孩儿"
          p:skill="吐火"
    />

引入/注入bean对象

service层引用dao层

通过ref来配置bean

service层

public class MemberServiceImpl {

    private MemberDAOImpl memberDAO;

    public MemberServiceImpl() {
        System.out.println("MemberServiceImpl() 构造器被执行");
    }

    public MemberDAOImpl getMemberDAO() {return memberDAO;}

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

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

dao层

public class MemberDAOImpl {
    public MemberDAOImpl() {
        System.out.println("MemberDAOImpl 构造器被执行...");
    }
    
    public void add() {

        System.out.println("MemberDAOImpl add()方法被执行");
    }
}
    <!--
        1. ref="memberDAO"表示  MemberServiceImpl对象属性memberDAO引用的对象是id=memberDAO
        的对象
        2. 这里就体现出spring容器的依赖注入
        3. 注意再spring容器中, 他是作为一个整体来执行的, 即如果你引用到一个bean对象, 对你配置的顺序没有要求
        4. 建议还是按顺序,好处是阅读的时候,比较方便
    -->
    <bean class="spring.dao.MemberDAOImpl" id="memberDAO"/>

    <bean class="spring.service.MemberServiceImpl" id="memberService">
        <property name="memberDAO" ref="memberDAO"/>
    </bean>
通过内部Bean来配置属性

name是MemberServiceImpl类里面的属性

<bean class="spring.service.MemberServiceImpl" id="memberService">
        <property name="memberDAO">
            <bean class="spring.dao.MemberDAOImpl"/>
        </property>
</bean>

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

    <!--配置Master-->
    <bean class="spring.bean.Master" id="master">
        <property name="name" value="太上老君"/>
        <!--对List属性进行配置-->
        <property name="monsterList">
            <list>
                <!--引入其他bean-->
                <ref bean="monster01"/>
                <ref bean="monster02"/>
                <!--内部bean-->
                <bean class="spring.bean.Monster">
                    <property name="name" value="老鼠精"/>
                    <property name="Id" value="100"/>
                    <property name="skill" value="吃粮食"/>
                </bean>
            </list>
        </property>
        <!--对Map属性进行配置-->
        <property name="monsterMap">
            <map>
                <entry>
                    <key>
                        <value>monster01</value>
                    </key>
                    <ref bean="monster01"/>
                </entry>
                <entry>
                    <key>
                        <value>monster02</value>
                    </key>
                    <ref bean="monster02"/>
                </entry>
            </map>
        </property>
        <!--给set属性赋值-->
        <property name="monsterSet">
            <set>
                <ref bean="monster01"/>
                <ref bean="monster02"/>
            </set>
        </property>
        <!--
            给数组属性赋值
            array标签中使用 value 还是 bean , ref .. 要根据你的业务决定
        -->
        <property name="monsterName">
            <array>
                <value>小妖怪</value>
                <value>大妖怪</value>
            </array>
        </property>

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


    <bean class="spring.bean.Monster" id="monster01"
          p:id="100"
          p:name="红孩儿"
          p:skill="吐火"
    />
    <bean class="spring.bean.Monster" id="monster02"
          p:id="101"
          p:name="红孩儿"
          p:skill="吐水"
    />

使用util:list进行配置

普通做法,如果数据共享,太繁琐

   <!--配置Bookstore-->
    <bean class="spring.bean.Bookstore" id="bookstore">
        <property name="bookList">
            <list>
                <value>三国演义</value>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
            </list>
        </property>
    </bean>

使用util:list指定id,直接ref引用过来

    <!--配置Bookstore-->
    <bean class="spring.bean.Bookstore" id="bookstore">
        <property name="bookList" ref="myBookList"/>
    </bean>
    <!--定义util:list-->
    <util:list id="myBookList">
        <value>三国演义</value>
        <value>红楼梦</value>
        <value>西游记</value>
        <value>水浒传</value>
    </util:list>

级联属性赋值

spring的ioc容器可以直接给对象属性的属性赋值

    <bean class="spring.bean.Dept" id="dept"/>
    <bean class="spring.bean.Emp" id="emp">
        <property name="name" value="jack"/>
        <property name="dept" ref="dept"/>
        <!--级联赋值-->
        <property name="dept.name" value="Java开发部门"/>
    </bean>

 通过静态工厂获取对象

xml中可以没有 class = 路径

public class MyStaticFactory {
    private static Map<String, Monster> monsterMap;

    //使用 static代码块 进行初始化
    static  {
        monsterMap = new HashMap<>();
        monsterMap.put("monster01", new Monster(100,"牛魔王","芭蕉扇"));
        monsterMap.put("monster02", new Monster(200,"狐狸精","美人计"));
    }
    //提供一个方法,返回Monster对象
    public static Monster getMonster(String key) {
        return monsterMap.get(key);
    }
}
    <!--配置monster对象,通过静态工厂获取
         1. 通过静态工厂获取/配置bean
         2. class 是静态工厂类的全路径
         3. factory-method 表示是指定静态工厂类的哪个方法返回对象
         4. constructor-arg value="monster02" value是指定要返回静态工厂的哪个对象
    -->
    <bean id="my_monster01"
          class="spring.factory.MyStaticFactory"
          factory-method="getMonster">
        <constructor-arg value="monster02"/>
    </bean>

即使有多个bean,静态工厂获取的对象都是同一个

通过实例工厂获取对象

xml中必须有 class = 路径

public class MyInstanceFactory {
    private Map<String, Monster> monster_map;

    //通过普通代码块进行初始化
    {
        monster_map = new HashMap<>();
        monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));
        monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));
    }

    //写一个方法返回Monster对象
    public Monster getMonster(String key) {
        return monster_map.get(key);
    }
}
    <!--配置2个实例工厂对象-->
    <bean class="spring.factory.MyInstanceFactory" id="myInstanceFactory"/>
    <bean class="spring.factory.MyInstanceFactory" id="myInstanceFactory2"/>
    <!--配置monster对象, 通过实例工厂
    老韩解读
    1. factory-bean 指定使用哪个实例工厂对象返回bean
    2. factory-method 指定使用实例工厂对象的哪个方法返回bean
    3. constructor-arg value="monster03" 指定获取到实例工厂中的哪个monster
    -->
    <bean id="my_monster02" factory-bean="myInstanceFactory" factory-method="getMonster">
        <constructor-arg value="monster03"/>
    </bean>

    <bean id="my_monster03" factory-bean="myInstanceFactory2" factory-method="getMonster">
        <constructor-arg value="monster03"/>
    </bean>
ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");        
        Monster monster02 = ioc.getBean("my_monster02", Monster.class);
        Monster monster03 = ioc.getBean("my_monster02", Monster.class);
        System.out.println(monster02 == monster03); //true

        Monster monster3 = ioc.getBean("my_monster03", Monster.class);

        //monster03 和 monster3返回的值都是 monster03

使用同一个容器,调用my_monster02,都是用的同一个实例工厂对象
(factory-bean="myInstanceFactory"),只要它不变化,构建的就是同一个对象


可以有多个实例工厂,那么即使值一样,但不是同一个对象

通过FactoryBean获取对象 

public class MyFactoryBean implements FactoryBean<Monster> {

    //这个就是你配置时候,指定要获取的对象对应key
    private String key;
    private Map<String, Monster> monster_map;

    {   //代码块,完成初始化
        monster_map = new HashMap<>();
        monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));
        monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));
    }

    public void setKey(String key) {
        this.key = key;
    }

    @Override
    public Monster getObject() throws Exception {
        return monster_map.get(key);
    }

    @Override
    public Class<?> getObjectType() {
        return Monster.class;
    }

    @Override
    public boolean isSingleton() {//这里指定是否返是单例
        return false;
    }
}
    <!--
        配置monster对象,通过FactoryBean获取
        1. class 指定使用的FactoryBean
        2. key表示就是 MyFactoryBean 属性key
        3. value就是你要获取的对象对应key
    -->
    <bean id="my_monster05" class="spring.factory.MyFactoryBean">
        <property name="key" value="monster04"/>
    </bean>

bean信息重用(继承)

   <!--配置Monster对象-->
    <bean id="monster10" class="spring.bean.Monster">
        <property name="monsterId" value="10"/>
        <property name="name" value="蜈蚣精"/>
        <property name="skill" value="蜇人"/>
    </bean>

    <!--
    1. 配置Monster对象
    2.但是这个对象的属性值和 id="monster10"对象属性一样
    3.parent="monster10" 指定当前这个配置的对象的属性值从 id=monster10的对象来
    -->

    <bean id="monster11"
          class="spring.bean.Monster"
          parent="monster10"/>

    <bean id="monster12" class="spring.bean.Monster" abstract="true">
        <property name="monsterId" value="10"/>
        <property name="name" value="蜈蚣精"/>
        <property name="skill" value="蜇人"/>
    </bean>


    <bean id="monster13"
          class="spring.bean.Monster"
          parent="monster12"/>

1. 如果bean指定了 abstract="true", 表示该bean对象, 是用于被继承
2. 本身这个bean就不能被获取/实例化

Bean创建顺序 

默认按照配置的顺序创建Bean对象

 

 如果将两个bean顺序交换

先都创建好,再执行Service里的set方法,完成引用

Bean的单例和多例

  <!--配置Cat对象
        1. 在默认情况下 scope属性是 singleton
        2. 在ioc容器中, 只要有一个这个bean对象
        3. 当程序员执行getBean时, 返回的的是同一个对象
        4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope="prototype"
        5. 如果bean的配置是 scope="singleton" lazy-init="true" 
            这时,ioc容器就不会提前创建该对象, 
            而是当执行getBean方法的时候,才会创建对象
    -->
    <bean id="cat" class="spring.bean.Cat" scope="prototype" lazy-init="false">
        <property name="id" value="100"/>
        <property name="name" value="小花猫"/>
    </bean>
细节

Bean的生命周期

 

 创建javaBean对象(House),自己写init方法,desrtoy方法,名字自己定义

    <!--配置House对象,演示整个Bean的生命周期
    老师解读
    1. init-method="init" 指定bean的初始化方法 , 在setter方法后执行
    2. init方法执行的时机,由spring容器来控制
    3. destroy-method="destroy" 指定bean的销毁方法, 在容器关闭的时候执行
    4. destroy方法执行的时机,有spring容器来控制
    -->
    <bean class="spring.bean.House" id="house"
          init-method="init"
          destroy-method="destroy">
        <property name="name" value="北京豪宅"/>
    </bean>
close关闭 

 配置bean的后置处理器

bean初始化方法

作用

对ioc容器中所有的对象进行统一处理
如果类型是House的统一改成上海豪宅


/**
 * 这是一个后置处理器, 需要实现 BeanPostProcessor接口
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     * 什么时候被调用: 在Bean的init方法前被调用
     * @param bean 传入的在IOC容器中创建/配置Bean
     * @param beanName 传入的在IOC容器中创建/配置Bean的id
     * @return Object 程序员对传入的bean 进行修改/处理【如果有需要的话】 ,返回
     * @throws BeansException
     */

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization().. bean="
                + bean + " beanName=" + beanName);

        //初步体验案例: 如果类型是House的统一改成 上海豪宅
        //对多个对象进行处理/编程==>切面编程
        if(bean instanceof House) {
            ((House)bean).setName("上海豪宅~");
        }
        return null;
    }

    /**
     * 什么时候被调用: 在Bean的init方法后被调用
     * @param bean  传入的在IOC容器中创建/配置Bean
     * @param beanName 传入的在IOC容器中创建/配置Bean的id
     * @return 程序员对传入的bean 进行修改/处理【如果有需要的话】 ,返回
     * @throws BeansException
     */

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization().. bean="
                + bean + " beanName=" + beanName);
        return bean;
    }
}
    <!--配置House对象-->
    <bean class="com.hspedu.spring.bean.House" id="house"
          init-method="init"
          destroy-method="destroy">
        <property name="name" value="大豪宅"/>
    </bean>

    <bean class="com.hspedu.spring.bean.House" id="house02"
          init-method="init"
          destroy-method="destroy">
        <property name="name" value="香港豪宅"/>
    </bean>

    <!--配置了一个Monster对象-->

    <!--配置后置处理器对象
    1. 当我们在beans02.xml 容器配置文件 配置了 MyBeanPostProcessor
    2. 这时后置处理器对象,就会作用在该容器创建的Bean对象
    3. 已经是针对所有对象编程->切面编程AOP
    -->
    <bean class="spring.bean.MyBeanPostProcessor" 
        id="myBeanPostProcessor"/>

@Test
    public void testBeanPostProcessor() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans02.xml");

        House house = ioc.getBean("house", House.class);
        System.out.println("使用house=" + house);

        House house02 = ioc.getBean("house02", House.class);
        System.out.println("使用house02=" + house02);

        ((ConfigurableApplicationContext)ioc).close();

    }

 

  通过属性文件配置Bean

在src目录下新建xx.properties

my.properties

monsterId=1000
name=jack
skill=hello

 如果v是中文,可以转成unicode编码

    <!--
        文件提示修改成 all problems,引入namespace
        location="classpath:my.properties" 表示指定属性文件的位置
    -->
    <context:property-placeholder location="classpath:my.properties"/>


    <!--
        通过属性文件给monster对象的属性赋值
        属性名通过${属性名},属性名就是my.properties文件中k=v的k
    -->
    <bean class="spring.bean.Monster" id="monster100">
        <property name="id" value="${monsterId}"/>
        <property name="name" value="${name}"/>
        <property name="skill" value="${skill}"/>
    </bean>

自动装配

DAO层

public class OrderDao {
    //方法。。。
    public void saveOrder() {
        System.out.println("保存 一个订单...");
    }
}

Service层

public class OrderService {
    //OrderDao属性
    private OrderDao orderDao;

    //getter
    public OrderDao getOrderDao() {
        return orderDao;
    }
    //setter
    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }
}

Controller层

public class OrderAction {
    //属性OrderService
    private OrderService orderService;

    //getter
    public OrderService getOrderService() {
        return orderService;
    }

    //setter
    public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }
}

xml

    <!--配置OrderDao对象-->
    <bean class="spring.dao.OrderDao" id="orderDao"/>
    <!--配置OrderService对象
        1. autowire="byType" 表示 在创建 orderService时
           通过类型的方式 给对象属性 自动完成赋值/引用
        2. 比如OrderService 对象有 private OrderDao orderDao
        3. 就会在容器中去找有没有 OrderDao类型对象
        4. 如果有,就会自动的装配, 老师提示如果是按照 byType 方式来装配, 这个容器中,不能有两个
          的OrderDao类型对象
        5. 如果你的对象没有属性,  autowire就没有必要写
        6. 其它类推..

        7. 如果我们设置的是 autowire="byName" 表示通过名字完成自动装配
        8. 比如下面的 autowire="byName" class="com.hspedu.spring.service.OrderService"
           1) 先看 OrderService 属性 private OrderDao orderDao
           2) 再根据这个属性的setXxx()方法的 xxx 来找对象id
           3) public void setOrderDao() 就会找id=orderDao对象来进行自动装配
           4) 如果没有就装配失败

    -->
    <bean autowire="byName" class="spring.service.OrderService"
          id="orderService"/>

    <!--配置OrderAction-->
    <bean autowire="byName" class="spring.web.OrderAction" id="orderAction"/>

使用byName装配,id名要与set方法名一致

在OrderAction类中,setOrderService方法名更改, class="spring.service.OrderService"的id也要更改,根据方法名找对象id

EL表达式

@Data
public class SpELBean {

    private String name;
    private Monster monster;
    private String monsterName;
    private String crySound; //叫声
    private String bookName;
    private Double result;


    //cry 方法会返回字符串
    public String cry(String sound) {
        return "发出 " + sound + "叫声...";
    }

    //read 返回字符串
    public static String read(String bookName) {
        return "正在看 " + bookName;
    }
}

xml

    <!--配置一个monster对象-->
    <bean id="monster01" class="spring.bean.Monster">
        <property name="monsterId" value="100"/>
        <property name="name" value="蜈蚣精~"/>
        <property name="skill" value="蜇人~"/>
    </bean>

    <!-- spring el 表达式使用
     老师解读
     1. 通过spel给bean的属性赋值
     -->
    <bean id="spELBean" class="spring.bean.SpELBean">
        <!-- sp el 给字面量 -->
        <property name="name" value="#{'韩顺平教育'}"/>
        <!-- sp el 引用其它bean -->
        <property name="monster" value="#{monster01}"/>
        <!-- sp el 引用其它bean的属性值 -->
        <property name="monsterName" value="#{monster01.name}"/>
        <!-- sp el 调用普通方法(返回值)  赋值 -->
        <property name="crySound" value="#{spELBean.cry('喵喵的..')}"/>
        <!-- sp el 调用静态方法(返回值) 赋值 -->
        <property name="bookName" value="#{T(com.hspedu.spring.bean.SpELBean).read('天龙八部')}"/>
        <!-- sp el 通过运算赋值 -->
        <property name="result" value="#{89*1.2}"/>
    </bean>

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

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

相关文章

Unity数据持久化 之 向文件流读写(详细Plus版)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 在 Unity 手册中&#xff0c;FileStream 并没有单独的详细介绍&#xff0c;因为它是 .NET 框架的一部分&#xff0c;…

已经存在的项目如何变成git的一个repository

已经存在的项目如何被git管理 背景&#xff1a; 有一套代码很敏感&#xff0c;可能动不动就要不能正常工作(硬件开发常事)&#xff0c;那改动一下下就要有个记录&#xff0c;就决定用git管理 已经有了服务里里docker里运行的gitbucket,已经有了开发用的电脑上的git客户端&…

c++ websocket简单讲解

只做简单讲解。 一.定义和原理 WebSocket 是从 HTML5 开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制&#xff0c;传统的 web 程序都是属于 "⼀问⼀答" 的形式&#xff0c;即客⼾端给服务器发送了⼀个 HTTP 请求&#xff0c;服务器给客⼾端返回⼀个 HTTP 响…

亿发进销存一体化解决方案:多终端无缝协同,赋能企业全业务-上

亿发软件凭借对产品、市场、业务的深入理解&#xff0c;在进销存基础上进行了延伸&#xff0c;推出多终端、一体化的“进销存管理系统”多元产品矩阵。在技术上实现电脑端、手机端、PDA端、零售端、商家版以及小程序商城的多终端无缝对接。各个端口间的数据可以互通互联&#x…

Prometheus Blackbox监控网站

Blackbox Exporter简介 blackbox_exporter 是 Prometheus 拿来对 http/https、tcp、icmp、dns、进行的黑盒监控工具&#xff0c;也就是从服务、主机等外部进行探测&#xff0c;来查看服务、主机等是否可用。 Blackbox Exporter 默认端口是 9115&#xff0c; 安装1 wget htt…

模电-三极管2

学习资料&#xff1a; 12-放大电路的分析方法_4K_哔哩哔哩_bilibili 如何向老奶奶解释数据库 如何向幼儿解释能量守恒 内容有误&#xff0c;无法保证一定正确&#xff0c;请各自深入学习 大学的知识连贯性很强&#xff0c;没有前面的基础&#xff0c;无法对后面的知识进行&a…

2023 ICPC 江西省赛K. Split

K. Split time limit per test: 3 seconds memory limit per test: 512 megabytes You are given a positive integer n and a non-increasing sequence ai of length n , satisfying ∀i∈[1,n−1],. Then, you are given a positive integer m, which represents the tot…

新版英语教材变化,强调应用与素养并重

随着新学期的到来&#xff0c;2024年新版义务教育英语教材正式在全国范围内投入使用&#xff0c;这一变化不仅在教育界引起了广泛关注&#xff0c;也触动了无数家长的心弦。新版教材在内容、难度及教学理念上的全面升级&#xff0c;既为孩子们提供了更广阔的学习空间&#xff0…

STM32智能家居语音系统

简介 基于STM32构建的智能家居语音控制系统&#xff0c;采用ESP8266&#xff08;01s&#xff09;作为关键的WiFi模块。这一系统通过机智云开发平台实现与ESP8266的高效通信&#xff0c;遵循平台规范的协议&#xff0c;确保数据的可靠传输。系统支持WIFI_AIRLINK_MODE&#xff0…

免邀请码下载时代已来临,Xinstall为您保驾护航

在App推广的道路上&#xff0c;邀请码下载一直是一个让人头疼的问题。用户需要输入繁琐的邀请码才能完成下载&#xff0c;这不仅增加了用户的操作难度&#xff0c;也影响了App的推广效果。然而&#xff0c;随着Xinstall的免邀请码下载功能的推出&#xff0c;这一问题终于得到了…

VISION TRANSFORMER ADAPTER FORDENSE PREDICTIONS

总结 提出了一种新范式&#xff1a; 开发了 Vision Transformer Adapter (ViT-Adapter)&#xff0c;通过引入无预训练的适配器将视觉特定的归纳偏差&#xff08;例如局部空间信息&#xff09;引入普通 ViT&#xff0c;适应密集预测任务。 保留 ViT 灵活性&#xff1a; 与设计…

Linux日志-lastlog日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

【动态规划专栏】专题一总结

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

电脑错误mfc140.dll丢失怎么办?mfc140.dll丢失如何修复?

在使用基于Microsoft Visual Studio 2015开发的应用程序时&#xff0c;可能会遇到个别组件影响整体功能的情况&#xff0c;其中“mfc140.dll丢失”错误就是常见的一个技术障碍。这个DLL文件属于Microsoft Foundation Class (MFC) Library&#xff0c;它对Windows应用程序的运行…

基于vue框架的朝阳保险公司营销管理系统0wamc(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,保险信息,保险类型,订单信息,赔偿信息,联系我们,购买指南,到期提醒 开题报告内容 基于Vue框架的朝阳保险公司营销管理系统的开题报告 一、研究背景 随着保险行业的快速发展和市场竞争的日益激烈&#xff0c;传统的管理模式已难以…

恶意代码分析 | Lab1

前言 穿插virus分析的学习&#xff0c;毕竟逆向技术最后要用在攻防中。 Lab1就没必要动态分析了&#xff0c;静态学学写法。 Lab01-01.exe 前面是内存映射技术&#xff0c;对内存进行修改操作。 将Kernel32.dll和Lab01-01.dll的内存都Map出来&#xff0c;便于后续更改&…

有没有性价比高一些的开放式耳机推荐?盘点四款高性价比蓝牙耳机

在正式介绍几款高性价比产品&#xff0c;先来和各位聊聊什么是开放式耳机。开放式耳机是目前比较流行的耳机种类&#xff0c;其特点是通过采用海绵状的微孔发泡塑料制作透声耳垫&#xff0c;不堵塞耳道&#xff0c;使得声音可以泄露&#xff0c;同时佩戴者也能听到外界声音 。 …

民宿酒店预订系统V1.0.8

多门店民宿酒店预订管理系统&#xff0c;快速部署属于自己民宿酒店的预订小程序&#xff0c;包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码&#xff0c;支持私有化部署。 V1.0.8修复房间预订状态无法筛选的问题 修复房间预订状态无法筛选的问题 修复…

为自闭症儿童提供全方位支持的自闭症全托管机构

在自闭症儿童的世界里&#xff0c;每一个细微的进步都凝聚着家庭与社会的无尽努力与期盼。星启帆自闭症儿童康复机构&#xff0c;作为一所致力于为自闭症儿童提供全方位支持的全托管机构&#xff0c;正以其专业的服务、温馨的环境和全面的康复计划&#xff0c;成为众多家庭信赖…

UE4_后期处理_后期处理材质及后期处理体积二

效果&#xff1a; 步骤&#xff1a; 1、创建后期处理材质,并设置参数。 2、回到主界面&#xff0c;找到需要发光的物体的细节面板。 渲染自定义深度通道&#xff0c;默认自定义深度模具值为10&#xff08;需要修改此值&#xff0c;此值影响物体的亮度&#xff09;。 3、添加…