最新Spring框架技术总结(一),字节跳动java面试流程

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

ref:设定引用类型构造方法参数对应bean的id ,不能与value同时使用

type :设定构造方法参数的类型,用于按类型匹配参数或进行类型校验

index :设定构造方法参数的位置,用于按位置匹配参数,参数index值从0开始计数

  • 注意:一个bean可以有多个constructor-arg标签
  1. 创建有参构造

public class UserServiceImpl implements UserService {

private UserDao userDao;

public UserServiceImpl(UserDao userDao) {

this.userDao = userDao;

}

@Override

public void save() {

userDao.save();

}

}

  1. 配置Spring容器调用有参构造时进行注入

2.3.3、依赖注入数据类型

上面的操作,都是注入的引用Bean,都是对UserDao对象的引用进行注入的,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。

对于集合数据类型注入:

  • 名称:array,list,set,map,props

  • 类型:标签

  • 归属:property标签 或 constructor-arg标签

  • 作用:注入集合数据类型属性

  • 格式:

  1. 常量注入
  1. Bean注入
  • 注意点:这里的值是一个引用,ref
  1. 数组注入

红楼梦

西游记

水浒传

三国演义

  1. List注入

听歌

看木鱼水心

敲代码

玩游戏哈哈

  1. Map注入
  1. set注入

英雄联盟

刀塔

刺客信条

虐杀原型

  1. null注入
  1. Properties注入

20190525

林晓

123456

2.3.3.1、普通数据类型注入

public class UserDaoImpl implements UserDao {

private String username;

private int age;

public void setUsername(String username) {

this.username = username;

}

public void setAge(int age) {

this.age = age;

}

@Override

public void save() {

System.out.println(username+“====”+age);

System.out.println(“save running…”);

}

}

  • 在Spring核心配置文件进行配置

  • 普通值的注入,用value

2.3.3.2、List集合注入
  1. 集合数据类型List<String>的注入

public class UserDaoImpl implements UserDao {

privata List strList;

public void setStrList(List strList){

this.strList = strList;

}

@Override

public void save() {

System.out.println(“save running…”);

}

}

  • 在Spring核心配置文件进行配置

aaa

bbb

ccc

ddd

  1. 集合数据类型List<User>的注入
  • 新建一个实体类User,属性有name、addr,包含getter/setter,有/无参构造,toString方法

public class UserDaoImpl implements UserDao {

privata List strList;

public void setUserList(List userList){

this.userList = userList;

}

@Override

public void save() {

System.out.println(userList);

System.out.println(“save running…”);

}

}

  • 在Spring核心配置文件进行配置
2.3.3.3、Map集合注入

集合数据类型Map<String,User>的注入

public class UserDaoImpl implements UserDao {

privata Map<String,User> userMap;

public void setUserMap(Map<String,User> userMap){

this.userMap = userMap;

}

@Override

public void save() {

System.out.println(userMap);

System.out.println(“save running…”);

}

}

  • 在Spring核心配置文件进行配置
2.3.3.4、Properties注入

集合数据类型Properties的注入

public class UserDaoImpl implements UserDao {

privata Properties properties;

public void setProperties(Properties properties){

this.properties = properties;

}

@Override

public void save() {

System.out.println(properties);

System.out.println(“save running…”);

}

}

  • 在Spring核心配置文件进行配置

20190525

林晓

123456

2.3.4、使用p命名空间简化配置(了解)

  • 名称:p:propertyName,p:propertyName-ref

  • 类型:属性

  • 归属:bean标签

  • 作用:为bean注入属性值

  • 格式:

  • 注意:使用p命令空间需要先开启spring对p命令空间的的支持,在beans标签中添加对应空间支持
  • 例子

改为:

<bean

id=“userService”

class=“com.itheima.service.impl.UserServiceImpl”

p:userDao-ref=“userDao”

p:bookDao-ref=“bookDao”

/>

2.4、团队开发


