day05-Spring管理Bean-IOC-03

Spring管理Bean-IOC-03

2.基于XML配置bean

2.15bean的生命周期

bean对象的创建是由JVM完成的,然后执行如下方法:

  1. 执行构造器
  2. 执行set相关方法
  3. 调用bean的初始化方法(需要配置)
  4. 使用bean
  5. 容器关闭时,调用bean的销毁方法(需要配置)

例子

House:

package com.li.bean;

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

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("House setName()=" + name);
        this.name = name;
    }

    //说明:初始化方法是自定义的,名字随意,只要配置的时候指定名称就行了
    public void init() {
        System.out.println("House init() 被执行...");
    }

    //说明:销毁的方法是也自定义的,名字随意
    public void destroy() {
        System.out.println("House destroy() 被执行...");
    }
}

beans.xml:

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

测试方法:

//测试bean的生命周期
@Test
public void testBeanLife() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    House house = ioc.getBean("house", House.class);
    System.out.println("使用house=" + house);

    //关闭容器
    // 1.ioc的编译类型 ApplicationContext ,运行类型 ClassPathXmlApplicationContext
    // 2.因为 ClassPathXmlApplicationContext 实现了接口 ConfigurableApplicationContext
    // 3.而ConfigurableApplicationContext接口有 close方法
    // 4.因此将ioc转成 ConfigurableApplicationContext 类型,调用close方法,关闭容器
    ((ConfigurableApplicationContext)ioc).close();
}
image-20230118165712355

使用细节:

  1. 初始化方法和销毁方法由程序员自定义(包括方法名称,在配置bean的时候指定即可)
  2. 销毁方法只有当关闭容器时才会被调用

2.16配置bean的后置处理器

  1. 在spring的ioc容器,可以配置bean的后置处理器(后置处理器其实就是一个java对象)
  2. 该处理器会在bean 初始化方法调用前 和 初始化方法调用后 被调用
  3. 程序员可以在后置处理器中编写自己的业务代码

例子

1.House类(见2.15),该方法设置了构造函数,bean初始化方法等

2.创建后置处理器MyBeanPostProcessor:

后置处理器需要实现BeanPostProcessor接口,该接口中有两个重要的方法,对应我们之前说的 “初始化方法调用前和初始化方法调用后被调用”

