Spring常见问题

本文最后更新于:5 天前

Spring常见问题

1、Scope属性的作用与取值

1
2
3
4
<bean id="userDAO" class="UserDAOImpl"/>
<bean id="userService" class="UserService" scope="prototype">
<property name="userDAO" ref="userDAO"/>
</bean>

1、默认情况下,scope="singleton",表示单例模式,由IOC容器自动创建且全局唯一。

2、scope="prototype",表示多例模式,每一次调用getBean()时,会创建新的对象。

3、scpoe="request"/"session"

如果在工程中引入了SpringMVC,这两个属性就生效了,含义是:

request,如果在同一个“request”请求内,对象是同一个。不同的请求,IOC容器会创建不同的对象。

session,同一个session内部,多次调用getBean()获取的是同一个对象。不同的session,IOC会创建不同的对象。

4、scope属性决定了在Spring工程中创建对象是单例还是多例。

2、lazy-init属性的作用

1
2
3
4
<bean id="userDAO" class="UserDAOImpl"/>
<bean id="userService" class="UserService" lazy-init="true">
<property name="userDAO" ref="userDAO"/>
</bean>

lazy-init:懒加载,当设置为true时,表示只有用到这个Bean时,才会实例化。

注意:当scope属性为"prototype"多例模式时,lazy-init就会失效。

lazy-init有自己的使用场景,因为其作用是对象在第一次getBean()时被创建,所以可以起到减小服务器压力的作用。

比如:当前有上千个类,但并不是所有的类都是目前需要的,有些是作为备用选项使用的。此时我们就可以使用lazy-init来减轻服务器和内存的压力,有利于系统的快速启动。

3、@Autowired与@Resource有什么区别

1、@Autowired:Spring提供的注入注解,由第三方提供;@Resource:java官方进行的定义

2、二者的机制不同,@Autowired只能按照类型在IOC容器中进行匹配。而@Resource可以通过设置“name”属性指定Bean id,可以按照“name”进行匹配。

@Resource不设置“name”属性时,会将“属性名”作为默认的“Bean id”在IOC容器中进行查找,当属性名和IOC容器中的“bean id”不一样时,这种情况下才会跟@Autowired一样采用类型进行匹配,其更加智能。(如果设置了“name”属性,则将设置的名称作为“bean id”进行精准匹配。如果没有设置“name”属性,优先使用属性名作为“bean id”到IOC容器中进行查找,如果匹配不到,再按照类型在IOC容器中进行查找)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!