import 一般用于团队开发使用,可以将多个 beans.xml 配置文件,导入合并为一个。

  • 名称:import

  • 类型:标签

  • 归属:beans标签

  • 作用:在当前配置文件中导入其他配置文件中的项

  • 格式:

  • 基本属性:

<import resource=“config.xml"/>

​ resource:加载的配置文件名

  • Spring容器加载多个配置文件

new ClassPathXmlApplicationContext(“config1.xml”,“config2.xml”);

  • Spring容器中的bean定义冲突问题

  • 同id的bean,后定义的覆盖先定义的

  • 导入配置文件可以理解为将导入的配置文件复制粘贴到对应位置

  • 导入配置文件的顺序与位置不同可能会导致最终程序运行结果不同

假设,现在项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用 import 将所有人的 beans.xml 合并为一个总的!

  • 张三

  • 李四

  • 王五

  • applicationContext.xml

3、Spring配置数据源

===============================================================================

3.1、数据源的作用


  • 数据源就是连接池

  • 事先实例化数据源,初始化部分连接资源

  • 使用连接资源时从数据源中获取

  • 使用完毕后将连接资源归还给数据源

  • 常见的数据源(连接池):DBCP、C3P0、Druid等

3.2、数据源开发步骤


  1. 导入数据源的坐标和数据库驱动坐标

mysql

mysql-connector-java

5.1.47

c3p0

c3p0

0.9.1.2

com.alibaba

druid

1.1.10

junit

junit

4.11

org.springframework

spring-context

5.0.5.RELEASE

  1. 在资源resources目录下新建jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/test

jdbc.username=root

jdbc.password=root

  1. applicationContext.xml加载jdbc.properties配置文件获得连接信息
  • 首先引入context命名空间和约束路径

  • 命名空间

xmlns:context=“http://www.springframework.org/schema/context”

  • 约束路径

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

<?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">

<context:property-placeholder location=“classpath:jdbc.properties”/>

  1. 测试

@Test

//测试手动创建c3p0数据源(加载properties配置文件)

public void test03() throws Exception {

//加载类路径下的jdbc.properties

ResourceBundle rb = ResourceBundle.getBundle(“jdbc”);

ComboPooledDataSource dataSource = new ComboPooledDataSource();

dataSource.setDriverClass(rb.getString(“jdbc.drier”));

dataSource.setJdbcUrl(rb.getString(“jdbc.url”));

dataSource.setUser(“jdbc.username”);

dataSource.setPassword(“jdbc.password”);

Connection connection = dataSource.getConnection();

}

3.3、Spring相关API


3.3.1、applicationContext接口

  • applicationContext :接口类型,代表应用上下文,可以通过其实例获得Spring容器中的Bean对象

3.3.2、applicationContext实现类

  • ClassPathXmlApplicationContext : 它是从类的根路径下加载配置文件,推荐使用这种

  • FileSystemXmlApplicationContext : 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置

  • AnnotationConfigApplicationContext : 当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解

3.3.3、getBean()方法

  • getBean("id") : 当参数的数据类型是字符串时,表示根据 Bean 的 id 从容器中获得Bean实例,返回是Object,需要强转。

  • getBean(class) :当参数的数据类型是Class字节码类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错

3.3.4、重点API

ApplicationContext app = new ClasspathXmlApplicationContext(“xml文件”);

app.getBean(“id”);

app.getBean(class);

4、Spring注解开发

==============================================================================

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

4.1、Spring原始注解


Spring原始注解主要是替代Bean的配置

注意:

  • 使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法

<context:component-scan base-package=“com.itheima”/>

  • 说明

  • 在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描

  • 扫描过程是以文件夹递归迭代的形式进行的

  • 扫描过程仅读取合法的java文件

  • 扫描时仅读取spring可识别的注解

  • 扫描结束后会将可识别的有效注解转化为spring对应的资源加入IoC容器

  • 注意

  • 无论是注解格式还是XML配置格式,最终都是将资源加载到IoC容器中,差别仅仅是数据读取方式不同

  • 从加载效率上来说注解优于XML配置文件

  • 我们也可以开启属性注解支持,这样所有注解都可生效

