初识Spring

Spring是Java编程里面很重要的一部分,作为初学者刚接触到这里,既好奇又兴奋;这篇博客会从创建Spring项目,创建xml文件,获取IOC容器对象,懒加载以及scope控制范围几个方面初步认识Spring;

创建Spring项目

和创建普通Java项目没什么区别,因此不详细介绍,这里以创建的spring项目为例;

创建xml文件

右击spring项目中的src选择new/other...会弹出下图选项框;选中Spring Bean Configuration File,点击next输入文件名即可完成创建;

这里以app.xml为例;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
</beans>

当然,创建好我们会发现系统报错,因为少了jar包,引入我们需要的4个jar包:

获取IOC容器对象

我们首先创建一个vo类:Person

package com.jd.vo;

public class Person {

	public Person() {
		System.out.println("This is OK");
	}

}

然后需要在app.xml中配置相关信息:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<bean id="p" class="com.jd.vo.Person" ></bean>
	
</beans>

之后我们再创建个Test类,代码如下

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");
		//根据配置的app.xml中的信息直接获取已创建的对象
		Object obj = context.getBean("p");
		System.out.println(obj);
	}
}

当然,这里我们需要个jar包:

ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");是直接为app.xml中指定的类创建对象,相当于Person content = new Person();而Object obj = context.getBean("p");则是根据app.xml中的id指定获取哪一个类的实例对象,相当于Object obj = content;注意:app.xml配置信息中的id拥有唯一性---不能重复,不能是多个值;输出结果如下:

除此之外还有一种对象获取方式;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jd.vo.Person;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");

		Person person = context.getBean(Person.class);
		System.out.println(person);
	}
}

不再使用上转型,直接获取对象,只不过该方法获取时getBean()括号中不再是标识符,而是  类.class ;控制台信息如下:

懒加载 lazy-init

在xml中的lazy-init懒加载功能有三个属性值:default、true 和 false;先说懒加载的作用;一般来说,当程序执行到ApplicationContext context = new ClassPathXmlApplicationContext("app.xml"); 时对象就会被创建,但是如果你将懒加载即 lazy-init="true" 即启用懒加载功能,则对象只会在需要使用时才会创建,代码如下:

<bean id="p" class="com.jd.vo.Person" lazy-init="default" ></bean>

将app.xml中的bean信息添加lazy-init="default"(false也行),即不启用懒加载;运行一下代码:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");
	}

}

会在控制台输出构造方法中的输出语句:

然后我们将lazy-init的属性改为true;如下;

<bean id="p" class="com.jd.vo.Person" lazy-init="true" ></bean>

运行以下代码;

package com.jd.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");
		System.out.println("对象还没有创建");
		Object obj = context.getBean("p");
		System.out.println(obj);
	}

}

会在控制台显示:

我们会发现对象在执行 ApplicationContext context = new ClassPathXmlApplicationContext("app.xml"); 代码时并没有创建,而是下面代码需要用到对象时对象才被创建出来,这就是懒加载的作用;

scope 控制范围

该属性有4个属性值,分别是prototype、request、session 和 singleton;作用分别为每获取一次对象都会创建一个新的对象(不重复,获取的对象不同);每一次request响应中获取的对象都是同一个对象;每一次session会话中获取的对象都是同一个对象;每次获取的对象都是同一个对象;

我们仅以prototype和singleton进行举例;

修改app.xml中的代码:

<bean id="p" class="com.jd.vo.Person" lazy-init="true" scope="prototype"></bean>

运行以下代码,可以看出我们两次获取对象并输出:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");

		Object obj = context.getBean("p");
		System.out.println(obj);
		
		obj = context.getBean("p");
		System.out.println(obj);
	}
}

控制台信息:

我们可以很明显地看出此时创建了两个对象;然后我们再看singleton属性值的作用:

<bean id="p" class="com.jd.vo.Person" lazy-init="true" scope="singleton"></bean>

仅修改app.xml中的代码,执行上个代码框中的代码。会在控制台得到信息:

显而易见,两次获取的对象是同一个对象(构造方法仅执行一次,且两个对象的地址相同);

再谈IOC对象获取

其实在app.xml中配置信息还有一种形式,上文中是使用id作为唯一标志设置信息;除此之外,我们还可以是使用name设置需要Spring创建的对象,如下:

<bean name="d,date" class="com.jd.vo.Person" lazy-init="true" ></bean>

在这里我们仍然以Person类为例;注意:name进行标识时,可以同时有多个属性值,每个属性都可获取对象,并且为同一个对象;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");

		Object obj = context.getBean("d");
		System.out.println(obj);
		
		obj = context.getBean("date");
		System.out.println(obj);
	}
}

控制台输出:

没错,是同一个对象;

当我们需要配置的类过多时,我们就会发现逐一将类的信息写到xml中会很累,因此,大量类进行类配置到xml中的代码来了;首先,我们需要个jar包:

然后配置app.xml中的代码:

<context:component-scan base-package="com.jd.vo"></context:component-scan> 

base-package的属性值是我们的类包名;但是,注意:该方法只会为指定包中有 @Controller 、@Service 和 @Component 标记的类生成实例对象;因此,我们的Person类需要改一下,这里仅添加@Component标记为例:

package com.jd.vo;

import org.springframework.stereotype.Component;

@Component
public class Person {

	public Person() {
		System.out.println("This is OK");
	}

}

因为此方法配置的类是没有id或者name的,因此我们不使用id和name的标记符获取对象,只能通过上面提到的Person content = context.getBean(Person.class); 方式获取对象;代码如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jd.vo.Person;

public class Test {

	public static void main(String[] args) {
		//会将xml配置好的类实例化并将对象放入IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("app.xml");

		Person person = context.getBean(Person.class);
		System.out.println(person);
	}
}

控制台信息如下:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值