扫码关注公众号
Bean的作用域&生命周期讲讲?(字节面试题)
Bean的作用域在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象。在BeanDefinition对象中有scope属性,就是它控制着bean的作用域。1、单例(singleton):(默认)每一个SpringIoC容器都拥有唯一的一个实例对象2、原型(prototype):一个Bean定义,任意多个对象3、请求(request):一个HTTP请求会产生一个Bean对象,也就是说,每一个HTTP请求都有自己的Bean实例。只在基于web的SpringApplicationContext中可用4、会话(session):限定一个Bean的作用域为HTTPsession的生命周期。同样,只有基于web的SpringApplicationContext才能使用5、全局会话(globalsession):限定一个Bean的作用域为全局HTTPSession的生命周期。通常用于门户网站场景,同样,只有基于web的SpringApplicationContext可用Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的ApplicationContext的时候才生效的。Bean生命周期Bean实例生命周期的执行过程如下:Spring对bean进行实例化,默认bean是单例;Spring对bean进行依赖注入;如果bean实现了BeanNameAware接口,Spring将bean的名称传给setBeanName()方法;如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory实例传进来;如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization()方法将被调用;如果bean中有方法添加了@PostConstruct注解,那么该方法将被调用;如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet()接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;如果在xml文件中通过<bean>标签的init-method元素指定了初始化方法,那么该方法将被调用;如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization()接口方法将被调用;此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;如果bean中有方法添加了@PreDestroy注解,那么该方法将被调用;若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
spring 中的 bean 是线程安全的吗?(面试题)
Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。
spring 自动装配 bean 有哪些方式?(面试题)
Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。spring中bean装配有两种方式:隐式的bean发现机制和自动装配在java代码或者XML中进行显示配置当然这些方式也可以配合使用。
说说Java Bean的命名规范
1.JavaBean类必须是一个公共类,并将其访问属性设置为public2.JavaBean类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。3.一个javaBean类不应有公共实例变量,类变量都为private4.持有值应该通过一组存取方法(getXxx和setXxx)来访问:对于每个特性,应该有一个带匹配公用getter和setter方法的专用实例变量。属性为布尔类型,可以使用isXxx()方法代替getXxx()方法。通常属性名是要和包名、类名、方法名、字段名、常量名作出区别的:首先:必须用英文,不要用汉语拼音1.包(package)用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名。比如www.sohu.com对于包名:每个字母都需要小写。比如:com.sohu.test;该包下的Test类的全名是:com.sohu.Test.Java。如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(defaultpackage)。2.类首字母大写,如果一个类由多个单词构成,那么每个单词的首字母都大写,而且中间不使用任何的连接符。尽量使用英文。如ConnectionFactory3.方法首单词全部小写,如果一个方法由多个单词构成,那么从第二个单词开始首字母大写,不使用连接符。addPerson4.字段与方法相同。如ageOfPerson5.常量所有单词的字母都是大写,如果有多个单词,那么使用下划线链接即可。如:publicstaticfinalintAGE_OF_PERSON=20;//通常加上static
Java Bean 属性命名规范问题分析
publicclassUser{privateStringbusName;privateStringpCount;privateBooleanisRunning;//正确的命名方式,驼峰式的publicStringgetBusName(){returnbusName;}publicvoidsetBusName(StringbusName){this.busName=busName;}//这是什么?publicStringgetpCount(){returnpCount;}publicvoidsetpCount(StringpCount){this.pCount=pCount;}//这个也是不允许的publicBooleangetIsRunning(){returnisRunning;}publicvoidsetIsRunning(BooleanisRunning){this.isRunning=isRunning;}}1.javabean属性命名尽量使用常规的驼峰式命名规则2.属性名第一个单词尽量避免使用一个字母:如eBook,eMail。3.boolean属性名避免使用“is”开头的名称4.随着jdk,eclipse,spring等软件版本的不断提高,底版本的出现的问题可能在高版本中解决了,低版本原来正常的代码可能在高版本环境下不再支持。