Spring必知必会
Spring Bean的生命周期?
Spring IoC容器本质目的是为了管理Bean,对于Bean而言在容器中存在生命周期,它的初始化和销毁也需要一个过程,在一些需要自定义的过程中可以插入一些代码去改变一些它们的行为。
- 初始化、依赖注入;
- 依次实现接口方法:BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor(其实现类针对所有的Bean生效)、BeanFactoryPostProcessor;
- 执行Bean自定义的初始化方法;
当关闭Spring IoC容器时会调用对于的方法来销毁Bean - 执行实现的DisposableBean接口的destroy方法;
- 执行Bean自定义的销毁方法。
BeanFactory和ApplicationContext有什么区别?
BeanFactory是Spring容器所定义的最底层的接口,
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。
BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
ApplicationContext是BeanFactory的一个子接口,对BeanFactory功能进行了扩展,绝大部分场景下都会使用ApplicationContext作为Spring容器
ApplicationContext的常见实现:ClassPathXmlApplication、FileSystemXmlApplicationContext、XmlWebApplicationContext
BeanFactory和FactoryBean的区别?
BeanFactory:为Spring IoC的最底层接口,是个Factory或对象工厂,所有的Bean都是由IoC容器也就是BeanFactory管理的;
FactoryBean:是一个能生产或者修饰对象生成的工厂Bean,Spring通过反射机制利用
Spring有几种配置方式?
- Xml配置:<beans>标签
- 注解配置:注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。开启后才能使用,几种重要的注解:@Required、@Autowired、@Qualifier及JSR-250下的:@Resource、@PostConstruct 和 @PreDestroy
<beans>
<context:annotation-config/>
</beans>
- Java配置:由@Configuration注解和@Bean注解来实现,被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。
Spring Bean的作用域?
- singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。
- prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
- request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
- global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。
Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对 单例bean进行任何多线程的封装处理。关于单例bean的 线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Service类和DAO类);如果Service类中有全局变量例如SimpleDateFormat这种线程不安全的东西,就需要自行保证线程安全;或者将bean作用域改为prototype
依赖注入的三种方式的区别?
- 构造器注入:依赖于构造方法实现,xml中使用<constructor-arg index="0" value="***"/>注入,index为参数位置;缺点是如果参数过多,构造方法就比较复杂了;
- Setter注入:Spring通过反射调用无参构造方法生成对象,然后通过反射对应的setter方法注入配置的值;这种方法为Spring最主要的方式;
- 接口注入:通过@AutoWired/@Resource注入的接口,Spring按类型或名称进行查找接口实现的bean来完成注入;
使用接口的原因:
- AOP程序的思想,给别人调用的接口,调用这只想知道方法和功能,而对于这个方法内部逻辑实现并不关心。
- 降低各个模块间的关联,实现松耦合、程序分成、最主要的体现了继承只能单继承,接口却可以多实现
Spring 框架中都用到了哪些设计模式?
- 代理模式:在AOP和remoting中被用的比较多。
- 单例模式:在spring配置文件中定义的bean默认为单例模式。
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 工厂模式:BeanFactory用来创建对象的实例。
在Spring中如何注入一个Java Collection?
<beans>
<!-- Definition for javaCollection -->
<bean id="javaCollection" class="com.howtodoinjava.JavaCollection">
<!-- java.util.List -->
<property name="customList">
<list>
<value>INDIA</value>
<value>Pakistan</value>
</list>
</property>
<!-- java.util.Set -->
<property name="customSet">
<set>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</set>
</property>
<!-- java.util.Map -->
<property name="customMap">
<map>
<entry key="1" value="INDIA"/>
<entry key="2" value="Pakistan"/>
<entry key="3" value="USA"/>
<entry key="4" value="UK"/>
</map>
</property>
<!-- java.util.Properties -->
<property name="customProperies">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean>
</beans>

浙公网安备 33010602011771号