package com.li.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author 李
 * @version 1.0
 * 这是一个后置处理器,必须实现接口 BeanPostProcessor
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
     * 调用时机:在Bean初始化方法前被调用(bean没有配置初始化方法,此方法也会被调用)
     *
     * @param bean     传入 在IOC容器中创建/配置的Bean
     * @param beanName 在IOC容器中创建/配置的Bean的id
     * @return Object 返回 bean(返回前程序员可以对bean进行修改/处理,再返回)
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization()被调用..." +
                "bean=" + bean + " beanName=" + beanName);
        return bean;
    }

    /**
     * 调用时机:在Bean初始化方法后被调用(bean没有配置初始化方法,此方法也会被调用)
     *
     * @param bean     传入 在IOC容器中创建/配置的Bean
     * @param beanName 在IOC容器中创建/配置的Bean的id
     * @return Object 返回 bean(返回前程序员可以对bean进行修改/处理,再返回)
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization()被调用..." +
                "bean=" + bean + " beanName=" + beanName);
        return bean;
    }
}

3.beans02.xml:

因为后置处理器对象会作用在容器配置文件的所有bean对象中,因此这里新创建一个容器文件beans02.xml,为了输出干净,该配置文件中只配置了house一个bean对象

<!--配置House对象-->
<bean class="com.li.bean.House" id="house"
      init-method="init" destroy-method="destroy">
    <property name="name" value="海景大豪宅"/>
</bean>

<!--配置后置处理器对象
    1.当我们在beans02.xml容器配置文件 配置了MyBeanPostProcessor后
    2.该后置处理器对象,就会作用在该容器文件的所有Bean对象中
-->
<bean class="com.li.bean.MyBeanPostProcessor" id="myBeanPostProcessor"/>

4.测试方法:

//测试bean的后置处理器
@Test
public void testBeanPostProcessor() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");
    House house = ioc.getBean("house", House.class);
    System.out.println("使用house=" + house);
    //关闭容器
    ((ClassPathXmlApplicationContext)ioc).close();
}

输出如下:postProcessBeforeInitialization()和postProcessAfterInitialization()方法分别在bean的初始化方法前后调用

image-20230118174535499

细节说明:

  1. 怎么执行到这个方法?==>使用AOP(反射+动态代理+IO+容器+注解)
  2. 有什么用?==>可以对IOC容器中所有对象进行统一处理,如:日志处理/权限校验/安全的验证/事务管理
  3. 针对容器的所有对象吗? 是的==>切面编程特点

后置处理器是一个比较难理解的知识点,后面会实现这个机制,深入理解

2.17通过属性文件给bean注入值

在spring的ioc容器中,可以通过属性文件给bean注入值

例子

1.在src目录下创建my.properties文件

monsterId=1000
name=jack
skill=hello

2.在beans.xml中配置:

使用配置文件的方式需要引入命名空间:

image-20230118182107473
<!--指定属性文件
    1.注意要引入命名空间才能使用
    2.location="classpath:my.properties" 表示指定属性文件的位置
        (注意需要带上"classpath")
    3.这时我们的属性值通过${属性名} 获取
    4.这里的属性名就是my.properties中的 key
    -->
<context:property-placeholder location="classpath:my.properties"/>

<!--配置Monster对象
    通过属性文件给Monster对象赋值-->
<bean class="com.li.bean.Monster" id="monster1000">
    <property name="monsterId" value="${monsterId}"/>
    <property name="name" value="${name}"/>
    <property name="skill" value="${skill}"/>
</bean>

3.测试:

//通过属性文件给bean属性赋值
@Test
public void setBeanByFile() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    Monster monster1000 = ioc.getBean("monster1000", Monster.class);
    System.out.println("monster1000=" + monster1000);
}
image-20230118183405855

注意:如果properties文件中的value是中文,会出现乱码,需要将中文转为unicode编码:

image-20230118183938938

2.18基于XML的bean自动装配

在spring的ioc容器中,可以实现自动装配bean

例子

1.OrderDAO

package com.li.dao;

/**
 * @author 李
 * @version 1.0
 * 这是一个DAO类
 */
public class OrderDAO {
    public void saveOrder() {
        System.out.println("保存一个订单...");
    }
}

2.OrderService

package com.li.service;

import com.li.dao.OrderDAO;

/**
 * @author 李
 * @version 1.0
 * 这是一个Service类
 */
public class OrderService {
    //OrderDAO属性
    private OrderDAO orderDAO;

    //getter
    public OrderDAO getOrderDAO() {
        return orderDAO;
    }

    //setter
    public void setOrderDAO(OrderDAO orderDAO) {
        this.orderDAO = orderDAO;
    }
}

3.OrderServlet:

package com.li.web;

import com.li.service.OrderService;

/**
 * @author 李
 * @version 1.0
 * Servlet即 Controller
 */
public class OrderServlet {
    //属性OrderService
    private OrderService orderService;

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

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

4.beans.xml:

