springboot面试题,springboot常用注解
自动组装原理:springboot由main方法下的SpringApplication.run方法启动启动时会调用refshContext方法,先刷新容器,然后按照解析注释或者解析配置文件的形式祖先bean相反,它通过启动类的SpringBootApplication注释来开始解析,它将根据EnableAutoConfiguration启动自动配置,它有一个核心方法ImportSelect来选择性地导入根据loadFanctoryNames,根据classpash path,所有对应的自动化配置都是在Mata-INF/Spring下加载以“What EnableAutoConfiguration”开头的key工厂这120多个自动化配置他都不导入,每个自动化配置里都有条件判断注释先判断是否引入互jar包,再判断容器是否有bean,再注入bean容器
一、基础录入依赖关系管理功能对父项目进行依赖关系管理
依赖性管理
父母
groupId org . spring framework . boot/groupId
artifact id spring-boot-starter-parent/artifact id
版本2.3.4 .发布/版本
/父母
上述项目的上级项目如下:
父母
groupId org . spring framework . boot/groupId
artifact id spring-boot-dependencies/artifact id
版本2.3.4 .发布/版本
/父母
它声明了几乎所有开发中常用的依赖版本号,自动版本仲裁机制
导入初学者方案启动器:
看到很多Spring-Boot-starter-*: *只要在某个场景下引入了starter,我们就会自动引入更多该场景所有例程需求的依赖*-spring-boot-starter在SpringBoot支持的所有场景中都可以看到:第三方为我们提供的简化开发的场景启动器所有场景发起者中最低的依赖性
属国
groupId org . spring framework . boot/groupId
artifactId弹簧启动启动器/artifactId
版本2.3.4 .发布/版本
范围编译/范围
/依赖关系
不关注版本号的自动版本仲裁
依赖默认的jar可以不写版本引入,要写版本号您可以修改默认版本号
检查当前相关版本的spring-boot-dependencies中指定的密钥重写当前项目中的配置,如下面的代码所示
性能
mysql .版本5.1.43 /mysql .版本
/属性
自动配置特性自动配置Tomcat,并引入了Tomcat依赖性配置Tomcat依赖关系
groupId org . spring framework . boot/groupId
artifactId spring-boot-starter-Tomcat/artifactId
版本2.3.4 .发布/版本
范围编译/范围
/依赖关系
自动配置SpringMVC,介绍全套SpringMVC组件,自动配置SpringMVC常用组件(函数),自动配置常用web函数,例如字符编码问题SpringBoot帮助我们配置Web开发所有常用场景的默认包结构默认情况下,将扫描主程序所在的包及其下的所有子包中的组件不需要之前的包扫描配置如果要更改扫描路径,@ springbootapp(scanbase packages= com . atguigu )或@ComponentScan指定扫描路径@ spring boot app
等同于
@SpringBootConfiguration
@启用自动配置
@ components can( com . at guigu . boot )
各种配置都有默认值默认配置最终映射到某个类例如,MultipartProperties配置文件的值最终被绑定到每个类该类将在容器中创建对象,并按需加载所有自动配置项二容器功能2.1组件添加1@配置基本用全模式和Lite模式最佳实用配置类组件之间没有依赖关系Lite模式用于加速容器启动过程,并减少配置类组件之间的依赖性将调用方法来获取上一个单实例组件使用完全模式
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #配置使用示例
/**
* 1.在配置类中,@Bean用于标记为容器注册组件的方法,默认为单实例
* 2.配置类本身也是一个组件
* 3.代理bean方法:代理bean的方法
* Full(proxyBeanMethods=true),[确保每个@Bean方法返回的组件多次都是单实例的]
* Lite(proxyBeanMethods=false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件依赖必须使用全部模式默认其他默认是否清淡的模式
*
*
*
*/
@ Configuration(proxy bean methods=false)//告诉跳羚这是一个配置类==配置文件
公共类我的配置{
/**
*完整:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @返回
*/
@Bean //给容器中添加组件以方法名作为组件的身份证返回类型就是组件类型返回的值,就是组件在容器中的实例
公共用户user01(){
用户张三=新用户(张三,18);
//用户组件依赖了宠物组件
张三setset(Tomcat pet());
回报张三;
}
@Bean(汤姆)
公共宠物tomcatPet(){
归还新宠物(‘Tomcat’);
}
}
######################配置测试代码如下########################################
@SpringBootConfiguration
@启用自动配置
@组件可以( com在硅谷boot’)
公共类主应用程序{
公共静态void main(String[] args) {
//1、返回我们国际奥林匹克委员会容器
ConfigurableApplicationContext run=spring应用程序运行(主应用程序class,args);
//2、查看容器里面的组件
string[]names=runget bean definition names();
对于(字符串名称:名称){
System.out.println(名称);
}
//3、从容器中获取组件
Pet tom01=run.getBean(tom ,Pet类);
Pet tom02=run.getBean(tom ,Pet类);
System.out.println(组件:(Tom 01==Tom 02));
//4、com在硅谷靴子配置我的配置$ $ enhancerbyspringglib $ $ 51 f1 E1 ca @ 1654 a892
我的配置bean=运行获取bean(我的配置类);
系统出去println(bean);
//如果@ Configuration(proxybean方法=true)代理对象调用方法跳羚总会检查这个组件是否在容器中有
//保持组件单实例
用户user=bean用户01();
用户用户1=bean用户01();
系统出去println(用户==用户1);
用户user01=run.getBean(user01 ,用户类);
Pet tom=run.getBean(tom ,Pet类);
System.out.println(用户的宠物:(用户01get pet()==Tom));
}
}
2、@Bean、@Component、@Controller、@Service、@Repository
3 、@ComponentScan 、@Import* 4 、@Import({User.class,DBHelper.class})
* 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
*
*
*
*/
@Import({User.class,DBHelper.class})
@ Configuration(proxy bean methods=false)//告诉跳羚这是一个配置类==配置文件
公共类我的配置{
}
@导入高级用法:https://www.bilibili.com/video/BV1gW411W7wy?p=8
4 、@有条件条件装配:满足有条件的指定的条件,则进行组件注入
=====================测试条件装配==========================
@ Configuration(proxy bean methods=false)//告诉跳羚这是一个配置类==配置文件
//@条件bean(name= Tom )
@ conditionalomissingbean(name= Tom )
公共类我的配置{
/**
*完整:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @返回
*/
@Bean //给容器中添加组件以方法名作为组件的身份证返回类型就是组件类型返回的值,就是组件在容器中的实例
公共用户user01(){
用户张三=新用户(张三,18);
//用户组件依赖了宠物组件
张三setset(Tomcat pet());
回报张三;
}
@Bean(tom22 )
公共宠物tomcatPet(){
归还新宠物(‘Tomcat’);
}
}
公共静态void main(String[] args) {
//1、返回我们国际奥林匹克委员会容器
ConfigurableApplicationContext run=spring应用程序运行(主应用程序class,args);
//2、查看容器里面的组件
string[]names=runget bean definition names();
对于(字符串名称:名称){
System.out.println(名称);
}
布尔型汤姆=跑包含bean(“Tom”);
System.out.println(容器中汤姆(男子名)组件:汤姆);
布尔用户01=运行包含bean(“用户01”);
System.out.println(容器中用户01组件:用户01);
布尔Tom 22=运行包含bean(“Tom 22”);
System.out.println(容器中tom22组件:‘汤姆22);
}
2.2、原生配置文件引入1 、@导入资源======================豆XML====================
?可扩展标记语言版本号允许=1.0 编码=UTF八号?
豆子xmlns= http://wwwspring框架组织/架构/bean
xmlns:xsi= http://w3 org/2001/XML架构-实例
xmlns:context= http://wwwspring框架组织/架构/上下文
xsi:架构位置= http://wwwspring框架http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://wwwspring框架组织/模式/上下文/spring-contextxsd
bean id=哈哈
属性名=名称值=张三/属性
属性名称=年龄值= 18 /属性
/bean
bean id=呵呵
属性名称=名称值= Tomcat /属性
/bean
/beans @ import资源(类路径:beansXML’)
公共类我的配置{}
======================测试=================
布尔哈哈=run.containsBean(哈哈);
布尔呵呵=跑包含bean(呵呵);
System.out.println(哈哈:哈哈);//真
System.out.println(呵呵:呵呵);//真
2.3、配置绑定如何使用爪哇读取到性能文件中的内容,并且把它封装到JavaBean中,以供随时使用;
公共类获取属性{
公共静态void main(String[] args)引发FileNotFoundException,IOException {
Properties PPS=new Properties();
PPSload(新文件输入流( a . properties ));
枚举枚举1=PPS属性名();//得到配置文件的名字
while(枚举1hasmorelements()){
String strKey=(String)enum 1next element();
string strValue=PPSgetproperty(strKey);
系统出去println(strKey = strValue);
//封装到JavaBean
}
}
}
1 、@ConfigurationProperties/*
* 只有在容器中的组件,才会拥有跳羚提供的强大功能
*/
@组件
@配置属性(前缀=我的车)
公共类汽车{
私人串串品牌;
私人整数价格;
公共字符串getBrand() {
回归品牌;
}
public void setBrand(字符串品牌){
this.brand=品牌;
}
公共整数getPrice() {
退货价格;
}
公共无效定价(整数价格){
this.price=价格;
}
@覆盖
公共字符串toString() {
返回"汽车"
brand= brand \
,价格=价格
};
}
}
2 、@ EnableConfigurationProperties @配置属性
3 、@组件@配置属性@ EnableConfigurationProperties(汽车类)
//1、开启汽车配置绑定功能
//2、把这个汽车这个组件自动注册到容器中
公共类我的配置{
}
三、自动配置原理入门总结:
跳羚先加载所有的自动配置类xxxxx
自动配置每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值电影站属性里面拿xxxProperties和配置文件进行了绑定生效的配置类就会给容器中装配很多组件只要容器中有这些组件,相当于这些功能就有了定制化配置用户直接自己@Bean替换底层的组件用户去看这个组件是获取的配置文件什么值就去修改。
p>
1、配置模式
全局配置文件SqlSessionFactory: 自动配置好了SqlSession:自动配置了SqlSessionTemplate 组合了SqlSession@Import(AutoConfiguredMapperScannerRegistrar.class);Mapper: 只要我们写的操作MyBatis的接口标准了@Mapper 就会被自动扫描进来
@EnableConfigurationProperties(MybatisProperties.class) : MyBatis配置项绑定类。
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration{}
@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties
可以修改配置文件中 mybatis 开始的所有;
# 配置mybatis规则
mybatis:
config-location: classpath:mybatis/mybatis-config.xml #全局配置文件位置
mapper-locations: classpath:mybatis/mapper/*.xml #sql映射文件位置
Mapper接口--- 绑定Xml
?xml versinotallow="1.0" encoding="UTF-8" ?
!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
mapper namespace="com.atguigu.admin.mapper.AccountMapper"
!-- public Account getAcct(Long id); --
select id="getAcct" resultType="com.atguigu.admin.bean.Account"
select * from account_tbl where id=#{id}
/select
/mapper
配置 private Configuration configuration; mybatis.configuration下面的所有,就是相当于改mybatis全局配置文件中的值
# 配置mybatis规则
mybatis:
# config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
configuration:
map-underscore-to-camel-case: true
可以不写全局;配置文件,所有全局配置文件的配置都放在configuration配置项中即可
导入mybatis官方starter编写mapper接口。标准@Mapper注解编写sql映射文件并绑定mapper接口在application.yaml中指定Mapper配置文件的位置,以及指定全局配置文件的信息 (建议;配置在mybatis.configuration)2、注解模式
@Mapper
public interface CityMapper {
@Select("select * from city where id=#{id}")
public City getById(Long id);
public void insert(City city);
}
3、混合模式
@Mapper
public interface CityMapper {
@Select("select * from city where id=#{id}")
public City getById(Long id);
public void insert(City city);
}
最佳实战:
引入mybatis-starter配置application.yaml中,指定mapper-location位置即可编写Mapper接口并标注@Mapper注解简单方法直接注解方式复杂方法编写mapper.xml进行绑定映射@MapperScan("com.atguigu.admin.mapper") 简化,其他的接口就可以不用标注@Mapper注解
整合 MyBatis-Plus 完成CRUD1、什么是MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
mybatis plus 官网
建议安装 MybatisX 插件
2、整合MyBatis-Plus
dependency
groupId com.baomidou /groupId
artifactId mybatis-plus-boot-starter /artifactId
version 3.4.1 /version
/dependency
自动配置
MybatisPlusAutoConfiguration 配置类,MybatisPlusProperties 配置项绑定。mybatis-plus:xxx 就是对mybatis-plus的定制SqlSessionFactory 自动配置好。底层是容器中默认的数据源mapperLocations 自动配置好的。有默认值。classpath*:/mapper/**/*.xml;任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件,放在 mapper下容器中也自动配置好了 SqlSessionTemplate@Mapper 标注的接口也会被自动扫描;建议直接 @MapperScan("com.atguigu.admin.mapper") 批量扫描就行优点:
只需要我们的Mapper继承BaseMapper 就可以拥有crud能力3、CRUD功能
@GetMapping("/user/delete/{id}")
public String deleteUser(@PathVariable("id") Long id,
@RequestParam(value = "pn",defaultValue = "1")Integer pn,
RedirectAttributes ra){
userService.removeById(id);
ra.addAttribute("pn",pn);
return "redirect:/dynamic_table";
}
@GetMapping("/dynamic_table")
public String dynamic_table(@RequestParam(value="pn",defaultValue = "1") Integer pn,Model model){
//表格内容的遍历
// response.sendError
// List User users = Arrays.asList(new User("zhangsan", "123456"),
// new User("lisi", "123444"),
// new User("haha", "aaaaa"),
// new User("hehe ", "aaddd"));
// model.addAttribute("users",users);
//
// if(users.size() 3){
// throw new UserTooManyException();
// }
//从数据库中查出user表中的用户进行展示
//构造分页参数
Page User page = new Page (pn, 2);
//调用page进行分页
Page User userPage = userService.page(page, null);
// userPage.getRecords()
// userPage.getCurrent()
// userPage.getPages()
model.addAttribute("users",userPage);
return "table/dynamic_table";
}@Service
public class UserServiceImpl extends ServiceImpl UserMapper,User implements UserService {
}
public interface UserService extends IService User {
}
6.2 NoSQLRedis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-data-redis /artifactId
/dependency
自动配置:
RedisAutoConfiguration 自动配置类。RedisProperties 属性类 -- spring.redis.xxx是对redis的配置连接工厂是准备好的。LettuceConnectionConfiguration、JedisConnectionConfiguration自动注入了RedisTemplate Object,Object : xxxTemplate;自动注入了StringRedisTemplate;k:v都是Stringkey:value底层只要我们使用 StringRedisTemplate、RedisTemplate就可以操作redisredis环境搭建
1、阿里云按量付费redis。经典网络
2、申请redis的公网连接地址
3、修改白名单 允许0.0.0.0/0 访问
RedisTemplate与Lettuce
@Test
void testRedis(){
ValueOperations String, String operations = redisTemplate.opsForValue();
operations.set("hello","world");
String hello = operations.get("hello");
System.out.println(hello);
}
切换至jedis
dependency
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-data-redis /artifactId
/dependency
!-- 导入jedis--
dependency
groupId redis.clients /groupId
artifactId jedis /artifactId
/dependency spring:
redis:
host: r-bp1nc7reqesxisgxpipd.redis.rds.aliyuncs.com
port: 6379
password: lfy:Lfy123456
client-type: jedis
jedis:
pool:
max-active: 10
© ©
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。