spring1 Ioc与bean配置、管理

1.bean的生命周期
可以简述为以下九步
1.实例化bean对象(通过构造方法或者工厂方法)
2*.设置对象属性(setter等)(依赖注入)
3*.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
4*.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5*.将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
6*.调用Bean的初始化方法
7*.将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
8*.使用Bean
9*.容器关闭之前,调用Bean的销毁方法

2.@Autowired 与@Resource的区别:

a. @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
b. @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用.
在这里插入图片描述

c.@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

3.@controller与@restcontroller区别
在这里插入图片描述
@RestController无法返回指定页面,而@Controller可以。
@RestController可以直接返回数据,@Controller需要@ResponseBody辅助

4.springioc原理?自己实现IOC要怎么做,有哪些步骤
(1)springioc是由spring来负责控制对象的生命周期和对象间的关系。
(2).步骤:

  • 定义用来描述bean的配置的java类
  • 解析bean配置,将bean的配置信息转换为BeanDefinition对象保存在内存中,spring中采用HashMap进行对象存储,其中会用到一些xml解析技术
  • 遍历BeanDefinition的HashMap对象,逐条取出Beanfinition对象,获取bean的配置信息,利用java的反射机制实例化对象。将实例化后的对象存放在另一个map中。

5.spring中BeanFactory和ApplicationContext的区别

ApplicationContext是BeanFactory的子类,BeanFactory无法支持spring的插件,所以ApplicationContext代替了它。ApplicationContext在BeanFactory的基础上做了扩展:

  • 提供国际化的消息访问
  • 资源访问 如URL和文件
  • 事件传递
  • Bean的自动装配
  • 各种不同应用层的Context实现

区别:
(1)如果使用ApplicationContext,那么不管你有没有或不想使用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存
(2)BeanFactory,当使用BeanFactory实例化对象时,配置的bean并不会马上被实例化,而是等到使用该bean的时候才会被实例化。好处是节约内存,坏处是速度比较慢
(3)。如果没有要求的情况下,应当使用ApplicationContext。

6.什么是IOC和DI ,DI如何实现的
Ioc叫控制反转DI叫依赖注入,是对Ioc更简单的阐述。控制反转就是对组件对象控制权的转移,从程序代码转移到外部容器,由容器来创建对象并管理对象间的依赖关系。DI是对Ioc更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件中。
依赖注入可以通过setter方法注入,构造器注入和接口注入三种方式来实现,spring支持setter注入和构造器注入,通常使用构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter注入是更好的选择,setter注入需要提供无参构造器或者无参的静态工厂方法来创建对象。

7.spring中bean的作用域有哪些
在sring早期的版本中,仅有两个作用域:singleton和prototype,前者表示以单例方式存在,后者表示从容器中调用bean时,都会返回一个新的实例

在spring2.x的版本中新增了3个作用域分别是:request(每次的Http请求都会创建一个新的bean)、session( 同一个HttpSession共享同一个bean,不同HttpSession 使用不同的bean)和globalSession(同一个全局的Session共享一个bean)

8.谈谈spring中自动装配的方式有哪些?

  • no : 不进行自动装配,手动设置Bean 的依赖关系

  • byName : 根据bean的名字进行自动装配

  • byType : 根据bean的类型进行自动装配

  • constructor : 类似于byType,不过是应用于构造器的参数,如果正好有一个bean与构造器的参数类型相同则可以自动装配,否则会导致错误。

  • autodetect : 如果有默认的构造器,则通过constructor 的方式进行自动装配,否则使用byType的方式进行装配。

  • 自动装配没有自定义装配方式那么精确,而且不能自动装配简单睡醒(基本数据类型、字符串等)在使用是要注意。

     											***帅气的远远啊***
    
发布了61 篇原创文章 · 获赞 50 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41585840/article/details/104130142
今日推荐