Spring初体验

SSM框架

作用

  • 管理对象: 当开发人员需要某一个类的对象时,不需要自行new对象,而是通过spring直接获取即可

使用

【掌握】通过spring获取存在无参构造方法类的对象

  • 创建Maven Project
  • 当项目创建好之后,生成web.xml,解决默认提示错误
  • 选择tomcat, 项目右击 - > properties -> Target Runtimes
  • 打开 http://mvnrepository.com,搜索springwebmvc,在结果中找到的Grouporg.springframework,选择版本,并且复制xml代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>
  • 配置spring的配置文件(applicationContext.xml)
<!-- id: 自定义名称
        class : 需要spring管理的类的路径
     -->
    <bean id="date" class="java.util.Date"></bean>
  • 测试
import java.util.Date;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo1 {
    public static void main(String[] args) {
        //spring的配置文件
        String conf="applicationContext.xml";
        //获取spring容器
        AbstractApplicationContext context=new ClassPathXmlApplicationContext(conf);
        //获取配置文件中指定的bean,参数是自定义的id
        Date date=(Date) context.getBean("date");
        //打印出日期,对象创建成功
        System.out.println(date);
        context.close();
    }
}

内存泄露或者内存溢出

  • 当需要释放某个对象所占用的内存空间时,如果对象没有正确关闭,将导致无法释放,由于这个对象可能已经没有了引用,这个对象再也无法使用,却一直被误认为被使用,就会变成长期存在于内存中的垃圾数据,就是内存泄露
  • 其实少量的内存泄露是灭有危害的。但是如果存在大量的内存泄露,就可导致可用内存明显变少,计算机的运行性能就会下降,当内存泄露到极点的时候,就会溢出。尽管少量的内存泄露是没有危害的,但是应该严谨的编程,尽量不要出现内存泄露

【了解】通过spring获取类中不存在无参构造方法,但是存在静态工厂方法类的对象

  • 我们使用spring获取java.util.Calendar的对象
  • factory-method : 这个属性指定的静态工厂方法
  • 在spring的配置文件中配置这个对象
    <!-- 通过静态工厂方法创建对象
        id : 自定义的名称
        class: 类的全路径
        factory-method : 静态工厂方法
     -->
    <bean  id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean>
  • 测试
@Test
    public void testStatice() {
        // spring的配置文件
        String conf = "applicationContext.xml";
        // 获取spring容器
        AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                conf);
        // 获取配置文件中指定的bean,参数是自定义的id
        Calendar calendar=(Calendar) context.getBean("calendar");
        // 打印出日期,对象创建成功
        System.out.println(calendar.getTime());
        context.close();
    }

【了解】类中不存在无参构造方法,也没有静态工厂方法,但是存在实例工厂方法

实例工厂方法

  • 实例工厂方法: 指另一个类中有工厂方法,可以获取目标类型的对象,即X类中有工厂方法(非静态的)可以获取Y类的对象

实例

  • 假设存在PhoneFactory类中,该类中有非静态方法getPhone()可以获取Phon类型的对象,并且Phone没有无参构造方法
  • Phone
public class Phone {
    public String name;
    public Phone(String name) {
        this.name=name;
    }
}
  • PhoneFactory
public class PhoneFactory {
    public Phone getPhone() {
        return new Phone("小米6");
    }
}
​
  • spring配置文件
    • factory-bean : 是工厂类的id
    • factory-method : 工厂类获取Phone对象的非静态的方法
<!-- 配置工厂类 -->
    <bean id="phoneFactory" class="cn.tedu.spring.beans.PhoneFactory"></bean>
​
    <!-- 配置Phone类的对象
        factory-bean : 是工厂类的id
        factory-method : 工厂类获取Phone对象的非静态的方法
     -->
    <bean id="phone" class="cn.tedu.spring.beans.Phone" factory-bean="phoneFactory" factory-method="getPhone"></bean>
​

Bean的作用域(Scope)

  • 默认情况下,由spring配置的对象是单例的
  • 在配置时,在<bean>节点添加scope属性即可调整,当该属性为singleton时是单例的,当属性为prototype为非单例的
    <!-- id: 自定义名称
        class : 需要spring管理的类的路径
     -->
    <bean id="date" class="java.util.Date" scope="prototype"></bean>

单例(Singleton)

懒加载

  • 在默认情况下,spring创建对象的是使用饿汉式,即是在spring配置文件开始加载的时候就创建对象,但是我们可以使用lazy-init取值我true的时候,就会使用懒加载(懒汉式)
<bean id="date" class="java.util.Date" scope="singleton" lazy-init="true"></bean>

prototype

  • 一个Bean定义对应多个对象实例

request

  • 在一次Http请求中,一个Bean只创建一个实例,仅限于web环境

session

  • 在一个HttpSession中,一个Bean定义对应一个实例

globalSession

  • 在一个全局的HttpSession中,一个bean定义对应一个实例

Bean的延迟初始化

  • 在spring创建Bean的实例的时候默认是使用单例,并且是饿汉式加载,即是在spring的配置文件在开始加载的时候就创建bean的实例对象
  • 但是我们可以使用lazy-init来延迟初始化,使用懒加载即可,当lazy-init为true的时候便是延迟加载
<bean id="date" class="java.util.Date"  lazy-init="true"></bean>
  • 我们还可以在<beans>根节点中添加一个default-lazy-init,可以为容器中的所有bean设置为懒加载
<beans default-lazy-init="true"></beans>

spring配置文件的全部约束

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

阿里历年经典Java面试题汇总

当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。

15020
来自专栏余林丰

JVM入门——运行时数据区

jdk1.7.0_79  ?   这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课。其中的“堆”和“虚拟机栈(栈)”更是耳熟能详。...

22150
来自专栏Petrichor的专栏

tensorflow: 对variable_scope进行reuse的两种方法

在tensorflow中,为了 节约变量存储空间 ,我们常常需要通过共享 变量作用域(variable_scope) 来实现 共享变量 。

3.8K60
来自专栏黑泽君的专栏

c语言基础学习10_文件操作02

============================================================================= ==...

45910
来自专栏张善友的专栏

URL安全的Base64编码

Base64编码可用于在HTTP环境下传递较长的标识信息。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Ba...

80290
来自专栏C/C++基础

Linux命令(13)——cut命令

(1)以字符为单位输出指定范围的字符。 首先使用cat命令显示原文本文件内容如下:

9920
来自专栏Java3y

单例模式你会几种写法?

16930
来自专栏CaiRui

Bash Shell 小试牛刀

一、终端打印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo...

19560
来自专栏技术博文

PHP文件操作类

<?php /*************************************************************************...

36460
来自专栏嵌入式程序猿

freeRTOS任务创建

我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我...

42170

扫码关注云+社区

领取腾讯云代金券