J2EE常见面试题-----Spring篇
J2EE常见面试题–Web篇
J2EE常见面试题–基础语法篇
以上这两篇是J2EE中比较常见而且容易掉坑的问题,大家可以看看。
闲言少叙,回归正题,我来给大家总结一下Spring中比较基础,但是面试容易答不出来的题型。
- Spring核心----IOC与DI
IOC:IOC也称控制反转,是一种设计理念,IOC是一种设计理念,而不是实现技术,它的设计理念是将对象交给第三方进行管理与控制,从而减少了代码耦合度,提高了开发效率。IOC的核心是applicationContext对象,通过加载对应的XML文件,而将配置在XML文件的类全部实例化,该对象的getBean()可以获取配置过的对象,所以applicationContext也称为IOC容器。
DI:DI称为依赖注入,是IOC的技术实现,由对象容器在运行时注入对象,底层实现是基于反射以及工厂模式。 - 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关键字。
- 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进行注入即可。
- Spring中一些基本属性的使用
一、Scope属性的作用与取值
Scope作用在于使用单例/多例模式实例化一个bean。
单例(singleton)模式实例化一个bean后,该bean会一直存在,无论在整个Spring容器中用new创建了多少该bean,这个bean总是最初创建的那个。
多例(prototype)模式创建该bean后,每当用new创建一个该bean时,就会创建一个新的bean。
二、lazy-init属性
延迟初始化,该属性为true时,spring会在使用getBean获取该bean时才初始化;该属性为false时,会在加载xml文件时便初始化。
- @Autowried与@Resource有什么区别
共同点
两者都是进行注入的注解
不同点
@Autowried是第三方提供,按照类型去匹配
@Resource是Java官方提供,可以按照类名进行匹配
-
AOP有几种通知类型
前置、后置、环绕、异常、以及返回通知
代码正在整理,请耐心等待。。。 -
声明式事务
声名式事务是指
一、利用AOP自动提交、自动回滚数据库事务。
二、声名式事务规则为,进入方法打开事务,成功则提交事务,运行时异常则事务回滚,这里要注意,必须使用RuntimeException才可以回滚,使用其他异常时回滚则必须设置。
三、使用@Transactional注解进行配置,标注其为事务类/方法。