  • autowire="byType"方式
<!--配置OrderDAO对象-->
<bean class="com.li.dao.OrderDAO" id="orderDAO"/>

<!--配置OrderService对象
    1. 属性 autowire="byType" 表示在创建OrderService时,
       通过类型的方式,给对象的属性自动完成赋值/引用
    2. 比如OrderService对象有private OrderDAO属性,就会在容器中找有没有OrderDAO类型的对象
       如果有,就会自动进行装配(按照类型的方式来装配时,那么该容器中不能有超过一个OrderService对象)
-->
<bean autowire="byType" class="com.li.service.OrderService" id="orderService"/>

<!--配置OrderServlet对象,同理-->
<bean autowire="byType" class="com.li.web.OrderServlet" id="orderServlet"/>
  • 使用autowire="byName"方式
<!--配置OrderDAO对象-->
<bean class="com.li.dao.OrderDAO" id="orderDAO"/>

<!--配置OrderService对象
   3.如果设置的是 autowire="byName" 表示通过名字完成自动装配
     比如下面的 autowire=" byName" class="com.li.service.OrderService"
    (1)spring会按照 OrderService对象的属性(如orderDAO)
    (2)找到这个属性的setXxx()方法的Xxx名称,在容器中找到相同id的对象来进行自动装配
    (3)例如我们的orderService对象中有一个setOrderDAO(),就会找id="orderDAO"的对象来进行自动装配
    (4)如果没有就装配失败
-->
<bean autowire="byName" class="com.li.service.OrderService" id="orderService"/>

<!--配置OrderServlet对象,同理-->
<bean autowire="byName" class="com.li.web.OrderServlet" id="orderServlet"/>

注意:autowire="byName"不是通过对象属性名来找到要自动装配的对象的,而是通过setXxx方法的名称来找,因为底层是反射实现的。因此如果对象的属性的setXxx方法的名称改变了,被自动装配的对象id也要随之改变

5.测试类:

//基于XML的bean自动装配
@Test
public void setBeanByAutowire() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");
    OrderServlet orderServlet = ioc.getBean("orderServlet", OrderServlet.class);
    //验证是否自动装配上了OrderService
    System.out.println(orderServlet.getOrderService());
    //验证是否自动装配上了OrderDAO
    System.out.println(orderServlet.getOrderService().getOrderDAO());
}

可以看到orderServlet的orderService属性,以及属性的属性orderDAO成功装载了:(autowire="byType"/"byName"方式)

image-20230118193845625

2.19Spring EL表达式

非重点,了解即可

  1. Spring Expression Language,Spring表达式语言,简称SpEL。支持运行时查询并可以操作对象。
  2. 和 JSP的EL表达式一样,SpEL根据Javabean风格的getXxx()、setXxx()方法定义的属性访问对象
  3. SpEL使用#{}作为定界符,所有在大括号中的字符都将被认为是SpEL表达式

应用实例

SpELBean:

package com.li.bean;

/**
 * @author 李
 * @version 1.0
 */
public class SpELBean {
    private String name;
    private Monster monster;
    private String monsterName;
    private String crySound;
    private String bookName;
    private Double result;

    public SpELBean() {
    }

    public String getName() {
        return name;
    }

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

    public Monster getMonster() {
        return monster;
    }

    public void setMonster(Monster monster) {
        this.monster = monster;
    }

    public String getMonsterName() {
        return monsterName;
    }

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

    public String getCrySound() {
        return crySound;
    }

    public void setCrySound(String crySound) {
        this.crySound = crySound;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Double getResult() {
        return result;
    }

    public void setResult(Double result) {
        this.result = result;
    }

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

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

    @Override
    public String toString() {
        return "SpELBean{" +
                "name='" + name + '\'' +
                ", monster=" + monster +
                ", monsterName='" + monsterName + '\'' +
                ", crySound='" + crySound + '\'' +
                ", bookName='" + bookName + '\'' +
                ", result=" + result +
                '}';
    }
}

配置beans03.xml:

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

<!--spring el 表达式使用-通过sp el给bean的属性赋值-->
<bean class="com.li.bean.SpELBean" id="spELBean">
    <!--sp el 给字面量-->
    <property name="name" value="#{'一只猫猫'}"/>
    <!--sp el 引用其他 bean(该bean要存在)-->
    <property name="monster" value="#{monster01}"/>
    <!--sp el 引用其他 bean 的属性值-->
    <property name="monsterName" value="#{monster01.name}"/>
    <!--sp el 调用普通方法,将该方法的返回值赋给 bean对象的属性-->
    <property name="crySound" value="#{spELBean.cry('喵喵喵')}"/>
    <!--sp el 调用静态方法,将该方法的返回值赋给 bean对象的属性
        注意:需要写上类全路径-->
    <property name="bookName" value="#{T(com.li.bean.SpELBean).read('红楼梦')}"/>
    <!--sp el 通过运算赋值-->
    <property name="result" value="#{89*1.0+33/3}"/>
</bean>

测试类:

//通过spring el 对属性赋值
@Test
public void setBeanBySpel() {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("beans03.xml");
    SpELBean spELBean = ioc.getBean("spELBean", SpELBean.class);
    System.out.println(spELBean);
}
image-20230118211255129 image-20230118211301603
本文转载于网络 如有侵权请联系删除

相关文章

