spring学习笔记

编程入门 行业动态 更新时间:2024-10-10 01:19:04

spring<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记"/>

spring学习笔记

1.IOC容器中bean的作用域

我们可以在标签中使用scope属性来控制当前的bean对象的作用范围,scope的属性值有:
singleton: 单例模式,在不指定scope的情况下bean的默认值。单例模式其实就是创建一个静态的bean对象,也就是在内存中单独开辟一个空间,将这个对象实实在在的放在这里,你用或者不用它就在这里。单例对象会在IOC容器创建时就创建完成,在调用时永远都是同一个对象(内存地址是相同的)。

1.1.单例模式下对象在容器创建时就会创建完成,并且只会创建一次对象
在获取IOC容器时会先调用构造方法创建user对象,之后执行main方法中的打印,比较多次获取user对象后的地址,返回的是true

prototype: 多例模式,在每次通过IOC容器获取对象时,都会创建一个bean对象。
将bean指定为多实例模式。

<bean id="user" class="com.hao.spring.user.User"  scope="prototype">
</bean>


1.2.多例模式下对象在容器创建时并不会进行创建,而是在获取对象时调用构造器进行创建,获取一次就创建一个对象
在获取IOC容器时多例模式的对象并不会随着容器的创建而创建,在测试类中获取了两次对象,就调用了两次构造方法,比较地址后返回的是false

request: 在web环境下,同一次请求创建一个实例
session: 在web环境下,同一次会话创建一个实例
1.3.request、session都是在web环境下进行控制的
一般request、session范围的对象一般不会再spring中指定,我们可以在控制类中显示的进行控制,这样会更清晰

需要注意的是当前bean有父bean的时候,指定scope是没有用的,当前bean会根据父bean的作用范围来决定该对象的作用范围

spring对scope的解释:

The scope of this bean: typically “singleton” (one shared instance, which will be returned by all
calls to getBean with the given id), or “prototype” (independent instance resulting from each
call to getBean). By default, a bean will be a singleton, unless the bean has a parent bean
definition in which case it will inherit the parent’s scope. Singletons are most commonly used,
and are ideal for multi-threaded service objects. Further scopes, such as “request” or “session”,
might be supported by extended bean factories (e.g. in a web environment). Inner bean
definitions inherit the scope of their containing bean definition, unless explicitly specified: The
inner bean will be a singleton if the containing bean is a singleton, and a prototype if the
containing bean is a prototype, etc.

2.使用静态工厂方法创建对象

在IOC容器中使用工厂方法创建对象一般分为三步:创建工厂类和工厂方法、在IOC容器中进行配置、在方法中获取对象使用
2.1. 创建一个静态工厂

package com.hao.spring.factory;import com.hao.spring.user.Organization;
import com.hao.spring.user.Rule;
import com.hao.spring.user.User;public class StaticFactory {public static User getBean(String name,Integer age,String sex) {System.out.println("静态工厂创建对象");User user = new User();user.setUserName(name);user.setAge(age);user.setSex(sex);user.setOrg(new Organization(001,"综合管理部"));user.setRule(new Rule("数据查看","全数据查看权限"));return user;}
}

2.2. 在IOC容器中进行配置
我们知道在调用静态方法时,是不需要创建静态方法所在类的类对象的,而是直接在需要调用的方法中使用类名.静态方法名(其实就是指定一下你想要调用的静态方法是哪个类下的)的方式就可以实现调用了

同理,我们在IOC容器中的标签下使用class和factory-method直接指定你想要调用哪个类下的静态方法,然后使用constructor-arg为方法进行传参

<bean id="user"  class="com.hao.spring.factory.StaticFactory"  factory-method="getBean"> <constructor-arg name="name"  value="zhangsan"></constructor-arg> <constructor-arg name="age" value="21">             </constructor-arg> <constructor-arg name="sex" value="男">      </constructor-arg>
</bean>

测试使用静态工厂创建对象:

3.使用实例工厂方法创建对象

在调用非静态方式时,我们需要创建方法所在类的类对象,然后通过类对象来调用方法

同理,我们在IOC容器中使用实例工厂创建bean对象时,也需要先将实例工厂类注册到IOC容器中,然后调用工厂方法进行bean对象的创建

<!-- 注册实例工厂 -->
<bean id="insFactory" 
class="com.hao.spring.factory.InstancesFactory"></bean>
<bean id="user" class="com.hao.spring.user.User" factory-bean="insFactory" factory-        method="getBean"><constructor-arg name="name"value="zhangsan"></constructor-arg><constructor-arg name="age" value="21"> </constructor-arg><constructor-arg name="sex" value="男"></constructor-arg>
</bean>

测试使用实例工厂创建对象:

4.实现FactoryBean接口创建工厂类

spring框架提供了一个接口org.springframework.beans.factory.FactoryBean来让我们自定义创建更加强大的工厂方法,,实现了接口的类spring会进行识别,并自动调用方法。这个接口有三个方法:getObject()、getObjectType()、isSingleton();
getObject(): 负责创建和返回对象
getObjectType(): 返回对象的泛型
isSingleton(): 控制对象是否为单例模式

4.1. 实现接口及方法

package com.hao.spring.factory;import org.springframework.beans.factory.FactoryBean;
import com.hao.spring.user.User;public class ImplFactory implements FactoryBean<User> {@Overridepublic User getObject() throws Exception {User user = new User();user.setUserName("张三");user.setAge(22);user.setSex("男");user.setOrg(new Organization(001,"综合管理部"));user.setRule(new Rule("数据查看","全数据查看权限"));return user;}@Overridepublic Class<?> getObjectType() {return User.class;}@Overridepublic boolean isSingleton() {return false;}
}

4.2.在IOC容器中注册工厂对象
在IOC容器中我们只需要将工厂对象注册进来即可,不需要指定方法,spring会自动调用getObject()方法创建对象

<bean id="user"     class="com.hao.spring.factory.ImplFactory">
</bean>

1.我们在实现类中将对象的创建设置为单例时,在创建IOC容器时我们的对象是不会随之创建的,这点和在IOC容器中直接将对象设置为单例模式有所不同。

2.好像使用这种方法并不能在IOC容器中为对象初始化赋值,尴了个尬的

更多推荐

spring学习笔记

本文发布于:2024-03-05 09:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1711950.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   spring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!