Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【旧】G003Spring学习笔记-IOC之注解方式实现

【旧】G003Spring学习笔记-IOC之注解方式实现

作者头像
訾博ZiBo
发布于 2025-01-06 07:08:38
发布于 2025-01-06 07:08:38
10300
代码可运行
举报
运行总次数:0
代码可运行

重点知识点总结:

2020年3月18日14:19:13

1、曾经的XML配置方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
  scope="" init-method="" destroy-method="">
    <property name="" value="" / ref=""/>
</bean>

2、注解的分类

用于创建对象的注解:

它们和在xml中编写<bean/>标签实现的功能是一样的;

Component:用于把当前类作为存入spring容器中;

属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;

Controller:一般用在表现层;

Service:一般用在业务层;

Repository:一般用在持久层;

上面三个注解跟Component的作用是一模一样的,它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;

用于注入数据的注解:

它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;

用于改变作用范围的注解:

它们和在xml中使用scope属性实现的功能是一样的;

和生命周期有关的注解:

它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;

一、注解方式说明及入门示例

1、说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 * 属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */

2、入门示例

代码:

接口IAccountService:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services;

/**
 * 业务层接口
 */
public interface IAccountService {
    /**
     * 模拟保存账户
     */
    void saveAccount();
}

接口实现类AccountServiceImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import org.springframework.stereotype.Component;

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 * 属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */
@Component(value = "accountService")//如果注解中只有一个value,value是乐意省略的
public class AccountServiceImpl implements IAccountService {
    private IAccountDao iAccountDao = new AccountDaoImpl();
    @Override
    public void saveAccount() {
        iAccountDao.saveAccount();
    }
}

Client类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        System.out.println(service);
    }
}

bean.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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">
        <!--告诉spring要创建容器时要扫描的包,但是配置所需要的标签不在<beans/>标签中,
        而是一个名称为context的名称空间和约束中-->
    <context:component-scan base-package="com.zibo"/>
</beans>

pom.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring04</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

</project>

文件位置图:

运行结果:

二、深入注解方式

1、自动按照类型注入

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 *  细节:在使用注解时,set方法就不是必须的了;
代码示例:

(部分代码,其他代码见上面)

接口IAccountDao:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao;

public interface IAccountDao {
    void saveAccount();
}

接口实现类AccountDaoImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao.impl;

import com.zibo.dao.IAccountDao;
import org.springframework.stereotype.Component;

@Component("accountDao")
public class AccountDaoImpl implements IAccountDao {
    @Override
    public void saveAccount() {
        System.out.println("保存了账户111");
    }
}

接口实现类AccountDaoImpl2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.dao.impl;

import com.zibo.dao.IAccountDao;
import org.springframework.stereotype.Component;

@Component("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {
    @Override
    public void saveAccount() {
        System.out.println("保存了账户222");
    }
}

接口实现类AccountServiceImpl:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 *      属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 *  细节:在使用注解时,set方法就不是必须的了;
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 */
@Component("accountService")//如果注解中只有一个value,value是乐意省略的
public class AccountServiceImpl implements IAccountService {
    @Autowired//不推荐的方法
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;

    @Override
    public void saveAccount() {
        accountDao2.saveAccount();
    }
}

Client类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        service.saveAccount();
    }
}

文件位置图:

运行结果:

2、Qualifier

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Qualifier:
 *  细节:在使用注解时,set方法就不是必须的了;
 *  作用:当自动类型注入出现多个匹配对象时,且变量名匹配不到相同的bean时,使用此方式;
 *  说明:它在给类成员注入时不能单独使用,在给方法注入时可单独使用;
 *  属性:value用于指定注入bean的id;
使用示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Autowired//不推荐的方法
    @Qualifier("accountDao")//指定使用accountDao,则变量名是accountDao2也必须使用accountDao
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;
备注:

@Qualifier要用在@Autowired下面;

3、Resource

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Resource:
 *  作用:直接按照bean的id注入,可以独立使用;
 *  属性:name用于指定bean的id;
使用示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Resource(name = "accountDao2")
注意:

不需要使用@Autowired;