  • 实习笔记:java页面的增删改查,分页,模糊查询

    实习笔记这是实习水了好几天来第一次被安排的任务,写一个个人用户中心模块的增删改查,我大概花了三天写完,离谱。。这里做一些笔记吧。 首先公司项目的技术是,springboot,前端用的springboot的内置模板Freemarker,但不是jsp页面,全是html和ftl页面,前后端交互的数据通过ajax请求来交互,前端ui用的layui框架 后端的话使用的是原生的jdbc对应的springtemplate来进行增删改查,分别controller,service,dao三层,并且将接口省去了,确实方便很多。。。。 我的任务就是对一个页面进行增删改查,如下图:layui的官方网站引入layui:https://www.layuicdn.com/#Layuilayui开发文档:https://www.layui.site/doc/index.htm在线演示layui组件:https://www.layui.site/demo/index.htmlayui的cdn引入模板<!DOCTYPEhtml> <htmllang="en"> <head

  • 电商商家后台数据中心产品设计指南

    数据统计是每个电商商家端后台的必备功能模块之一,作为产品经理,如何规划和设计相关的数据产品呢?本文主要结合某电商后台的案例,分享B端产品数据中心的设计思路。一、商家对数据的诉求商家后台的用户群体是个人或企业店主,最核心的需求是店铺装修、商品管理、物流发货、财务对账等B端产品功能,为什么都要包括数据中心的模块呢?商家最想知道自己在这个平台的销售情况,每天有多少订单,多少销售额,多少利润,现在商家会在多个平台开店,知道平台的销售能力,才会更合理的分配资源和人力什么商品好卖,哪些商品滞销?购买商品的客户都是什么类型,地区、性别、年龄几何?进入自己店铺的用户,都是从哪些渠道什么方式进来的?首页还是搜索哪个关键词同行哪些商品热销,是否需要扩充品类、补货跟进 二、某电商商家后台数据中心产品分析当看到这个平台的商家数据中心的时候还是有点意外的,毕竟对于一个市值近2000亿美元,日活2亿+,商家千万+的电商平台,商家端数据中心的功能还是略显简陋的,后来想想,可能是一个强业务流程的B端产品(非数据产品)兼任设置的数据模块吧。整个数据中心包括:经营总览、商品数据、交易数据、流量数据、服务数据五大模块,指标

  • dotnet C# 给结构体字段赋值非线程安全

    在dotnet运行时中,给引用对象进行赋值替换的时候,是线程安全的。给结构体对象赋值,如果此结构体是某个类的成员字段,那么此赋值不一定是线程安全的。是否线程安全,取决于结构体的大小,取决于此结构体能否在一次原子赋值内完成大家都知道,某个执行逻辑如果是原子逻辑,那么此逻辑是线程安全的。原子逻辑就是一个非A即B的状态的变更,绝对不会存在处于A和B中间的状态。满足于此即可称为线程安全,因为线程不会读取到中间状态。在dotnet运行时里面,特别对了引用对象,也就是类对象的赋值过程进行了优化,可以让对象的赋值是原子的从运行时的逻辑上,可以了解到的是引用对象的赋值本质上就是将新对象的引用地址赋值,对象引用地址可以认为是指针。在单次CPU运算中可以一次性完成,不会存在只写入某几位而还有某几位没有写入的情况大概可以认为在x86上,单次的原子赋值长度就是32位。这也就是为什么dotnet里面的对象地址设计为32位的原因但是对于结构体来说,需要分为两个情况,定义在栈上的结构体,如某个方法的局部变量或参数是结构体,此时的结构体是存放在栈上的,而在dotnet里面,每个线程都有自己独立的栈,因此放在栈上的结构

