欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

J2EE常见面试题-----Spring篇

程序员文章站 2022-05-22 19:54:10
...

J2EE常见面试题–Web篇
J2EE常见面试题–基础语法篇
以上这两篇是J2EE中比较常见而且容易掉坑的问题,大家可以看看。
闲言少叙,回归正题,我来给大家总结一下Spring中比较基础,但是面试容易答不出来的题型。

  1. Spring核心----IOC与DI
    IOC:IOC也称控制反转,是一种设计理念,IOC是一种设计理念,而不是实现技术,它的设计理念是将对象交给第三方进行管理与控制,从而减少了代码耦合度,提高了开发效率。IOC的核心是applicationContext对象,通过加载对应的XML文件,而将配置在XML文件的类全部实例化,该对象的getBean()可以获取配置过的对象,所以applicationContext也称为IOC容器。
    DI:DI称为依赖注入,是IOC的技术实现,由对象容器在运行时注入对象,底层实现是基于反射以及工厂模式。
  2. Spring中Bean的实例化方式

一、类构造器模式
test.xml文件

<bean id="user" class="com.app.test.user"></bean>

实体类

class user{
private String name;
private Integer age;
user(){
System.out.println("hello world");
}

入口类

ApplicationContext context = new FileSystemXmlApplicationContext("classPath:test.xml");

在创建了IOC容器之后,IOC容器会自动将XML配置文件中的user实例化,所以控制台会出现那行经典的 hello world

二、静态工厂模式
相对于构造器方式,静态工厂只是创建了一个静态工厂
test.xml文件

<bean id="userFactort" class="com.app.test.userFactort" factory-method="test">
	<constructor-arg name="name" value="小明"/>
</bean>

实体类

class user{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
user(String name){
System.out.println("hello world");
}
}

静态工厂类

public static class userFactory{
private user user;
public static test(String name){
return new user(name);
}

入口类

ApplicationContext context = new FileSystemXmlApplicationContext("classPath:test.xml");

此时运行入口类,依然可以发现输出了hello world,因此,静态工厂其实只是隐藏了实体类的具体细节,同第一种并没有什么大的改变。
三、工厂类
相比静态工厂类,工厂类只是改为常规,去掉了static关键字。

  1. Spring的四种注入方式

关于Spring的注入方式,如果问起spring,简直就是必考项。
Spring的注入方式一共有四种,分别是
一、setter方式注入

class userDaoImpl implements userDao{
	pubilc void sayHello(){
		System.out.println("hello world");
	}
}

class userService{
	private userDao userDao;
	public void setUserDao(userDao userDao){
		this.userDao = userDao;
	}	
}

在XML配置文件中

<bean id="userService" class="com.app.test.userService">
	<property name="userDao" ref="com.app.test.userDaoImpl"/>
</bean>

通过实例化userService对象,将其中的userDao以setter的方式注入。

二、构造器注入

class userDaoImpl implements userDao{
	pubilc void sayHello(){
		System.out.println("hello world");
	}
}

class userService{
	private userDao userDao;
	public userService(userDao userDao){
		this.userDao = userDao;
	}
	
}

在XML配置文件中

<bean id="userService" class="com.app.test.userService">
	<constructor-arg name="userDao" ref="com.app.test.userDaoImpl"/>
</bean>

通过实例化userService对象,将其中的userDao以构造函数的方式注入,可以看出,这种方法同第一种有异曲同工之处。

三、注解注入
这种方式是在我们构建Spring应用中最常见的方式,通过在xml配置文件中开启注解扫描,扫描对应包下面所有带注解的类,Spring容器会将其管理,并且在其他类中使用@Autowried/@Resource就可以将其注入。

<context:component-scan base-package="com.app.test.dao"/>
//spring容器会扫描dao包下所有带注解的类,并将其进行管理
@Responstory
class userDao{
	...
}

class userService{
	@Autowried
	private userDao userDao;//	这样就完成了注入

}

这种方式是我们平时使用比较多的方式,只需开启注解扫描,之后在对应的类上加相应的注解
@Controllor:前端控制层,@Service:服务层,@Responstory:持久层:@Compenet:通用组件
之后用@Autowire注解在需要注入的属性上使用即可。

四、Java Config方式注入
这种方式是SpringBoot常用的方式,SpringBoot旨在去配置化,转而使用Java的方式进行开发。
首先,创建一个配置类,它的作用相当于XML配置文件

/**
 1. springIOC配置容器类
 2. 用于代替spring-beans.xml,生成bean对象
 */
@Configuration
public class BeanConfig {
    //生成Person实例
    @Bean(value = "person")
    public User User() {
        String name = "张三";
        int age = 29;
        return new User(name, age);
    }
}

spring入口类启动后,会自动扫描到@Configuration并将其下面的@Bean交给Spring容器管理,之后,再使用@Autowried/@Resource进行注入即可。

  1. Spring中一些基本属性的使用

一、Scope属性的作用与取值
Scope作用在于使用单例/多例模式实例化一个bean。
单例(singleton)模式实例化一个bean后,该bean会一直存在,无论在整个Spring容器中用new创建了多少该bean,这个bean总是最初创建的那个。
多例(prototype)模式创建该bean后,每当用new创建一个该bean时,就会创建一个新的bean。
二、lazy-init属性
延迟初始化,该属性为true时,spring会在使用getBean获取该bean时才初始化;该属性为false时,会在加载xml文件时便初始化。

  1. @Autowried与@Resource有什么区别

共同点
两者都是进行注入的注解
不同点
@Autowried是第三方提供,按照类型去匹配
@Resource是Java官方提供,可以按照类名进行匹配

  1. AOP有几种通知类型
    前置、后置、环绕、异常、以及返回通知
    代码正在整理,请耐心等待。。。

  2. 声明式事务
    声名式事务是指
    一、利用AOP自动提交、自动回滚数据库事务。
    二、声名式事务规则为,进入方法打开事务,成功则提交事务,运行时异常则事务回滚,这里要注意,必须使用RuntimeException才可以回滚,使用其他异常时回滚则必须设置。
    三、使用@Transactional注解进行配置,标注其为事务类/方法。