需求:使用Spring框架不用new创建一个对象
配置步骤
第一步:搭建环境
1.创建一个Java项目–选中创建
–创建目录结构
2.导入包,String的基础支撑包和依赖的日志包复制到lib文件下,并且加入项目中
—导入Spring基础支撑包
–导入Spring依赖的日志包
第二步:创建配置文件
1. 在项目的src下面创建配置文件applicationContext.xml中并完成配置文件的约束,约束查找位置(spring框架/docs/spring-framework-reference/html/beans.html)<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
第三步:创建对象到容器里面
1. 创建一个类package com.spring.service;
public class CustomService {
public void say() {
System.out.println("Hello World");
}
}
2.applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
让Spring框架管理对象/类
bean标签:spring管理对象的标签。作用:用于声明一个类,在启动Spring框架的时候根据该配置的类创建对象到容器里面
id:唯一标识,以供其他地方调用时的引用
class:被管理的类的全限定名。表示需要spring创建哪个类的对象.
-->
<bean id="customService" class="com.spring.service.CustomService"/>
</beans>
3.测试
package com.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.CustomService;
public class SpringTest {
@Test
public void testName() throws Exception {
//传统方式
// CustomService customService = new CustomService();
// customService.say();
//控制反转
//1.读取Spring配置文件,启动Spring框架,创建Spring容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.从Spring容器中对象获取CustomService
//getBean(“<bean>标签 id 值”,返回值类型);如果没有第二个参数,默认是 Object
CustomService customService = applicationContext.getBean("customService",CustomService.class);
customService.say();
// getBeanDefinitionNames(),Spring容器中目前所管理的所有对象.
String[] beanStrings = applicationContext.getBeanDefinitionNames();
for (String string : beanStrings) {
System.out.println("spring容器目前管理的对象:"+string);
}
}
}
4.结果图
Spring容器的两个实现
ClassPathXmlApplicationContext:通过classpath路径直接获得加载的xml文件(推荐使用)
FileSystemXmlApplicationContext:通过文件路径来获得加载的xml文件。
bean标签的细节详解
bean标签的作用
用于声明一个类,在启动Spring框架的时候根据该配置的类创建对象到容器里面属性说明
<!-- <bean>标签:用于声明一个类,在启动Spring框架的时候根据该配置的类创建对象到容器里面
name:设置对象名(唯一标识符),可以有多个名称,每个名称用逗号隔开 : name1,name2。或者每个名称用空格隔开:name1 name2
id:设置对象名(唯一标识符,功能和name一样)。不能有多个
class:用于指定对象对应的类名
scope:用于设置的对象的作用范围,可选参数如下:
*singleton:单例(默认)。表示从spring容器中无论取出该对象多少次,他们都是在同一个堆空间。
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要容器还在,一直活着
对象死亡:应用停止,容器销毁,对象死亡
*prototype:多例(原型对象)。表示从spring容器中取出该对象几个,他们就会在堆空间划分出几次空间。
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要对象被使用,一直活着
对象死亡:对象长时间不用,会被Java垃圾回收机制回收
*reqeust:web项目中,Spring将创建的对象放在request作用域中
*session:web项目中,Spring将创建的对象放在session作用域中
*globalSession:web项目中,应用域portlet环境,如果没有protlet环境相当于session
init-method:设置创建对象的时候,调用初始化方法。值为:方法名
destroy-method:设置对象被回收时,调用注销的方法。值为:方法名
当对象为单例时,容器关闭才会调用注销方法。多例是不会去调的。
-->
<bean name="customServiceImpl" class="com.zj.spring.service.impl.CustomServiceImpl"></bean>
scope属性测试
--当scope为单例时–当scope为多例时
Bean作用范围
作用范围也可以说生命周期(bean能存活多久)
在开发中主要使用 scope=“singleton”、 scope=“prototype”
对于MVC中的Action/Controller使用prototype类型,其他使用singleton