一篇文章带你理解Spring框架( 三 )
9、怎样用注解的方式配置Spring?
Spring在2.5版本以后开始支持用注解的方式来配置依赖注入 。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可 。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果 。
注解装配在Spring中是默认关闭的 。所以需要在Spring文件中配置一下才能使用基于注解的装配模式 。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置 。
<beans><context:annotation-config/><!-- bean definitions go here --></beans>在 <context:annotation-config/>标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量 。
下面是几种比较重要的注解类型:
- @Required:该注解应用于设值方法 。
- @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量 。
- @Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义 。
- JSR-250 Annotations:Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy 。
Spring Bean的生命周期简单易懂 。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态 。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除 。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期 。Bean的生命周期由两组回调(call back)方法组成 。
- 初始化之后调用的回调方法 。
- 销毁之前调用的回调方法 。
- InitializingBean和DisposableBean回调接口
- 针对特殊行为的其他Aware接口
- Bean配置文件中的Custom init()方法和destroy()方法
- @PostConstruct和@PreDestroy注解方式
<beans><bean id="demoBean" class="com.howtodoinjava.task.DemoBean"init-method="customInit" destroy-method="customDestroy"></bean> </beans>更多内容请参考:Spring生命周期Spring Bean Life Cycle 。
11、Spring Bean的作用域之间有什么区别?
Spring容器中的bean可以分为5个范围 。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:
- 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 Bean Scopes 。
12、什么是Spring inner beans?
在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性 。一个明智的做法是将这个bean声明为内部bean 。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现 。
比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用 。
public class Customer {private Person person;//Setters and Getters } public class Person {private String name;private String address;private int age;//Setters and Getters }内部bean的声明方式如下:
<bean id="CustomerBean" class="com.howtodoinjava.common.Customer"><property name="person"><!-- This is inner bean --><bean class="com.howtodoinjava.common.Person"><property name="name" value=https://www.isolves.com/it/cxkf/yy/JAVA/2019-07-30/"lokesh" />
推荐阅读
- Mysql中的数据分组和子查询
- 梦见天空出现彩光 解梦梦见天空出现发光的彩色
- 梦到修牙预示什么 做梦梦到修牙是什么意思
- 亚麻凉席比较好的品牌有哪些
- 猴面包树是什么 猴面包树果实可以吃吗
- 四季沐歌太阳能报价清单
- 科勒马桶配件怎么样 科勒马桶配件价格
- 万喜燃气灶报价行情走势
- 新古典装修风格的装修特点
- 龙血树养殖方法及注意事项