在maven配置文件pom.xml中加入依赖:(???)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
总结:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 总结:以上三个注解只能注入其他bean类型的数据,基本类型和String类型不能通过上述方法实现;
 * 另外,集合类型的注入只能通过xml实现;

4、Value

说明:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * Value:
 *  作用:用于注入基本类型和String类型;
 *  属性:value指定数据的值,它可以使用spring中的SpEL表达式(也就是Spring的EL表达式)
 *  SpEL的写法:${表达式}

5、作用范围和生命周期的注解实现

作用范围:

说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * Scope:
 *  作用:指定Bean的作用范围;
 *  属性:value指定取值的范围,常用取值:singleton(单例,默认) prototype(多例)
 *  出现位置:类上;

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Scope("prototype")//多例测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        IAccountService service2 = ac.getBean("accountService",IAccountService.class);
        System.out.println(service==service2);//false
生命周期:

说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 * PreDestroy:
 *  作用:用于指定销毁方法;
 * PostConstruct:
 *  作用:用于指定初始化方法;

代码示例:

实现类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.services.impl;

import com.zibo.dao.IAccountDao;
import com.zibo.dao.impl.AccountDaoImpl;
import com.zibo.services.IAccountService;
import jdk.jfr.Frequency;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * 账户的业务层实现类
 * 曾经的xml配置:
 * <bean id="accountService" class="com.zibo.services.impl.IAccountServiceImpl"
 * scope="" init-method="" destroy-method="">
 *   <property name="" value="" / ref=""/>
 * </bean>
 * 用于创建对象的;它们和在xml中编写<bean/>标签实现的功能是一样的;
 * Component:用于把当前类作为存入spring容器中;
 *      属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
 * Controller:一般用在表现层;
 * Service:一般用在业务层;
 * Repository:一般用在持久层;
 * 上面三个注解跟Component的作用是一模一样的,
 * 它们三个是spring框架为三层提供的明确注解,使三层对象看起来更清晰;
 * 用于注入数据的;它们和在xml中的<bean/>标签中写一个<property/>的作用是一样的;
 * Autowired:
 *  作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
 *      补充:
 *          如果没有则注入失败;
 *          如果有多个则在按照类型匹配之后再按照key匹配,匹配到与变量名相同的bean则成功;
 *  出现位置:成员变量上、方法上;
 * Qualifier:
 *  细节:在使用注解时,set方法就不是必须的了;
 *  作用:当自动类型注入出现多个匹配对象时,且变量名匹配不到相同的bean时,使用此方式;
 *  说明:它在给类成员注入时不能单独使用,在给方法注入时可单独使用;
 *  属性:value用于指定注入bean的id;
 * Resource:
 *  作用:直接按照bean的id注入,可以独立使用;
 *  属性:name用于指定bean的id;
 * 总结:以上三个注解只能注入其他bean类型的数据,基本类型和String类型不能通过上述方法实现;
 * 另外,集合类型的注入只能通过xml实现;
 * Value:
 *  作用:用于注入基本类型和String类型;
 *  属性:value指定数据的值,它可以使用spring中的SpEL表达式(也就是Spring的EL表达式)
 *  SpEL的写法:${表达式}
 * 用于改变作用范围的;它们和在xml中使用scope属性实现的功能是一样的;
 * Scope:
 *  作用:指定Bean的作用范围;
 *  属性:value指定取值的范围,常用取值:singleton(单例,默认) prototype(多例)
 *  出现位置:类上;
 * 和生命周期相关的;它们和在xml中使用init-method和destroy-method属性实现的功能是一样的;
 * FreDestroy:
 *  作用:用于指定销毁方法;
 * PostConstruct:
 *  作用:用于指定初始化方法;
 */
@Component("accountService")//如果注解中只有一个value,value是乐意省略的
//@Scope("prototype")//多例测试
public class AccountServiceImpl implements IAccountService {
//    @Autowired//不推荐的方法
//    @Qualifier("accountDao")//指定使用accountDao,则变量名是accountDao2也必须使用accountDao
    @Resource(name = "accountDao2")
    //变量名如果是accountDao则匹配到AccountDaoImpl,如果是accountDao2则匹配到AccountDaoImpl2
    private IAccountDao accountDao2;
    @PostConstruct
    private void init(){
        System.out.println("初始化。。。");
    }
    @PreDestroy
    private void destroy(){
        System.out.println("销毁。。。");
    }
    @Override
    public void saveAccount() {
        accountDao2.saveAccount();
    }
}

