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);
}
}
控制台信息如下: