spring创建对象的三种方式详解
2018-01-18 17:29
507 查看
前言
我们知道spring框架的核心就是IOC容器了,那么IOC容器主要的作用就是创建对象和处理对象之间的依赖关系。本文主要讲解IOC容器创建对象的三种方式。创建对象的三种方式
1) 调用无参数构造器2) 带参数构造器
3) 工厂创建对象
包括:3.1 工厂类,静态方法创建对象
3.2 工厂类,非静态方法创建对象
1.调用无参数的构造器
具体如下:User.java
public class User { private int id; private String name; public User() { super(); System.out.println("------User对象创建【无参数构造器】------"); } public User(int id, String name) { System.out.println("-----User对象创建【带参数构造器】--------"); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
Bean.xml配置如下:
<!-- 1. 默认无参数构造器 --> <bean id="user1" class="com.nwpu.geeker.User"></bean>
测试:
// 测试:对象创建 @Test public void testIOC() throws Exception { // 创建IOC容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/bean.xml"); // 获取容器中的对象 User user = (User) ac.getBean("user"); System.out.println(user); }
2.带参数构造器创建对象
例如:上面的user.java 有带参的构造器,参数列表为(int,string).一般依赖注入对象的时候用的比较多。配置如下:
<!-- 2. 带参数构造器 --> <bean id="user2" class="com.nwpu.geeker..User"> <constructor-arg index="0" type="int" value="100"></constructor-arg> <constructor-arg index="1" type="java.lang.String" value="Jack"></constructor-arg> </bean>
其中index属性表示参数的位置。Type表示类型,value表示赋值,还有一个ref属性下面将会介绍,表示可以引用IOC容器创建好的(已存在的)对象。
配置如下:
<!-- 定义一个字符串,值是"Jack" ; String s = new String("jack")--> <bean id="str" class="java.lang.String"> <constructor-arg value="Jacks"></constructor-arg> </bean> <bean id="user3" class="com.nwpu.geeker.User"> <constructor-arg index="0" type="int" value="100"></constructor-arg> <constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg> </bean>
ref属性引用的就是IOC容器创建对象的id属
4000
性值。
3.通过工厂类创建对象
3.1 通过实例化工厂,非静态方法创建对象先创建工厂javaBean
// 工厂,创建对象 public class ObjectFactory { // 实例方法创建对象 public User getInstance() { return new User(100,"工厂:调用实例方法"); } // 静态方法创建对象 public static User getStaticInstance() { return new User(101,"工厂:调用静态方法"); } }
配置文件:
<!-- # 3.1 工厂类,实例方法 --> <!-- 先创建工厂 --> <bean id="factory" class="com.nwpu.geeker.ObjectFactory"></bean> <!-- 在创建user对象,用factory方的实例方法 --> <bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>
其中: factory-bean=”factory”指定工厂。factory-method=”getInstance”指定工厂的哪个方法。
3.2 工厂类: 静态方法创建对象
<bean id="user" class="com.nwpu.geeker.ObjectFactory" factory-method="getStaticInstance"></bean>
class 指定的就是工厂类型,这里是和上面配置不同的地方。
factory-method 一定是工厂里面的“静态方法”
创建对象的细节问题
1) 对象创建: 单例/多例在bean.xml配置文件中,配置scope=”singleton”,为单例创建对象,如果不配置,默认也是单例方式。主要应用于service/dao层还有一些utils工具类等只需要在服务器启动时初始化一次即可。
scope=”prototype”,表示多例方式创建对象,也就是当用户需要使用这个对象时即创建对象,在ssh项目整合中主要应用于Action对象。这种方式一般在服务器启动时不会创建对象,在每次使用才创建。
2) 什么时候创建?上面其实已经说了
scope=”prototype” 在用到对象的时候,才创建对象。(在ioc容器初始化之后)
scope=”singleton” 在服务器启动时候(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
3)是否延迟创建
lazy-init=”false” 默认为false, 不延迟创建,即在启动时候就创建对象
lazy-init=”true” 延迟初始化, 在用到对象的时候才创建对象
(只对单例有效)因为多例本来就是访问对象时才创建。
4) 创建对象之后,初始化/销毁
init-method=”init_user” 【对应对象的init_user方法,在对象创建好之后执行 】
destroy-method=”destroy_user” 【在调用容器对象的destroy方法时候执行,(容器用实现类)】
public class User { private int id; private String name; public User() { super(); System.out.println("------User对象创建------"); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void init_user() { System.out.println("创建对象之后,初始化"); } public void destroy_user() { System.out.println("IOC容器销毁,user对象回收!"); } }
测试:
@Test public void testIOC() throws Exception { // 得到IOC容器对象 【用实现类,因为要调用销毁的方法】 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/applicationContext.xml"); System.out.println("-----容器创建-----"); // 从容器中获取bean User user1 = (User) ac.getBean("user"); User user2 = (User) ac.getBean("user"); System.out.println(user1); System.out.println(user2); // 销毁容器对象 ac.destroy(); } @Test public void test() throws Exception { // 容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/applicationContext.xml"); System.out.println("-----容器创建完成-----"); User user1 = (User) ac.getBean("user1"); }
相关文章推荐
- spring 创建对象的三种方式
- spring创建对象的三种方式及时间
- Spring(IOC) 对象创建三种方式、对象bean起别名
- spring详解:bean的三种创建方式
- spring通过xml文件创建对象的三种方式
- spring在配置文件中bean对象创建的三种方式
- spring入门:beans.xml不提示、别名、创建对象的三种方式
- spring IOC容器创建对象的三种方式
- Spring创建对象的三种方式以及创建时间
- Spring容器创建对象的三种方式
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- 创建线程对象的三种方式
- Spring - 开始 , IOC创建对象,别名 和 创建对象的方式
- spring-01 spring的bean管理(使用配置文件方式创建对象 附代码)
- spring 定时任务调度的三种方式详解
- Spring管理Bean的三种创建方式
- Spring创建Bean的三种方式
- Spring依赖注入的三种方式详解之二:构造方法注入
- Spring 4.0 学习日记(2) --IOC 创建对象方式小记
- Spring IOC容器创建对象的方式