测试类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.ui;

import com.zibo.services.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模拟表现层,调用业务层
 */
public class Client {
    public static void main(String[] args) {
        /*
         * 获取spring的IOC的核心容器,并根据id获取对象
         * ApplicationContext的三个常用实现类:
         * 1、ClassPathXmlApplicationContext(xml方式最常用):仅能加载类路径下的配置文件;
         * 2、FileSystemApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限);
         * 3、AnnotationConfigApplicationContext:用于读取注解创建容器;
         */
        //1、获取核心容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2、根据id获取bean对象
        IAccountService service = ac.getBean("accountService",IAccountService.class);
        service.saveAccount();
        ac.close();
    }
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
无聊时听什么?这款电台小程序,听你喜欢的
今天,知晓程序(微信号 zxcx0101)要推荐的小程序,名字就叫做「FM 阿基米德」。
知晓君
2018/08/01
5500
无聊时听什么?这款电台小程序,听你喜欢的
微信小程序正式发布!这是最全的上手指南
2017 年 1 月 9 日,是一个值得载入互联网史册的日子。 这一天,零点刚过,张小龙和他的团队,在夜色笼罩下,正式发布了微信小程序。 所以,从这一刻开始,只要有开发者登录小程序后台,并在「开发管理
知晓君
2018/06/28
1.5K0
亲测:小程序到底耗流量吗?| 小程序问答 #19
不过,「比较多的流量」,到底是多少?小程序和网页、app 相比,会不会消耗更多的流量呢?
知晓君
2018/08/01
2.5K0
这个程序员爸爸,专门做了款小程序,教会小孩认字 | 晓组织 #9
由于一次学校的网页比赛误入前端行业,现一直从事前端方面的工作。这次非常意外又惊喜的收到知晓程序(微信号 zxcx0101)的邀请,来说一说我的第一款小程序「看图识字」背后的一些事。
知晓君
2018/08/01
8210
这个程序员爸爸,专门做了款小程序,教会小孩认字 | 晓组织 #9
有了微信小程序,你会卸载原生 App 吗?
文 | 槽君 微信小程序发布后,网络上对微信小程序的讨论很火爆。 我也第一时间体验了微信小程序。小程序在加载速度、基础交互等方面,确实比单纯的网页体验好很多,也比 app 轻便不少。 首先,小程序里的功能基本上都是服务类的,比如订餐、买车票等。像个人资料的修改、分享朋友圈等,这些接口都没开放。 不过最近不断有新的小程序上线,其他种类小程序也可能会逐渐上线。 其次是小程序没有烦人的广告推送。有了小程序,至少目前,你不用担心会有广告的存在。 小程序的第一印象 小程序支持置顶聊天显示,这是我最先感受到的一个特点。
知晓君
2018/06/28
1.3K0
体验了150个小程序以及我的思考
【高频使用】 美团外卖+ 纯点餐没有叽叽歪歪的各种活动让你不知道吃什么,自动定位功能比较准,第一次登陆要绑定下手机号,大多数人的好评小程序。 滴滴公交查询 基于地理位置的服务,授权后自动给你最近的公交,也能搜索你要查的公交,公交线路的每个站点的时间和距离都能实时更新,有首末班车时间信息,有大概票价信息。不足就是不能根据目的地查询公交路线。纯小工具,如果是等公交的人,或在室内要预计出门时间的人都十分实用。无需任何账号注册或者授权。 车来了 首页太乱信息量过多,有个最近使用和收藏功能,觉得有点多余了。本来就叫
顶级程序员
2018/04/26
2.1K0
微信小程序的再思考:什么才是正确的打开方式?
文 | 唐思思 写在前面 一个月前,关于小程序的讨论热火朝天,万众瞩目;一个月后,朋友圈里却已经很难再刷到关于小程序的帖子。 是新鲜劲过了,还是小程序并没有如大家预期的那样显著改变大家的使用行为?你的手机里又卸载了几个 app,转而使用小程序? 总结成一个问题:说好的「app 杀手」呢? 核心观点 微信小程序的目的是实现移动互联网时代唾手可得的服务模式。它没有为 app 引流,也没有计划代替 app,更没有想做分发平台。开发者和市场对小程序的理解有偏差。 微信小程序的核心价值是线下场景应用而不是线上服务,开
知晓君
2018/06/28
5911
我们采访了 5 个「名字很长」的小程序,他们到底是怎么想的?
不能同名,但想让用户能轻易搜索到自己的小程序,该怎么办?于是,很多无可奈何、掏空心思,又追悔莫及的名字诞生了。
知晓君
2018/08/01
6150
我们采访了 5 个「名字很长」的小程序,他们到底是怎么想的?
小程序才是企业的生存之道,小程序问答-带你快速了解小程序常见问题.
21世纪以来,世界每天都在以惊人的速度在更新、发展中,许多的东西大致上昨天今天并没有变化,但一旦隔上一两个月变化就十分明显了。更不要说互联网,一个由代码所构建起来的世界里,每天的变化多到无法精准计算,发展速度快到无法捕捉。
用户1745481
2019/01/09
7090
一篇文章读懂微信小程序 | 观点
知晓程序注: 虽然小程序发布公测已经快一个月了。 但知晓程序(微信号 zxcx0101)发现,很多用户还不清楚小程序是什么?该不该加入小程序创业的浪潮? 为了解答大家的疑惑,今天就给大家分享一篇白崎在小程序发布内测后写的这篇文章,让你一篇文章读懂微信小程序。 如果想深度探讨小程序创业的话题,现在报名参加「未来小程序 x MindTalk」线下活动,5 位导师带你一起拨开小程序创业的迷雾(报名方式见文末)。 文 | 白崎 距离张小龙的那场首次公开演讲已经有九个月了,而在那场演讲中,备受关注的「应用号」在千呼
知晓君
2018/06/28
1K0
《增长黑客》节选与笔记[通俗易懂]
这本书涉及了很多具体又贴合现实的互联网产品问题,即使你是非专业人士,也应该读一读,了解开发者是如何把你当猫耍的,以便你更好地认识一些套路,解锁,为选择手机软件或者云端应用擦亮眼睛!
全栈程序员站长
2022/08/27
7.9K0
重构区块链
撰写这篇手册,并不简单的因为区块链是一个热门话题,更因为随着研究的深入,你会发现这是一个相当复杂的领域。关于这一话题的信息来源无外乎三个方面:技术文档和代码,商业机构的宣传,研究机构或个人的整理。但是每一种媒体都因其形式、渠道或作者而带有某种偏见。技术文档固然详细精确,但是不够通俗,视野也不够广阔;商业宣传必定带有一定的偏向性;而看似中立的研究机构和媒体也因其背后资助方或者受众市场的差异而显现出意识形态的不同。区块链领域的技术人员喜欢强调其技术领先性,但偏偏这一领域在学术界还没有一致的评判标准。区块链商业机构流行的白皮书,只有极少数既保留了技术细节,又蕴含对整个体系的理解。媒体和研究机构里则存在一种悖论,那些对区块链理解不够深,但是想象力丰富的人,率先推出了所谓的畅销书,只能让普通人初步理解一些浅层的知识,无法用来灵活运用和价值创造。只有那些深入区块链一线的研究员才会意识到,这个领域还处在高速变化期,很多东西都没有定性,出书立著为时尚早。
全栈程序员站长
2022/07/23
10.1K0
重构区块链
电脑史话(说历史视频)
从1980年8月到1981年8月,在整整一年的时间里,埃斯特奇领导着“国际象棋”工程计划13人小组奋力攻关。“当时很少有人体会到,这一小组人即将改写全世界的历史。”(英特尔华裔副总裁虞有澄语)据说,IBM公司后来围绕PC机的各项开发,投入的力量逐步达到450人,英特尔公司也组成“特殊客户部”为PC机供应高质量的芯片。   根据协定,微软公司应该为PC机提供包括BASIC在内的系列电脑语言软件。然而,未来的PC电脑,最需要的软件是操作系统,于是,比尔·盖茨把IBM的代表介绍给了另一家以研制CP/M操作系统软件闻名的DR数字研究公司。   接下来发生的事情又出现了戏剧性情节,CP/M操作系统软件的设计者基多尔恰好不在家,而他的太太又不愿在保密协定上签字画押,千载难逢的机遇与DR公司失之交臂。   IBM的代表只得掉转头来,仍请微软公司帮助解决操作系统的问题。比尔·盖茨急中生智,想起了西雅图电脑公司的软件天才帕特森(T.Paterson),此人早就为英特尔的16位芯片编写了一个QDOS软件,正好可以充当PC机的操作系统。QDOS即“快而粗糙的操作系统”,微软公司以低价购买到这款软件的版权,只是当时帕特森这位“DOC之父”并不知晓内情。   1980年感恩节刚过,“国际象棋”工程小组把IBM公司的最高机密──两台PC电脑的样机,从迈阿密空运到西雅图。同样在高度保密的条件下,比尔·盖茨率领着微软公司的软件小组开始为PC电脑编写程序。他们的任务除了需要赶写BASIC、COBOL、FORTRAN和PASCAL四种电脑语言的4万个程序代码,还要把QDOS改造成适合PC机使用的MS-DOS操作系统。从此,微软和IBM公司两个小组的技术人员,不断地乘飞机来来往往,飞越美国距离最远的两个城市,相互交换信息。微软的工程师还必须把自己关在密不透风的房间里,满头大汗地日夜加班。比尔·盖茨大量招聘编程高手,使参加PC机软件工程的人员增加到了70人。直到1981年6月,帕特森也加盟微软公司,并立即参加到MS-DOS的开发之中,经过反复修改和调试,终于完成了这件影响深远的著名软件。   一年的时间转瞬而至。1981年8月12日,IBM公司在纽约市对外宣布:IBM PC机横空出世,昭示着人类社会跨进了个人电脑的新时代。应该说,这是由英特尔公司提供微处理器芯片、微软公司编写软件、IBM公司主要设计电脑系统的共同作品。   IBM PC机最重要的特点在于它的开放性。埃斯特奇代表设计部门宣布,他们将把所有的技术文件全部公开,热诚欢迎同行加入个人电脑的发展行列。于是乎,全世界各地的电子电脑厂商一轰而上,争相转产仿造PC机,仿造出来的产品就是IBM PC兼容机。不久,IBM PC机就成为个人电脑“事实上的标准”。   为了推广这种供个人使用的电脑,IBM公司巧妙地借助卓别林式的小流浪汉形象,头戴园顶高帽,身着灯笼裤,滑稽可爱地在电视上频频露脸,手里舞动着个人电脑,表示人人都能够使用。《华尔街日报》评论说:IBM大踏步地进入微型电脑市场,蓝色巨人可望在两年内夺得这一新兴市场的领导权。果然,就在1982年内,IBM PC机卖出了25万台,以每月2万台的速度迅速接近了“苹果”。1983年5月8日,IBM公司推出改进型IBM PC/XT个人电脑,增加了硬盘装置,当年就使市场占有率超过76%。1984年8月14日,IBM公司趁胜又把一种“先进技术”的IBM PC/AT机投向用户的怀抱。AT机采用英特尔公司后来发展的80286微处理器芯片,能管理多达16M的内存,并可以同时执行多个任务。从此,个人电脑开始了所谓286、386、486……的接力赛跑。   1982年,美国著名的《时代》周刊在介绍本年度“新闻人物”时曾满怀激情地写到:“在一年的新闻里,这个最吸引人的话题,它代表着一种进程,一种持续发展并被广泛接受和欢迎的进程。这就是为什么《时代》在风云激荡的当今世界中选择了这么一位新闻人物,但这完全不是一个人物,而是一台机器。”   这个史无前例的“新闻人物”,就是个人电脑IBM PC机。
全栈程序员站长
2022/07/31
3.4K0
上帝掷骰子吗–量子物理史话
大家好,又见面了,我是你们的朋友全栈君。   上帝掷骰子吗–量子物理史话   第一章黄金时代   一   我们的故事要从1887年的德国开
全栈程序员站长
2022/06/26
7.5K0
相关推荐
无聊时听什么?这款电台小程序,听你喜欢的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验