  • 智能合约安全之算术精度问题

    Solidity特性Solidity作为一门编程语言也具备和普通编程语言相似的数据结构设计,比如:变量、常量、函数、数组、函数、结构体等等。在使用Solidity开发智能合约时,你会发现Solidity和普通编程语言有一个较大的区别——Solidity没有浮点型,且Solidity所有的数值运算结果都只会是整数,不会出现小数的情况,同时也不允许定义小数类型数据。算术精度概述很多读者,都会好奇,仅仅一个不支持浮点型会有多大的问题,运算还不是照常进行吗?确实是这样的,但是,结果却和你最初的预想的多少有出入。我们最常见的运行操作,莫过于一下四种:加 减 乘 除PS:这里暂不算“取余”操作,且在Solidity中同样不支持取余操作。运算符的优先级在这里,我们先简单的了解一下运算符的优先级顺序(只讨论+、-、*、/、()): 同级概念在加、减、乘、除运算中,加法、减法属于同一级别运算,乘法、除法属于同一级别运算同级运算从左到右依次运算,例如:d=a+b-c;复制这里的运算顺序为:先计算a与b的和,之后再用运算结果与c做差,然后将最终的结果赋值给d。同样,乘法和除法也是一样的:d=a*b/c;复制

  • 使用OpenCV进行模糊检测(拉普拉斯算子)

    本文翻译自光头哥哥的博客:【BlurdetectionwithOpenCV】。 本文仅作学习分享,原文链接:https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/复制这只超可爱、超活跃家养小猎犬可能是有史以来拍照次数最多的狗。从8周大我们得到它的时候,到现在,不到3年的时间,我们已经收集了6000多张狗狗的照片。 在刚刚过去的这个周末,我坐下来,试图整理手机里大量的照片。这是一项艰巨的任务,而且我很快就注意到一个问题——有很多照片模糊程度过高。现在,对于一般人来说,我认为他们会删除这些模糊的照片(或者至少将它们移到一个单独的文件夹中)——但作为一个计算机视觉科学家,这是不可能发生的。相反,我编写了一个快速的Python脚本,用OpenCV执行模糊检测。接下来,我将向你展示如何使用OpenCV、Python和Laplacian算子计算图像中的模糊量。在这篇文章的结尾,你将能够应用Laplacian方法到你自己的照片来检测模糊的程度。拉普拉斯变换的方差 图1:用Laplacian算子卷积输入图像在研究如何检测

  • Scrapy爬虫及案例剖析

    由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据。针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通过爬虫技术我们可以快速获取我们需要的数据。但是在这爬虫过程中,信息拥有方会对爬虫进行反爬处理,我们就需要对这些困难进行逐个击破。刚好前段时间做了爬虫相关的工作,这里就记录下一些相关的心得。本文案例代码地址https://github.com/yangtao9502/ytaoCrawl这里我是使用的Scrapy框架进行爬虫,开发环境相关版本号:Scrapy:1.5.1 lxml:4.2.5.0 libxml2:2.9.8 cssselect:1.0.3 parsel:1.5.1 w3lib:1.20.0 Twisted:18.9.0 Python:3.7.1(default,Dec102018,22:54:23)[MSCv.191564bit(AMD64)] pyOpenSSL:18.0.0(OpenSSL1.1.1a20Nov2018) cryptography:2.4.2 Platform:Window

  • Springboot之AbstractApplicationEventMulticaster