<context: annotation-config/>

| 注解 | 说明 |

| — | — |

| @Component | 使用在类上个用于实例化Bean |

| @Controller | 使用在web层类上用于实例化Bean |

| @Service | 使用在service层类上用于实例化Bean |

| @Repository | 使用在dao层类上用于实例化Bean |

| @Autowired | 使用在字段上上用于根据类型依赖注入 |

| @Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |

| @Resource | 相当于@Autowired + @Qualifier,按照名称进行注入 |

| @Value | 注入普通属性 |

| @Scope | 标注Bean的作用范围 |

| @PostConstruct | 使用在方法上标注方法是Bean的初始化方法 |

| @PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |

4.2、Bean的定义


我们之前都是使用 bean 的标签进行bean注入,但是实际开发中,我们一般都会使用注解!

  • 名称:@Component @Controller @Service @Repository

  • 类型:类注解

  • 位置:类定义上方

  • 作用:设置该类为spring管理的bean

  • 范例:

@Component

public class ClassName{}

  • 说明:

  • @Controller、@Service 、@Repository是@Component的衍生注解,功能同@Component

  • 相关属性

  • value(默认):定义bean的访问id


使用@Component标识UserDaoImpl需要Spring进行实例化

// 等价于

@Component(“userDao”)

public class UserDaoImpl implements UserDao {

@Override

public void save() {

System.out.println(“save running…”);

}

}

4.3、作用域注解


使用@Scope标注Bean的范围

  • 名称:@Scope

  • 类型:类注解

  • 位置:类定义上方

  • 作用:设置该类作为bean对应的scope属性

  • 范例:

@Scope

public class ClassName{}

  • 相关属性

  • value(默认):定义bean的作用域,默认为singleton

//@Scope(“prototype”)

@Scope(“singleton”)

public class UserDaoImpl implements UserDao{

}

4.4、衍生注解


@Component 有几个衍生注解,我们在 web 开发中,会按照mvc三层架构分层!

  • dao层: @Repository

  • service层: @Service

  • controller层:@Controller

这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean

@Repository

public class UserDao {

}

@Service

public class UserService {

}

@Controller

public class UserController {

}

写上这些注解,就相当于将这个类交给Spring管理装配了!

4.5、bean的生命周期


  • 名称:@PostConstruct@PreDestroy

  • 类型:方法注解

  • 位置:方法定义上方

  • 作用:设置该类作为bean对应的生命周期方法

  • 范例:

@PostConstruct

public void init() { System.out.println(“init…”); }

4.6、加载第三方资源


  • 名称:@Bean

  • 类型:方法注解

  • 位置:方法定义上方

  • 作用:设置该方法的返回值作为spring管理的bean

  • 范例:

@Bean(“dataSource”)

public DruidDataSource createDataSource() { return ……; }

  • 说明:

  • 因为第三方bean无法在其源码上进行修改,使用@Bean解决第三方bean的引入问题

  • 该注解用于替代XML配置中的静态工厂与实例工厂创建bean,不区分方法是否为静态或非静态

  • @Bean所在的类必须被spring扫描加载,否则该注解无法生效

  • 相关属性

  • value(默认):定义bean的访问id

4.7、bean的非引用类型属性注入


  • 名称:@Value

  • 类型:属性注解、方法注解

  • 位置:属性定义上方,方法定义上方

  • 作用:设置对应属性的值或对方法进行传参

  • 范例:

@Value(“${jdbc.username}”)

private String username;

  • 说明:

  • value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值

  • value值支持读取properties文件中的属性值,通过类属性将properties中数据传入类中

  • @value注解如果添加在属性上方,可以省略set方法(set方法的目的是为属性赋值)

  • 相关属性

  • value(默认):定义对应的属性值或参数值

