Spring_001
首先,准备一堆jar包,具体用哪个我也不知道:
这个我是使用IDEA进行自动添加jar包时给我准备的,有好多 = =!
导入包后,让我来开始我的第二个spring简单程序:
Bean类:
public class HelloWorld {
private String Message;
public void getMessage() {
System.out.println("your message: "+Message);
}
public void setMessage(String message) {
Message = message;
}
}
运行类
public static void main(String[] args) {
//获取我也不知道的东西
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("Beans.xml");
//设置
HelloWorld helloWorld = (HelloWorld) applicationContext.getBean("helloworld");
//go
helloWorld.getMessage();
}
配置文件:
<?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">
<!-- HelloWorld配置文件 -->
<bean id="helloworld" class="com.tutorialspoint.HelloWorld">
<property name="Message" value="这个东西我希望有点儿意思..."></property>
</bean>
</beans>
这三个就能运行了。下面让我自己理解一下:
ApplicationContext:这个容器是用来加载配置文件中的bean,把所有的bean加载后放到一起,然后在需要的时候分配给不同的对象。
个人感觉像一个Map一样。可以根据键(key)来获取 值(value)。
常被使用的ApplicationContext接口的实现:
1.FileSystemXmlApplicationContext:从配置文件中加载bean,需要提供完整路径,我曹是绝对路径QAQ
2.ClassPathXmlApplicationContext:功能同上,不需要提供完整路径,但需要配置正确的classPath
3.WebXmlApplicationContext:从web应用程序的范围内加载xml中配置好的bean
getBean:用来获取容器中保存的bean,根据id进行选择。
bean的属性:
属性 | 描述 |
class | 强制性的,指定用来创建bean的bean类 |
name | 用来指定唯一的bean标识符,基于xml的配置元数据中,使用ID和(或)name来指定bean标识符 |
scope | 指定作用域 |
constructor-arg | |
properties | |
autowiring mode | |
lazy-initialization mode | 延迟初始化的bean类,告诉容器第一次初始化的时候,不要立刻生成它的bean实例 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法 |
Spring配置元数据:
三个重要的提供方法:
- 基于XML的配置文件
- 基于注解的配置
- 基于Java的配置
Bean的作用域:
作用域 | 描述 |
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
global-session | 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境 |
singleton作用域:是在创建容器同时自动创建了一个bean的实例,每次获取到的对象都是同一个对象。
例子:
//测试缺省作用域singleton
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("Beans.xml");
//建立第一个对象objectA
HelloWorld objectA = (HelloWorld) applicationContext.getBean("helloworld");
objectA.setMessage("你好,世界!");
objectA.getMessage();
//建立第二个对象objectB
HelloWorld objectB = (HelloWorld) applicationContext.getBean("helloworld");
objectB.getMessage();
运行结果
your message: 你好,世界!
your message: 你好,世界!
从这个结果可以看出来,在创建容器的时候bean的值已经固定了,如果你改变第一个bean实例的值,
那么第二个获取这个实例的值也会变成之前那个对象所修改的值
prototype作用域:原型类型,每获取一个bean实例创建一个实例对象
测试代码:
//获取Sring IoC容器
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("Beans.xml");
//objectA
HelloWorld objectA = (HelloWorld) applicationContext.getBean("prohello");
objectA.setMessage("你好,世界!");
objectA.getMessage();
//objectB
HelloWorld objectB = (HelloWorld) applicationContext.getBean("prohello");
objectB.getMessage();
运行结果:
your message: 你好,世界!
your message: 这个是prototype
由此可见,这个prototype的scope属性值,每一次获取一个bean就会生成一个全新的bean实例。
Bean的声明周期:从需要实例化开始到不需要移除,这就是一个最基本的生命周期。可以在bean的属性中设置
init-method和destroy-method,来查看bean的实例化和销毁。
第一种实现方式:
//初始化回调方法 实现 Initializable
public class ExampleInitBean implements Initializable{
@Override
public void init() throws Exception(){
//初始化回调方法
}
}
//销毁回调方法 实现DisposableBean
public class ExampleDestroyBean implements DisposableBean{
@Override
public void destroy() throws Exception(){
//销毁回调方法
}
}
第二种实现方式:在配置文件中bean属性上 添加 init-method(destroy-method)属性 值为你所要使用的自定义方法
xml配置:
//xml
<bean id="lifehell" class="完整报名.类名" init-method="方法名"
destroy-method="方法名" />
//仅供测试
运行类:
//获取SpringIoC容器
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("Beans.xml");
//实例化bean
HelloWorld object = (HelloWorld) applicationContext.getBean("lifehell");
//执行方法 观察结果
object.getMessage();
//没有调用销毁方法,。。。在 JVM 中你要注册关闭 hook就可以正常关闭了
运行结果:
初始化...
your message: null
在HelloWorld类中,我新添加了俩个方法 init() 和 destroy() 这俩个方法
public void init(){
System.out.println("初始化...");
}
public void destroy(){
System.out.println("销毁...");
}
但是运行结果却只使用了init的方法初始化提示,没有使用销毁提示,如果想要完整实现需要关闭JVM虚拟机中的
注册关闭 hook
今天就到这里了,该下课了。
我使用的是W3SHOOL的教程。
ByeBye