     Springboot的版本2.0.9.release,对应的SpringFramework值5.0.x.release。    AbstractApplicationEventMulticaster并不是Springboot里面的,而是属于SpringFramework的。                                           图1  如上图1所示,AbstractApplicationEventMulticaster继承了BeanFactoryAware,用于获取BeanFactory;ApplicationEventMulticaster则包含增加、删除ApplicationListener的接口方法,支持对象和String类型的bean名称。  一开始以为AbstractApplicationEventMulticaster应该有个List<ApplicationListener>的属性用于存放加入其中的ApplicationListener,但是看了源码之后,发现Spring考虑的更周全、考虑的情况更多。List-1publicabs

  • 愚人节防骗?你需要一本《2018反欺诈白皮书》

    经腾讯110及腾讯全体黑产研究人员整整一年的努力,内含2018“十大诈骗类型、192种网络诈骗手法”,居家必备童叟无欺的腾讯110《2018反欺诈白皮书》重磅发布啦!下面,请让他二哥用一张图为你解读里面都有什么东东吧!后台回复“白皮书”还可以下载厚达百页的白皮书电子书哦!

  • 如何使用Swift Package Manager那么,让我门开始吧

    SwiftPackageManager是苹果推出的用于创建使用swift的库和可执行程序的工具。SwiftPM有什么作用?能够通过命令快速创建library或者可执行的swift程序,能够跨平台使用,能够使开发出来的项目能够在不同平台上运行。SwiftPM有哪些局限?1、目前只能用来写跨平台的项目,如swift服务端开发,现在的Vapor、Perfect等服务端的web框架均使用SwiftPM来构建和管理依赖。 2、iOS和MacOS目前还未支持,但是后续一定会支持,现在只需要耐心的等待。注意:本文适用于Swift4.1.0版本,后续会有更新,如果里面的demo不能正常运行,请检查版本。那么,让我门开始吧创建一个Package 1、创建文件夹,并进入文件夹$mkdirHello $cdHello复制2、初始化一个名为Hello的package$swiftpackageinit复制会生成以下的文件结构Hello项目的目录结构3、使用命令行编译项目$swiftbuild CompileSwiftModule'Hello'(1sources)复制使用命令行运行test$s

  • 带你解锁蓝牙skill(一)

    蓝牙这个专题,很值得深入研究,但又不是一篇两篇能说的清除,所以决定连载~~~ 不知道能坚持多久 在研究蓝牙源码之前,先来看看蓝牙大致都有什么功能。蓝牙模块支持什么功能完全由蓝牙所支持的蓝牙协议而确定,所以先从蓝牙协议看起1,蓝牙是什么蓝牙是设备间的一种短距离的无线近场通信。对通信距离,通讯速率,频段等都有相关的规定,具体可自行百度百科。生活中最常见的诸如蓝牙耳机,蓝牙音箱,智能家居也有很多蓝牙(但对距离和速率有一定的限制)。可以利用蓝牙从别的手机设备上导入联系人信息可以利用蓝牙进行设备间的文件传输可以利用蓝牙在其他设备上播放媒体音频可以利用蓝牙在其他设备上播放手机音频(蓝牙通话)可以利用蓝牙读取其他设备上的短彩信可以利用蓝牙开启网络共享,共享互联网可以利用蓝牙实现对某个设备的输入控制,比如蓝牙鼠标,蓝牙键盘蓝牙之所以可以实现上述这些功能,是因为在蓝牙中规定了蓝牙协议,来提供一些接口供开发商使用。协议是什么??协议是说在通信过程中设备所遵循的一种规则为了更方便的了解蓝牙是什么,我们就借助蓝牙协议来看一看蓝牙到底能干什么??2,Android各版本与蓝牙profile关系首先明确一下,

  • 数据库时间格式处理