@Component(“userDao”)

public class UserDaoImpl implements UserDao {

@Value(“注入普通数据”)

private String str;

@Value(“${jdbc.driver}”)

private String driver;

@Override

public void save() {

System.out.println(“save running…”);

}

}

4.8、bean的引用类型属性注入


  • 名称:@Autowired@Qualifier

  • 类型:属性注解、方法注解

  • 位置:属性定义上方,方法定义上方

  • 作用:设置对应属性的对象或对方法进行引用类型传参

  • 范例:

@Autowired(required = false)

@Qualifier(“userDao”)

private UserDao userDao;

  • 说明:

  • @Autowired默认按类型装配,指定@Qualifier后可以指定自动装配的bean的id

  • 相关属性

  • required:定义该属性是否允许为null


自动装配注解感觉视频没有讲解到位,这里引用狂神的案例来进行记录,当然此部分是为了加深理解,也可直接跳过4.6

具体视频讲解:Bean的自动装配


4.6、Bean的自动装配


  • 自动装配是Spring满足bean依赖的一种方式

  • Spring 会在上下文中自动寻找,并自动给 bean 装配属性!

在Spring中有三种装配的方式

  1. 在xml中显示的配置

  2. 在java中显示配置

  3. 隐式的自动装配bean【重要】下面主要记录第三种

4.6.1、测试环境搭建

  1. 新建两个实体类,Cat、Dog 都有一个叫的方法

public class Cat {

public void shout(){

System.out.println(“喵~”);

}

}

public class Dog {

public void shout(){

System.out.println(“汪~”);

}

}

  1. 新建一个人类,人类含有狗、猫两个变量

public class People {

private Cat cat;

private Dog dog;

private String name;

public Cat getCat() {

return cat;

}

public void setCat(Cat cat) {

this.cat = cat;

}

public Dog getDog() {

return dog;

}

public void setDog(Dog dog) {

this.dog = dog;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return “People{” +

“cat=” + cat +

“, dog=” + dog +

“, name='” + name + ‘’’ +

‘}’;

}

}

  1. 编写Spring核心配置文件
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd”>

  1. 测试类测试

public class Mytest {

@Test

public void test01(){

ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);

People people = (People) context.getBean(“people”);

people.getDog().shout();//汪~

people.getCat().shout();//喵~

}

}

4.6.2、byName自动装配

  • autowire="byName"(按名称自动装配)

  • 由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低,采用自动装配将避免这些错误,并且使配置简单化。

  1. 修改bean配置,增加一个属性 autowire="byName"
  1. 我们将 cat 的bean id 修改为 catXXX,如下
  1. 再次测试,报错

解释

当一个 bean 节点带有 autowire="byName"的属性时。

  1. 将查找其类中所有的 set 方法名,例如 set Cat,获得将 set 去掉并且首字母小写的字符串,即 cat。

  2. 去Spring容器中寻找是否有此字符串名称 id 的对象,例如去找 cat

  3. 如果有,就取出注入;如果没有,就报空指针异常

4.6.3、byType自动装配

  • autowire="byType" (按类型自动装配)

  • 使用 autowire="byType" 首先需要保证:同一类型的对象,在Spring容器中唯一(也就是bean中class属性必须只有一个)。如果不唯一,则报错

测试:

  1. 将people的bean配置修改一下:autowire="byType"
  1. 测试,正常输出

  2. 再注册一个 cat 的bean 对象!

  1. 测试,报错

  2. 删掉cat2,将cat的bean的id属性该掉

  1. 测试,无报错

解释

  • 按照类型自动装配不需要管bean的id属性,只要保证bean的class属性唯一即可

4.6.4、总结

小结:

  • byName 的时候,需要保证所有的 bean 的 id 唯一,并且这个 bean 需要和自动注入的属性的 set 方法的值一致!

  • byType 的时候,需要保证所有的 bean 的 class 唯一,并且这个 bean 需要和自动注入的属性的类型一致!

  • byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的 beanid!

  • byType:会自动在容器上下文中查找,和自己对象属性类型相同bean!

