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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值