Spring中的bean
组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。
简单地讲,bean就是由IoC容器初始化、装配及管理的对象
Spring中的bean默认都是单例的(scope="singleton"默认值)
我们可以设置为多例(scope="prototype")
bean的作用域
当scope="singleton"时
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象
不管你是否使用,他都存在了,每次获取到的对象都是同一个对象
当scope="prototype"时
Prototype是原型类型,它在我们创建容器的时候并没有实例化
而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
1.通过BeanFactory或者ApplicationContext获取实例Bean
2.set属性注入
3.如果Bean实现BeanNameAware接口,则调用setBeanName(String name)方法设置Bean的name属性
4.如果Bean实现BeanFactoryAware接口,则调用setBeanFactory(BeanFactory beanFactory)方法,设置创建该Bean的工厂
5.如果有定义BeanPostProcessor接口,则调用该接口的postProcessBeforeInitialization(Object bean, String beanName)方法
该方法可以对Bean实例进行额外的增加处理操作。可以是全局针对所有Bean进行统一处理,ApplicationContext初始化时会自动找到实现该接口的类进行所有Bean的增强处理。
6.如果Bean实现了InitializingBean接口,且该接口有 @PostConstruct修饰的方法,则执行该方法(该注解方法是在BeanPostProcessor的postProcessBeforeInitialization中执行的),然后执行afterPropertiesSet()方法;
该方法没有参数,不能对该Bean进行处理,可以增加比如日志、读取配置文件之类的操作。
7.如果Bean自定义了init-method指定的方法,则调用该方法
8.接着调用BeanPostProcessor接口的postProcessAfterInitialization(Object bean, String beanName)方法
9.如果Bean实现了DisposableBean接口,则调用该接口的destory()方法。同InitializingBean类似,该接口如果有指定@PreDestory注解修饰的方法,也会先调用该方法。
10.如果Bean指定了destory-method方法,则执行该方法
以上为Bean生命周期顺序。
说明:
1.afterPropertiesSet()和init-method有什么区别
afterPropertiesSet()依赖InitializingBean接口实现,Bean定义时必须实现该接口才能使用,对代码有一定的侵入。init-method只需要指明要调用哪个方法就可以了。同理DiaposableBean的destory()方法和destory-method。
但是afterPropertiesSet()执行效率比init-method指定的方法高,该方法是直接调用执行,而init-method指定的方法需要通过反射调用。
init-method和destory-method指定的方法必须是一个无参的方法,否则,初始化会报错。
面试题
1.有哪些不同的IOC依赖注入方式
直接的注入(seter)
构造注入
P命名标签注入
往集合内注入(<constructor-ary></constructor-ary>)
默认往域属性内注入(autowire="byType"与autowire="byName")
2.java九大隐式对象有哪些
request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request 对象主要用于处理客户端请求,在(页面转发,获取cookie)用到
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page 用于处理响应客户端请求,在(页面重定向)中使用
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page 用于获取页面的上下文,通过此对象可以获取页面的其他8个内置对象
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session 在网络中被称为会话,一个会话就是浏览器与服务器之间的一次通话(保存登录状态时)
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application 就像全局变量,用于保存应用程序中的共有数据(上传时获取真实路径)
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page 对象用于在web浏览器内输出信息,数据输出完,要及时关闭输出流
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page 用于取得服务器的配置信息
page 页面对象 类型 javax.lang.Object 作用域 Page 代表jsp本身,只有在jsp页面内才是合法的
exception 例外对象 类型 javax.lang.Throwable 作用域 page 用于处理jsp页面发生的异常
3.数据库里的索引和约束是什么
索引:指向表中数据的指针,把书比作数据,各个章节就相对于数据库中的表,而书的目录就是索引了。
约束:设计数据库完整性的目的是为了防止数据库存在不符合语义的数据,防止错误信息的输入和输出
4.DAO的工作原理,能不能重载
Dao接口就是Mapper接口。映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略
5.Mybatis时如何进行分页的,原理是什么
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
原理:是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
原文地址:https://www.cnblogs.com/haohanwuyin/p/11756610.html