4.6.5、注解实现自动装配

4.6.5.1、@Autowired
  • @Autowired 是按类型自动转配的,不支持 id 匹配

  • 直接在属性上使用即可,也可以在set方式上使用!

  • 使用 @Autowired 我们可以不用编写Set方法了

public class People {

@Autowired

private Cat cat;

@Autowired

private Dog dog;

private String name;

public Cat getCat() {

return cat;

}

public Dog getDog() {

return dog;

}

public String getName() {

return name;

}

@Override

public String toString() {

return “People{” +

“cat=” + cat +

“, dog=” + dog +

“, name='” + name + ‘’’ +

‘}’;

}

}

4.6.5.2、@Qualifier
  • @Autowired 是根据类型自动装配的,加上@Qualifier 则可以根据名称的方式自动装配

  • @Qualifier 不能单独使用。

测试实验步骤:

  1. 配置文件修改内容,保证类型存在对象。且名字不为类的默认名字
  1. 没有加Qualifier 测试,直接报错

  2. 在属性上添加Qualifier 注解

@Autowired

@Qualifier(value = “cat2”)

private Cat cat;

@Autowired

@Qualifier(value = “dog2”)

private Dog dog;

  1. 测试,成功输出
4.6.5.3、@Resource
  • @Resource 如有指定的 name 属性,先按该属性进行 byName 方式查找装配;

  • 其次再进行默认的 byName 方式装配

  • 如果以上都不成功,则按 byType 的方式自动装配

  • 都不成功,则报异常。

  1. 在类上加注解

public class User {

@Resource(name = “cat2”)

private Cat cat;

@Resource

private Dog dog;

private String str;

}

  1. 在Spring核心配置文件中配置bean

测试:结果OK

  1. 修改核心配置文件
  1. 实体类上只保留注解

@Resource

private Cat cat;

@Resource

private Dog dog;

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 直接在属性上使用即可,也可以在set方式上使用!

  • 使用 @Autowired 我们可以不用编写Set方法了

public class People {

@Autowired

private Cat cat;

@Autowired

private Dog dog;

private String name;

public Cat getCat() {

return cat;

}

public Dog getDog() {

return dog;

}

public String getName() {

return name;

}

@Override

public String toString() {

return “People{” +

“cat=” + cat +

“, dog=” + dog +

“, name='” + name + ‘’’ +

‘}’;

}

}

4.6.5.2、@Qualifier
  • @Autowired 是根据类型自动装配的,加上@Qualifier 则可以根据名称的方式自动装配

  • @Qualifier 不能单独使用。

测试实验步骤:

  1. 配置文件修改内容,保证类型存在对象。且名字不为类的默认名字
  1. 没有加Qualifier 测试,直接报错

  2. 在属性上添加Qualifier 注解

@Autowired

@Qualifier(value = “cat2”)

private Cat cat;

@Autowired

@Qualifier(value = “dog2”)

private Dog dog;

  1. 测试,成功输出
4.6.5.3、@Resource
  • @Resource 如有指定的 name 属性,先按该属性进行 byName 方式查找装配;

  • 其次再进行默认的 byName 方式装配

  • 如果以上都不成功,则按 byType 的方式自动装配

  • 都不成功,则报异常。

  1. 在类上加注解

public class User {

@Resource(name = “cat2”)

private Cat cat;

@Resource

private Dog dog;

private String str;

}

  1. 在Spring核心配置文件中配置bean

测试:结果OK

  1. 修改核心配置文件
  1. 实体类上只保留注解

@Resource

private Cat cat;

@Resource

private Dog dog;

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

[外链图片转存中…(img-7ONkK3JM-1715650404050)]

[外链图片转存中…(img-M1LRytxA-1715650404050)]

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值