    各位看官可以关注博主个人博客,了解更多信息。 作者:Surpasser 链接地址:https://surpass.org.cn 前言: 本帖对于项目中的数据库的时间进行处理。 正文: 博主在做一个列表的时候从MongoDB中查出来的数据包含有时间格式,在MongoDB数据库中的存放形式为2017-10-2405:18:54.000Z,而对于使用Java查询是String接受的值为TueOct2413:18:54CST2017。 本来的做法是使用第三方工具类hutool-all的DateUtil进行转换。 例如: //数据格式转换 List<AuthLogEntity>resultList=newArrayList<>(); for(AuthLogEntityauthLogEntity:list){//list为mongo查询的数据集合 DatecreateTime=DateUtil.parse(authLogEntity.getCreateTime()); authLogEntity.setCreateTime(DateUtil.formatDateTi

  • sh_05_列表遍历

      sh_05_列表遍历 name_list=["张三","李四","王五","王小二"] #使用迭代遍历列表 """ 顺序的从列表中依次获取数据,每一次循环过程中,数据都会保存在  my_name这个变量中,在循环体内部可以访问到当前这一次获取到的数据 formy_namein列表变量: print("我的名字叫 %s"%my_name) """ formy_nameinname_list: print("我的名字叫 %s"%my_name)复制   作者:俊豪郎 出处:http://www.cnblogs.com/shaohan/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • C#实现在WinCE上播放声音

