Java主流框架面试题

Java主流框架Spring IoCIoC理解IoC理解Spring AOPAOP的理解Spring MVCmvc结构的理解Spring IoCIoC理解IoC理解Spring AOPAOP的理解Spring MVCmvc结构的理解
摘要由CSDN通过智能技术生成

1.Spring IOC

IOC与DI的理解

一:IOC控制反转(宏观方面-设计理念)
1、IOC控制反转全称Inverse of Control,是一种设计理念,是宏观方面的
2、由第三方来管理和控制对象
3、IOC根本目的:降低对象之间直接耦合
在这里插入图片描述
二:DI依赖注入(是IOC理念的技术实现)
1、IOC是一种设计理念,是现代程序设计遵循的标准,是宏观目标
2、DI是一种具体技术实现,是微观实现,是对宏观的IOC理念的一种技术上诠释
3、DI在Spring中利用反射技术和工厂模式实现对象注入

&&原始的创建对象
  IDAO dao = new UserDAO();
&&DI(IOC)创建对象
  //在运行时applicationContext对象创建userDAO类
  IDAO dao = (DAO)applicationContext.getBean("userDAO");
  <bean id="userDAO" class="com.imooc.dao.UserDAO"/>
  <bean id="userDAO" class="com.imooc.dao.UserExtDAO"/>

Spring Bean实例化对象的三种形式

1、基于构造方法实例化对象
2、基于静态工厂实例对象
3、基于工厂实例方法实例化对象

一:基于构造方法实例化对象
1、Apple实体类

public class Apple {
   
    public String title;
    public String color;
    public String origin;
    public Float price;	
	
	// .... getter和setter、无参构造方法、有参构造方法
}

2、applicationContext.xml配置Bean指向Apple,通过bean标签对象实例化

    <!--构造函数实例化-->
    **<!--使用无参构造方法实例化对象-->**
    <bean id="apple1" class="com.imooc.spring.ioc.entity.Apple">
    </bean>
    **<!--使用带参构造方法实例化对象-->**
    <bean id="apple2" class="com.imooc.spring.ioc.entity.Apple">
        <constructor-arg name="title" value="红富士"/>
        <constructor-arg name="color" value="红色"/>
        <constructor-arg name="origin" value="欧洲"/>
        <constructor-arg name="price" value="19.8"/>
    </bean>

3、创建IOC容器

//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new  ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());

二:基于静态工厂实例对象
1、AppleStaticFactory类

/**
 * 静态工厂通过静态方法创建对象,
隐藏创建对象的细节
 */
public class AppleStaticFactory {
   

    /**
     * spring如何通过AppleStaticFactory
静态工厂调用createSweetApple方法
     */
    public static Apple createSweetApple(){
   
        Apple apple = new Apple();
        apple.setTitle("红富士");
        apple.setOrigin("欧洲");
        apple.setColor("红色");
        return apple;
    }
}

2、applicationContext.xml配置Bean指向AppleStaticFactory,通过bean标签对象实例化

<!--利用静态工厂实例化对象-->
<bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory" factory-method="createSweetApple"/>

3、创建IOC容器

//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new  ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());

三:基于工厂实例方法实例化对象
1、AppleFactoryInstance 工厂实例

/**
 * 工厂实例方法创建对象是指IOC容器对工厂类进行实例化
 * 并调用对应的实例方法创建对象的过程
 */
public class AppleFactoryInstance {
   

    /**
     * createSweetApple 是属于AppleFactoryInstance工厂对象的,
     * 而不是属于工厂类的
     * @return
     */
    public Apple createSweetApple(){
   
        Apple apple = new Apple();
        apple.setTitle("红富士1");
        apple.setOrigin("欧洲");
        apple.setColor("红色");
        return apple;
    }
}

2、applicationContext.xml配置Bean指向AppleFactoryInstance,通过bean标签对象实例化

<!--利用工厂实例化对象-->
<bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>

3、创建IOC容器

//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new  ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());

谈谈Spring Bean的生命周期和作用域?

Spring Bean 生命周期比较复杂,可以分为创建和销毁两个过程。
一:首先,创建 Bean 会经过一系列的步骤,主要包括:
1、实例化 Bean 对象。
2、设置 Bean 属性。
3、如果我们通过各种 Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依赖。具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分别会注入 Bean ID、Bean Factory 或者 ApplicationContext。
4、调用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization。
5、如果实现了 InitializingBean 接口,则会调用 afterPropertiesSet 方法。
6、调用 Bean 自身定义的 init 方法。调用 BeanPostProcessor 的后置初始化方法 postProcessAfterInitialization。
7、创建过程完毕。
如下图:
在这里插入图片描述
二:Spring Bean 的销毁过程会依次调用 DisposableBean 的 destroy 方法和 Bean 自身定制的 destroy 方法。
Spring Bean 有五个作用域,其中最基础的有下面两种:
1、Singleton,这是 Spring 的默认作用域,也就是为每个 IOC 容器创建唯一的一个 Bean 实例。
2、Prototype,针对每个 getBean 请求,容器都会单独创建一个 Bean 实例。
从 Bean 的特点来看,Prototype 适合有状态的 Bean,而 Singleton 则更适合无状态的情况。
另外,使用 Prototype 作用域需要经过仔细思考,毕竟频繁创建和销毁 Bean 是有明显开销的。

如果是 Web 容器,则支持另外三种作用域:
1、Request,为每个 HTTP 请求创建单独的 Bean 实例。
2、Session,很显然 Bean 实例的作用域是 Session 范围。
3、GlobalSession,用于 Portlet 容器,因为每个 Portlet 有单独的 Session,GlobalSession 提供一个全局性的 HTTP Session。

知识扩展
一:Spring 的基础机制
1、控制反转(Inversion of Control),或者也叫依赖注入(Dependency Injection),广泛应用于 Spring 框架之中,可以有效地改善了模块之间的紧耦合问题。
从 Bean 创建过程可以看到,它的依赖关系都是由容器负责注入,具体实现方式包括带参数的构造函数、setter 方法或者AutoWired方式实现。
2、AOP这种切面编程机制,Spring 框架中的事务、安全、日志等功能都依赖于 AOP 技术。
Spring AOP (Aspect Orient Programming),直译过来就是 面向切面编程。
AOP的做法是将通用、与业务无关的功能抽象封装为 切面类。
切面可配置在目标方法的执行前、后运行,真正做到即插即用。
AOP的最终目的:在不修改源码的情况下对程序行为进行扩展。

Spring的IOC四种注入方式

一:setter注入

二:构造器注入
即通过构造函数完成依赖关系的设定。

三:注解注入
即通过注解方式完成依赖关系的设定
@Resource先会按照名称到spring容器中查找,如果查找不到,就回退按照类型匹配,如果再没有匹配到,就会抛出异常。如果在开发的时候,建议大家都是用@Resource(name=”us

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值