Java 面试机经(初级篇-14期)

Java 面试机经(初级篇-14期)

Java 面试机经(初级篇-14期)

三、Spring 基础

  1. Spring Framework 中有多少个模块,它们分别是什么?
    答案:
    Spring 核心容器 – 该层基本上是 Spring Framework 的核心。它包含以下模块:
    Spring Core    提供 IOC 和依赖注入特性。
    Spring Bean    Bean 工厂和 bean 的装配
    SpEL (Spring Expression Language)   spring 的表达式语言
    Spring Context   spring 的 Context 上下文即 Ioc 容器
    数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:
    JDBC (Java DataBase Connectivity)   jdbc 的支持
    ORM (Object Relational Mapping)   对象关系映射
    OXM (Object XML Mappers)            对象 xml 映射
    JMS (Java Messaging Service)          Java 的消息服务
    Transaction                                       提供事务管理
    Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:
    Web – Servlet    交互式地浏览和修改数据,生成动态 Web 内容
    Web – Socket     web 应用的通信工具
    Web – Portlet    portal 是一种 web 应用,通常用来提供个性化、单次登录、聚集各个信息
    源的内容,并作为信息系统表现层的宿主。聚集是指将来自各个信息源的内容集成到一个
    web 页面里的活动
    AOP – 该层支持面向切面编程
    Instrumentation – 该层为类检测和类加载器实现提供支持。
    Test –提供 JUnit 和 mock 测试支持。
    其他模块:
    Messaging – 为消息传递系统的集成提供了广泛的支持
    Aspects – 该模块为与 AspectJ 的集成提供支持

  2. 什么是 Spring IOC 容器?
    答案:
    Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。

  3. 什么是依赖注入(DI)?
    答案:
    依赖注入,是 IOC 的一个方面,是一个通常的概念,也就是在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是在配置文件中描述哪些组件需要哪些服务。之后由 Ioc 容器将它们组装在一起。

示例:

@Autowired
private UserService userService;

配置文件中定义:

<bean id="userService" class="com.demo.service.UserService"></bean>

 

  1. 可以通过多少种方式完成依赖注入?
    答案:
    通常,依赖注入可以通过四种方式完成,即:
    1)构造方法注入:调用被注入对象的构造方法注入,对象在构造完成就进入了就绪状态。
    2)属性注入:Autowired 属性赋值。
    3)Setter 注入:调用 setter/getter 方法。
    4)接口注入:实现某个接口。不提倡。
    各有优缺点:
    1.constructor 注入的优点:允许一个应用程序组件实现为不可变对象,并确保所需的依赖项
    不是空。缺点就是:构造器就会显得冗余,维护起来也较为困难;
    2.setter 注入的一个好处是,使类的对象可以在之后重新配置。缺点是注入的时候,不能将
    对象设为 final 的;
    3.当我们在 field 变量上来实现注入,优点是简单,缺点如下:
    a.这样不符合 JavaBean 的规范,而且很有可能引起空指针;
    b.同时也不能将对象标为 final 的;
    c.类与 DI 容器高度耦合,我们不能在外部使用它;
    d.类不通过反射不能被实例化,你需要用 DI 容器去实例化它,这更像集成测试;

示例:
构造函数注入:

public class Student {
    private String sName;
    private String sRemark;

    public Role(String sName, String sRemark) {
        this.sName = sName;
        this.sRemark = sRemark;
    }
}

配置文件:

<bean id="s1" class="Student">
    <constructor-arg index="0" value="张三"/>
    <constructor-arg index="1" value="211 本科,计算机专业,工作时间 3 年"/>
</bean>

setter 注入:

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

配置文件:

<bean id="userDao" class="UserDao"></bean> <bean id="userService" class="UserServiceImpl">
<property name="userDao" ref="userDao">
</bean>

属性注入:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
}

配置文件:

<bean id="userDao" class="UserDao"></bean> 
<bean id="userService" class="UserServiceImpl"/>
  1. spring 中有多少种 IOC 容器?
    答案:
    spring 提供两种基本的容器类型:BeanFactory 和 ApplicationContext BeanFactory:基础类型 IoC 容器,提供基本的容器服务,对该受管理的对象初始化及其依赖 注入操作。相对来说,BeanFactory 容器启动较快,所需资源有限,对于资源有限。 ApplicationContext:ApplicationContext 是在 BeanFactory 基础之上构建的,是一个比较高级 的容器,除了拥有 BeanFactory 的全部功能外,也提供其他高级特性,比如事件发布、国际 化信息支持等。ApplicationContext 所管理的对象,默认 ApplicationContext 启动之后全部初 始化并绑定完成,所以其启动较慢,占用资源较多。普通使用场景,ApplicationContext 是一 个不错的选择。

  2. 什么是 spring bean?
    答案:
    它们是构成用户应用程序主干的对象。简单来讲 bean 就相当于定义的一个组件,这个组件 是可以实现具体某些功能。这些大大小小的 bean 组合在一起,最终由 Spring IoC 容器实例 化,配置,装配和管理用于实现具体的功能。
    示例:

public class UserService {
    @Autowired
    private UserDao userDao;

    public UserService() {
    }

    public boolean hasMatchUser(String userName, String password) {
        Logger logger = Logger.getLogger(UserService.class);
        logger.info("login success " + userName);
        int matchCount = userDao.getMatchCount(userName, password);
        return matchCount > 0;
    }

    public User findUserByUserName(String userName) {
        return userDao.findUserByUserName(userName);
    }
}
  1. 解释 Spring 框架中 bean 的生命周期
    答案:
    1)Spring 容器根据配置中的 bean 定义中实例化 bean,也就是常说的 new;
    2)Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置,也就是常说的 IOC。
    3)如果 bean 实现 BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用 setBeanName()。
    4)如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
    5)如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。
    6)如果为 bean 指定了 init 方法(的 init-method 属性),那么将调用它。
    7 ) 最 后 , 如 果 存 在 与 bean 关 联 的 任 何 BeanPostProcessors , 则 将 调 用 postProcessAfterInitialization()方法。
    8)如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,则会调用 destory()方法。
    9)如果为 bean 指定了 destroy 方法(的 destroy-method 属性),那么将调用它。

 

 

上一篇:java中类加载时机


下一篇:Spring_IOC理解