    此播放音效的方法几乎针对所有Windows系统都通用,废话不多说,直接上代码 usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Runtime.InteropServices; usingSystem.Text; namespaceCabbeenFactory.Service { publicclassVoiceService { ///<summary> ///播放一个音频文件(必须是wav格式) ///</summary> ///<paramname="lpszNameAs">音频文件</param> ///<paramname="ByValhModule"></param> ///<paramname="dwFlagsAs"></param> ///<returns></returns> [DllImport("winmm.d

  • .Net Core 项目发布到Linux - CentOS 7(一)

    由于项目的需求,需要发布到Linux服务器上,在这里记录一下我发布的过程。 安装Linux 安装liunx系统很简单,网上也有很多教程,我是直接使用阿里云的CentOS7.764位 部署环境 Linux-CentOS7安装.NetCore运行环境 发布项目 右键项目->发布->启动->选择文件夹    点击高级设置目标运行时 然后保存发布 把发布好的publish文件放入Linux系统 我这里使用的是Xshell6+WinSCP。Xshell 是一个终端模拟软件,WinSCP 主要功能是本地与服务器之间复制文件。 启动项目 用Xshell6 打开终端窗口,进入linux系统中publish文件夹下,输入命令:dotnet项目的名称.dll     .NETCore默认使用5000端口,可以在Program.cs中创建WebHost对象的时候,使用UseUrls()方法,配置要使用的端口,如下所示: publicclassProgram { publicstaticvoidMain(str

  • ubuntu14.04 源

    http://chenrongya.blog.163.com/blog/static/8747419620143185103297/   注意 sudoapt-getupdate刷新

  • 奈学教育荣获“中关村高新技术企业”认证

    近日,经过一系列严格的审核与评定,奈学教育荣获“中关村高新技术企业”认证,正式迈入高新技术企业行列,成为国家重点支持的具有高成长性的创新型企业。 中关村高新技术企业认证对申报企业在企业研发投入占比、高新技术产品收入占比、科技人员数量、技术创新能力等核心指标方面有着一系列严格的审核评价要求,以及严格的认证程序。高新技术企业的高含金量是对企业实力的一种有力证明,更是对依靠技术立身企业实力上的认可与肯定。 奈学教育自成立以来,一直秉承教育“初心”,构建了从研发工程师到百万架构师的完整课程体系,始终以“让每一个人持续提升职业能力”为使命。在不断变化的市场环境下,奈学教育立足架构师课程体系优势,结合市场人才需求,进一步细分、打磨课程,全面推出高级课程:大数据研发工程师、Java资深研发工程师、数据分析全栈工程师;专家级课程:大数据架构师、P7架构师;大师级课程:百万架构师。 课程在技术“硬实力”提升方面一直广受学员好评,解决了程序员们实际工作、面试以及自学过程中常常遇到且难以解决的问题。在帮助学员们实实在在提升技术的同时,奈学教育也同样关注“软实力”,使个体发挥更大的“

  • docker 安装sqlserver + 踩坑(docker 无法运行sqlserver 容器)

      本文介绍如何在docker中使用sqlserver镜像,运行sqlserver容器,并在容器外部访问sqlserver数据库。本文演示得docker,为windowsdockersdesktop。 一、查找镜像  在dockerhub(https://hub.docker.com/_/microsoft-mssql-server)上找到sqlserver镜像。     二、拉取镜像:   powershell鼠标右键以管理员身份运行,输入官网给出的命令:dockerpullmcr.microsoft.com/mssql/server:2017-latest       三、运行sqlserver数据库容器 运行如下命令,开启容器:dockerrun -e"ACCEPT_EULA=Y"-e"SA_PASSWORD=Fyy@12345678"-p1433:1433 --memory2000M--namesqlserver-dmcr.microsoft.com/mssql/server

  • 06-python opencv 使用摄像头捕获视频并显示

    https://blog.csdn.net/huanglu_thu13/article/details/52337013

  • 从0到1的开发,社交App 完成

    内容概要 GitHub链接:GitHub链接 客户端使用AndroidStudio 服务端使用IDEA+SpringBoot+MyBaits 完成功能添加好友,即时聊天,社交广场 只是一个简版的内容 整体思路 使用Http协议,处理登录注册添加好友请求 使用WebSocket协议,处理及时聊天请求,前端应用OKHttp框架实现 存在的不足 在当时还不了解设计模式和一些基本的代码规范,其实可以用单例去写本地数据库,另外,对于高内聚,低耦合的设计思想在当时还不能彻底的应用,以后在提高效率得问题上,还需要进一步去深入研究。 代码还不够规范,减少各个类之间的依赖。

  • git config配置

    在git中,我们使用gitconfig 命令用来配置git的配置文件,git配置级别主要有以下3类: 1、仓库级别local【优先级最高】 2、用户级别global【优先级次之】 3、系统级别system【优先级最低】 通常: git仓库级别对应的配置文件是当前仓库下的.git/config【在当前目录下.git目录默认是隐藏的,所以在文件管理器中我们要打开显示以藏文件】   git用户级别对应的配置文件是用户宿主目录下的~/.gitconfig【宿主目录:C:\Users\xiong】 git系统级别对应的配置文件是git安装目录下的/etc/gitconfig【但是我的是在D:\ProgramFiles\Git\mingw64\etc目录下】 当然我们可以在cmd命令提示符中输入以下查看配置信息 1、gitconfig--local-l查看仓库配置【必须要进入到具体的目录下,比如要查看TestGit仓库的配置信息】 2、gitconfig--global-l查看用户配置 3、gitconfig--system-l查看系统配置 4、gitconfig-l查

  • 广义坐标与基本假设

    本文转自:https://zhuanlan.zhihu.com/p/133815204   学习理论力学之前,我们需要忘记之前学过的牛顿力学体系,因为这是两个完全不同的研究力学的方法,牛顿力学最核心的东西应该是牛顿第二定律,而理论力学最核心的东西应该是拉格朗日量与最小作用量原理。 Part1:广义坐标    坐标大家都知道是描述力学系统的一个工具,但坐标不仅仅只有用 x,y来描述(笛卡尔坐标系),同时也存在用 r,θ来描述的坐标(极坐标),例如,一个双单摆系统中,可以用其两个摆度来描述此系统。由此,广义坐标的定义就出来了,这种坐标不是仅仅描述角度或者角速度,同时还可以描述电量,温度等。在讲更多之前,我们先申明一点,坐标对时间的导数我们称之为速度,通常用$\frac{\mathrm{d}x}{\mathrm{d}t}$来表示,在物理中我们还可以写成$\dot{x}$。欧克,广义坐标就讲完了,实际上不难,只是将坐标的所属范围扩大了。 Part2:基本假设 2.1拉格朗日量    每个力学系统都有一个“拉格朗日量

相关推荐

推荐阅读