SpringBoot Bean管理
我们知道可以通过Spring当中提供的注解@Component以及它的三个衍生注解(@Controller、@Service、@Repository)来声明IOC容器中的bean对象,同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象,也就是依赖注入DI。
本篇主要介绍IOC容器中Bean的使用细节:
-
如何从IOC容器中手动的获取到bean对象
-
bean的作用域
-
管理第三方的bean对象(重点)
1、如何从IOC容器中手动的获取到bean对象
获取Bean
默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了。
而在Spring容器中提供了一些方法,可以主动从IOC容器中获取到bean对象,下面介绍3种常用方式:
1)根据name获取bean
Object getBean(String name)
2)根据类型获取bean
<T> T getBean(Class<T> requiredType)
3)根据name获取bean(带类型转换)
<T> T getBean(String name, Class<T> requiredType)
思考:要从 IOC容器 当中来获取到 bean对象,需要 先拿到 IOC容器对象
,怎么样才能拿到IOC容器呢?
想获取到IOC容器,直接将 IOC容器对象 注入进来就可以了,java中万物皆对象。
- step1: 创建 bean 容器
Mapper接口:
@Mapper
public interface UserMapper {//查询所有门派@Select("select * from sects")List<Sect> selectAll();
}
业务实现类:
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper ;@Overridepublic List<Sect> getAllSects() {List<Sect> sects = sectsMapper.selectAll();return sects;}
}
控制器:
@RestController
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/get/all")public Result getAll() {List<Sect> sects = sectsService.getAllSects();return Result.success(sects);}
}
- step2: 获取 Bean 容器
测试类:
import org.springframework.context.ApplicationContext;@SpringBootTest
class TianlongManagementApplicationTests {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void testGetBean() {//根据bean的名称获取SectsController bean1 = (UserController) applicationContext.getBean("userController");System.out.println(bean1);//根据bean的类型获取SectsController bean2 = applicationContext.getBean(UserController.class);System.out.println(bean2);//根据bean的名称及类型获取SectsController bean3 = applicationContext.getBean("userController", UserController.class);System.out.println(bean3);}
}
输出的bean对象地址值一样,说明在IOC容器中SectsController这个bean是 单例的
。那能否将bean对象设置为非单例?
说到这,笔者之前想过一个问题,为什么在SpringBoot项目中,都是Controller类、ServiceImpl实现类和Mapper接口需要添加@Componet及其衍生注解,而我们写的POJO实现类却不用添加?POJO也是一个一个的类,在项目里也需要创建对象,为什么这些POJO对象不需要添加到IOC容器来管理呢?(如下图Sects这个实现类并没有添加@Component注解)
谈一下我的拙见,首先需要知道为啥Spring框架IOC控制反转很重要,因为通过这个可以实现Controller、Service、DAO三层的解耦,大白话就是当Controller需要用ServiceImpl对象,就不用new的方式创建,而是直接通过DI依赖注入从IOC容器中拿对象。
明白了上面这一点,我们想想为啥POJO实现类和一些工具类不用加入IOC容器?
-
原因一:普通的POJO类、工具类通常是不涉及业务逻辑的辅助功能,不涉及复杂的依赖关系和配置,因此不需要被IOC容器管理;
-
原因二:Controller、Service和Mapper这三层主要是处理业务,而普通的POJO类一般用于封装数据,封装数据意味着每次封装的数据可能不同,也就是每次对象不同,交给IOC容器管理反而更复杂。
2、bean的作用域
在前面我们提到的IOC容器当中,默认bean对象是单例模式(只有一个实例对象)。那么如何设置bean对象为非单例呢?需要设置bean的作用域。
在Spring中支持五种作用域,后三种在web环境才生效:
作用域 | 说明 |
---|---|
singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
prototype | 每次使用该bean时会创建新的实例(非单例) |
request | 每个请求范围内会创建新的实例(web环境中,了解) |
session | 每个会话范围内会创建新的实例(web环境中,了解) |
application | 每个应用范围内会创建新的实例(web环境中,了解) |
可以借助Spring中的@Scope注解来配置作用域:
再次运行后控制台日志显示 UserController这个bean就生成了多份,不过实际开发中,绝大多数bean都是单例的,也就是不用配置scope属性。
除此之外,Spring还提供了一个注解:@Lazy,用于延迟加载,意思是当第一次使用bean对象时,才会创建bean对象并交给ioc容器管理。
3、管理第三方的bean对象(重点)
前面所配置的bean,像controller、service,dao三层体系下编写的类,这些类都是我们在项目当中自己定义的类(自定义类)。当我们要声明这些bean,也非常简单,我们只需要在类上加上@Component以及它的这三个衍生注解(@Controller、@Service、@Repository),就可以来声明这个bean对象了。
但是在我们项目开发当中,还有一种情况就是这个类它不是我们自己编写的,而是我们引入的 第三方依赖 当中提供的。
在pom.xml文件中,引入dom4j:
<!--Dom4j-->
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
</dependency>
dom4j就是第三方组织提供的。dom4j中的SAXReader类就是第三方编写的。
当我们需要使用到SAXReader对象时,直接进行依赖注入是不是就可以了呢?
按照我们之前的做法,需要在SAXReader类上添加一个注解@Component(将当前类交给IOC容器管理),如下:
注意看,第三方提供的类是 只读的
,无法在第三方类上添加@Component注解或衍生注解。
那应该怎样定义并使用第三方的bean对象呢?
Spring框架又提供了一个注解 @Bean
,可以用来管理来第三方(不是自定义的)容器。
方法一: 在引导类/启动类上添加@Bean标识的方法 (不推荐,抛砖引玉)
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}//声明第三方bean@Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器beanpublic SAXReader saxReader(){return new SAXReader();}
}
测试xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<emp><name>Tom</name><age>18</age>
</emp>
测试类:
@SpringBootTest
class SpringbootWebConfig2ApplicationTests {@Autowiredprivate SAXReader saxReader;//第三方bean的管理@Testpublic void testThirdBean() throws Exception {Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));Element rootElement = document.getRootElement();String name = rootElement.element("name").getText();String age = rootElement.element("age").getText();System.out.println(name + " : " + age);}
}
运行测试方法,程序可以正常运行并解析xml数据,说明SAXReader类的对象被成功注入进来了。
Tom : 18
方法二: 在配置类中定义@Bean标识的方法 (推荐)
以上在启动类中声明第三方Bean的作法,不建议使用,项目中要保证启动类的 纯粹性。
- 创建配置类:CommonConfig
package com.nvyao.conf;import com.nvyao.pojo.Dept;
import com.nvyao.service.DeptService;
import org.dom4j.io.SAXReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration //配置类
public class CommonConfig {//声明第三方Bean,一般情况下专门定一个配置类来声名第三方bean对象//加了这个注解,spring框架会自动调用这个方法,并且将方法返回值交给IOC容器管理,成为IOC容器的bean对象//通过@Bean注解的name或value属性可以声明Bean的名称,如果不指定,默认bean的名称就是方法名@Bean//("reader")public SAXReader saxReader() {return new SAXReader();}
}
去除之前启动类的@Bean方法,重启依然有效。
假如第三方Bean在使用过程还需要使用其他Bean,也就是还需要依赖其他对象,可以直接通过在@Bean注解的这个方法添加需要依赖的对象的形参来解决,如下:
@Configuration //配置类
public class CommonConfig {@Beanpublic SAXReader saxReader(DeptService deptService) {System.out.println(deptService);List<Dept> deptList = deptService.listDept();System.out.println(deptList);return new SAXReader();}
}
可以断点调试看到,形参的对象已经注入进来了,真挺好!
总结一下:
1)SpringBoot的启动类也是一个配置类,理论上声明第三方Bean的方法可以放在启动类,但一般是单独定义一个配置类
2)加了@Bean注解,Spring框架会自动调用@Bean注解的方法,并且将方法返回值交给IOC容器管理,成为IOC容器的bean对象
3)通过@Bean注解的name或value属性可以声明Bean的名称,如果不指定,默认bean的名称就是方法名
4)如果第三方Bean需要依赖其他bean对象,直接在bean定义方法中设置行参即可,容器会根据类型自动装配
4、bean 三种注入方式
属性注入
属性注入目前最 常用的注入方式,使用
@Autowired
注解实现。
在类的属性上添加@Autowired注解,Spring会自动注入对应的Bean对象。
需要注意的是,属性注入可能会导致Bean状态的不完整性,因为它们是在构造函数后才被注入的,因此可能会出现空指针异常等问题。
适用于 类容器
- Bean 容器
package com.xuzhongkj.components;import com.xuzhongkj.po.Users;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class WttFunBeanTest {@Bean(name = "aaa")public String aaa() {return "aaaaaaaaaaa";}@Bean(name = "bbb")public Users bb22b() {return new Users(1, "wtt");}public String Hi() {return "Hi";}
}
- 属性注入
package com.xuzhongkj.controller;import com.xuzhongkj.components.WttFunBeanTest;
import com.xuzhongkj.po.Users;
import com.xuzhongkj.service.NewsService;
import com.xuzhongkj.service.impl.NewsServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class WttTest {@Autowiredprivate WttFunBeanTest wttFunBeanTest;@GetMapping("/wtt1")public int a1() {System.out.println(wttFunBeanTest.Hi());return 0;}
}
构造函数注入
构造函数注入是一种类型安全、清晰明了的方式,可以保证Bean的完整性。
在类中定义一个构造函数,并在其参数列表中声明需要注入的Bean对象。Spring会在初始化Bean的时候,自动将对应的Bean对象传入。
适用于 方法容器
package com.xuzhongkj.controller;import com.xuzhongkj.components.WttFunBeanTest;
import com.xuzhongkj.po.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class WttTest {private Users users;private String aaa2;// 注意: 这里 一定要使用 要注入的 bean 名称 为 形参的参数名public WttTest(Users bbb,String aaa) {this.users = bbb;this.aaa2 = aaa;}@GetMapping("/wtt1")public int a1() {System.out.println(users);System.out.println(aaa2);return 0;}
}
- 上述代码的 简化版,也叫 @AllArgsConstructor 注解版
package com.xuzhongkj.controller;import com.xuzhongkj.components.WttFunBeanTest;
import com.xuzhongkj.po.Users;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class WttTest {// 注意: 这里 一定要使用 要注入的 bean 名称 为 属性 的参数名private Users bbb;private String aaa;@GetMapping("/wtt1")public int a1() {System.out.println(bbb);System.out.println(aaa);return 0;}
}
方法注入
方法注入是一种灵活的注入方式,在类中定义一个方法,并在其参数列表中声明需要注入的Bean对象。
使用@Autowired
注解标记该方法,Spring会在初始化Bean的时候,自动调用该方法并传入对应的Bean对象。
适用于 方法、类 容器 的 再封装 容器
- 在 service 层 使用 方法注入:
package com.xuzhongkj.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuzhongkj.dao.NewsMapper;
import com.xuzhongkj.po.News;
import com.xuzhongkj.po.Users;
import com.xuzhongkj.service.NewsService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
@Data
public class NewsServiceImpl extends ServiceImpl<NewsMapper, News> implements NewsService {private Users bbb;private String aaa;// 注意: 这里 一定要使用 要注入的 bean 名称 为 形参的参数名@Autowiredpublic void aaa(Users bbb, String aaa) {this.bbb = bbb;this.aaa = aaa;}
}
- 在 controller层,验证 是否注入成功
package com.xuzhongkj.controller;import com.xuzhongkj.components.WttFunBeanTest;
import com.xuzhongkj.po.Users;
import com.xuzhongkj.service.NewsService;
import com.xuzhongkj.service.impl.NewsServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class WttTest {@Autowiredprivate NewsServiceImpl newsServiceImpl;@GetMapping("/wtt1")public int a1() {System.out.println(newsServiceImpl.getAaa());System.out.println(newsServiceImpl.getBbb());return 0;}
}
好文分享, 一起加油!
相关文章:
SpringBoot Bean管理
我们知道可以通过Spring当中提供的注解Component以及它的三个衍生注解(Controller、Service、Repository)来声明IOC容器中的bean对象,同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象,也就是依赖注入DI。 本篇主要…...
Qt5.12.2安装教程
文章目录 文章介绍下载连接安装教程 文章介绍 安装Qt5.12.2 下载连接 点击官网下载 安装包下载完毕 安装教程 点开设置,添加临时储存库,复制连接“https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/” 点击测试࿰…...
2024年大数据高频面试题(中篇)
文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…...
Python编程工具PyCharm和Jupyter Notebook的使用差异
在编写Python程序时需要用到相应的编程工具,PyCharm和Jupyter Notebook是最常用2款软件。 PyCharm是很强大的综合编程软件,代码提示、代码自动补全、语法检验、文本彩色显示等对于新手来说实在太方便了,但在做数据分析时发现不太方便…...
顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH)
顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH) 1、配置分机 点击分机 -> 找到你需要设置的分机 ->呼叫路由设置为external,这里需要设置的分机是呼叫的并不是坐席的分机呼叫路由 2、配置拨号方案 点击拨号方案 -> 输入目的地绑定 …...
【数据集处理工具】根据COCO数据集的json标注文件实现训练与图像的文件划分
根据COCO数据集的json标注文件实现训练与图像的文件划分 一、适用场景:二、COCO数据集简介:三、场景细化:四、代码优势:五、代码 一、适用场景: 适用于一个常见的计算机视觉项目应用场景,特别是当涉及到使…...
vue 如何做一个动态的 BreadCrumb 组件,el-breadcrumb ElementUI
vue 如何做一个动态的 BreadCrumb 组件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定义 elementUI 中的 Breadcrumb 组件是这样定义的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…...
FFmpeg播放视频
VS2017+FFmpeg6.2.r113110+SDL2.30.5 1.下载 ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC++控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令...
重叠区间的求和
#摘抄 GetGeneLength/src/GetGeneLength/GetGeneLength.py at main PoShine/GetGeneLength GitHub def main(): """ Extract gene length based on featureCount calculation gene nonredundant exon length method. """ # 引…...
java包装类 及其缓存
Java 包装类(Wrapper Class)是将基本数据类型转换为对象的方式,每个基本数据类型在 java.lang 包中都有一个相应的包装类: Boolean 对应基本类型 boolean Character 对应基本类型 char Integer 对应基本类型 int Float 对应基本…...
大龄程序员的出路在哪里?
对于许多资深程序员而言,年龄并非职业发展的桎梏,反而如同陈年的美酒,随着时间的流逝愈发醇厚。他们手握的是丰富的经验和不断进阶的技能,而这些都为他们打开了职业发展的无数扇大门。让我们一同探索这些令人心动的可能性吧&#…...
Unity不用脚本实现点击按钮让另外一个物体隐藏
1.首先在场景中创建一个按钮和一个其他随便什么东西 2.点击按钮中的这个加号 3.然后将刚刚你创建的物体拖到这里来 4.然后依次点击下面这些给按钮绑定事件 5.运行游戏并点击按钮,就会发现拖进来的物体消失了 总结:如果按钮的功能单一,可以使用…...
RAG技术-为自然语言处理注入新动力
引言: 在自然语言处理(NLP)的领域中,RAG(Retrieval-Augmented Generation)技术以其独特的方式,正在改变我们与机器的交互方式。RAG技术结合了大语言模型的强大能力,使得机器在理解和…...
Docker安装ELK(简易版)
1、下载ELK镜像:打开终端,并执行以下命令以下载Elasticsearch、Logstash和Kibana的Docker镜像。您也可以根据需要选择其他版本: docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6 docker pull docker.elastic.co/logstash…...
WPF项目实战视频《一》(主要为WPF基础知识)
1.WPF布局: Grid,stackPanel,wrapPanel,DockPanel,UniformGrid Grid 按行列布局, Grid.ColumnDefinitions列,Grid.RowDefinitions行 Grid.Row“0” Grid.Column“0” stackPanel 默认从上往下排…...
iOS ------ ARC的工作原理
一,ARC的概念 ARC (Automatic Reference Counting,自动引用计数) 是苹果公司在其编程语言(如 Objective-C 和 Swift)中的内存管理机制。ARC 通过编译器插入的代码自动管理对象的内存生命周期,减少了手动内存管理的复杂…...
【React】JSX基础
一、简介 JSX是JavaScript XML的缩写,它是一种在JavaScript代码中编写类似HTML模板的结构的方法。JSX是React框架中构建用户界面(UI)的核心方式之一。 1.什么是JSX JSX允许开发者使用类似HTML的声明式模板来构建组件。它结合了HTML的直观性…...
1分钟带你了解苹果手机删除照片恢复全过程
在日常使用苹果手机时,我们可能会不小心删除掉一些重要的照片,这让人非常烦恼。那么苹果手机怎么恢复删除的照片?下面小编将会向大家介绍苹果手机恢复删除的照片的方法,帮助大家轻松找回你丢失的照片。 一、利用“最近删除”文件夹…...
Ruby爬虫技术:深度解析Zhihu网页结构
在互联网时代,数据的价值日益凸显,尤其是在社交媒体和问答平台如Zhihu(知乎)上,用户生成的内容蕴含着丰富的信息和洞察。本文将深入探讨如何使用Ruby爬虫技术来解析Zhihu的网页结构,并获取有价值的数据。 …...
python中的re模块--正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科 学的一个概念。正则表达式通常被用来检索、替换那些符合某个模 式(规则)的文本 re模块作用 通过使用…...
sqlalchemy反射视图
sqlalchemy反射视图 一个名为my_view的视图,使用SQLAlchemy来操作这个视图 from sqlalchemy import create_engine, MetaData# 创建数据库连接 engine = create_engine(数据库连接字符串)# 创建一个MetaData对象 metadata = MetaData()# 反射视图 metadata.reflect(bind=eng…...
最新版康泰克完整版- Kontakt v7.10.5 for Win和Mac,支持m芯片和intel,有入库工具
一。世界最受欢迎的采样器的新篇章 Native Instruments Kontakt是采样器领域的标准,您将获得高质量的滤波器,在这里您将找到经典的模拟电路和最现代的滤波器。每一个都可以根据您的口味进行定制,并且由于它,您可以获得前所未有的声…...
spring boot(学习笔记第十三课)
spring boot(学习笔记第十三课) 传统后端开发模式和前后端分离模式的不同,Spring Security的logout,invalidateHttpSession不好用,bug? 学习内容: 传统后端开发模式 vs 前后端分离模式Spring Security的logout功能inv…...
聊聊不再兼容安卓的鸿蒙
鸿蒙NExt已经确定不再兼容安卓系统,这意味着鸿蒙系统在更新迭代上将会展现出更加迅猛的速度。不过,这样的变化也给开发者们带来了不小的挑战。如今,鸿蒙的开发主要推荐使用的是ArkTS,而不是我们熟悉的Java SDK。对于大量习惯于使用…...
创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型
1.概要 创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型 2.代码 #include <QApplication> #include "customRectWidget.h" /** qt 6.7版, 创建一个矩形,当鼠标进入这个矩形…...
AI自动生成PPT哪个软件好?高效制作PPT优选这4个
7.15初伏的到来,也宣告三伏天的酷热正式拉开序幕~在这个传统的节气里,人们以各种方式避暑纳凉,享受夏日的悠闲时光。 而除了传统的避暑活动,我们还可以用一种新颖的方式记录和分享这份夏日的清凉——那就是通过PPT的方式将这一传…...
LruCache、Glide和SmartRefreshLayout使用总结
(一)Android智能下拉刷新框架-SmartRefreshLayout https://github.com/scwang90/SmartRefreshLayout?tabreadme-ov-file (二)LruCache使用 使用它可以进行图片的内存缓存 public class ImageLoaderUtil {private LruCache<St…...
Redis中数据分片与分片策略
概述 数据分片是一种将数据分割并存储在多个节点上的技术,可以有效提高系统的扩展性和性能。在Redis中,数据分片主要用于解决单个实例存储容量和性能瓶颈的问题。通过将数据分散存储到多个Redis节点中,可以将负载均衡到不同的服务器上&#…...
leetcode_169. 多数元素
leetcode_169. 多数元素 问题描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums …...
STM32 GPIO的工作原理
STM32的GPIO管脚有下面8种可能的配置:(4输入 2 输出 2 复用输出) (1)浮空输入_IN_FLOATING 在上图上,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。黄色的高亮部分显示…...
嘉兴高端网站建设有限公司/个人免费网站申请注册
Android Studio是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA。它类似于Eclipse ADT,Android Studio 提供了集成的Android开发工具用于开发和调试。那么今天我们就来讲讲在使用Android Studio过程中,常常会使用到的快捷键有哪些&…...
兰州网站订制/徐州百度推广公司
要想解决ie6背景不透明的方法有很多有简单有复杂的,所以在这里分享一个屡试不爽的方法,该方法只需要调用一个叫 iepng.js 的脚本即可让你彻底远离ie6 png背景不透明。 step1: 将iepng.js脚本放到js文件夹内 step2: 在<head></head>头部标签内…...
静态手机网站建设的基本特点/seo标签怎么优化
假如你上班正在偷偷看八卦新闻,看到范冰冰和李晨又在秀恩爱,又在虐狗,这时候突然老板出现在你面前。你手法熟练的用快捷键(AltTab)将屏幕切换到工作界面。 正当你心里暗爽,又躲过一…...
怎么样搭建qq号网站/网络上哪里可以做推广
1. 缘起 Jetspeed是Apache Jakarta小组的开放源码门户系统。它使得最终用户可以通过WAP手机、浏览器、PDA等各种设备来使用各种各样的网络资源(比如应用程序、数据以及这之外的任何网络资源)。在这里,Jetspeed扮演了一个处于信息和用户间的hu…...
dw网页制作论文/爱站seo查询软件
知识点 素数判断不要忘了讨论1的情况!!不然会出现部分错误 if(b1)return 0;代码 #include<iostream> #include<math.h> using namespace std;int sushu(int b){if(b1)return 0;for(int i2;i<sqrt(b);i){if(b%i0){return 0;}}return 1;…...
贵州建设考试网站/网络推广的优势
1.场景和需求: 有一个接口,里面做了获取数据和更新的操作,非常耗时,一条数据需要花费1秒钟 检查updateJiakeGejieData这个接口,里面有一段for循环操作,需要一条一条读取数据并更新 再检查getAccountInfo这…...