博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring学习总结(一)_Ioc基础(上)
阅读量:6351 次
发布时间:2019-06-22

本文共 9221 字,大约阅读时间需要 30 分钟。

最近经历了许许多多的事情,学习荒废了很久。自己的目标成了摆设。现在要奋起直追了。最近发现了的博客。应该是一个教师。看了他写的spring系列的博客,写的不错。于是本文的内容参考自他的博客,当然都是手打书写。由于我感觉他写的博客篇幅过长。我根据我的习惯进行拆分学习。而且他的文章一系列很清楚。也值得我去学习。自己写博客就零零散散。不是很系统。

spring概述

spring可以做很多事情,它为企业级开发提供了丰富的功能。但是这些功能的底层都依赖于它的两个核心特性,控制反转(IOC)和面向切面(AOP)、

本篇文章主要介绍IOC。

现在 springboot 和spring cloud十分火爆,还是有必要看看两者之间的关系的

Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;Spring Boot使用了约束优于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系

Ioc基础

控制反转IOC是一种设计思想,DI(依赖注入)是实现IOC的一种方法。(下面的这张图画的太好了)

  • 没有IOC的程序中我们使用面向对象编程对象的创建于对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制。
  • 控制反转后将对象的创建转移给第三方。

IOC是spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用xml配置,也可以使用注解,新版本的spring可以零配置实现IOC。

使用XML配置方式实现IOC

  • 创建maven项目
  • pom文件如下
4.0.0
com.kevin
spring
1.0-SNAPSHOT
UTF-8
4.3.0.RELEASE
junit
junit
test
4.10
org.springframework
spring-context
${spring.version}
org.aspectj
aspectjweaver
1.8.9
cglib
cglib
3.2.4

使用无参构造方法创建对象

新建一个Music类

/** * 音乐 * * @author: kevin * @Date: 2018/12/8 */public class Music {    public Music() {        System.out.println("播放周杰伦的《七里香》");    }}

resources文件夹下新建music.xml

测试类

package com.kevin.spring.demo1.test;import com.kevin.spring.demo1.entity.Music;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * @author: kevin * @Date: 2018/12/8 */public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("music.xml");        Music jay = ctx.getBean("jay", Music.class);    }}

运行结果

信息: Loading XML bean definitions from class path resource [music.xml]播放周杰伦的《七里香》

使用有参构造方法创建对象

Person

package com.kevin.spring.demo2.entity;/** * 人类 */public abstract class Person {    public String name;}

Student

package com.kevin.spring.demo2.entity;/** * 学生 */public class Student extends Person{    /**     * 身高     */    public int height;    /**     * 有参构造函数     * @param name     * @param height     */    public Student(String name,int height) {        this.name = name;        this.height = height;    }    @Override    public String toString() {        return "Student{" +                "height=" + height +                ", name='" + name + '\'' +                '}';    }}

student.xml

测试类

package com.kevin.spring.demo2.test;import com.kevin.spring.demo2.entity.Person;import com.kevin.spring.demo2.entity.Student;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("student.xml");        Person kevin = ctx.getBean("kevin", Student.class);        Person maomao = ctx.getBean("maomao", Student.class);        System.out.println(maomao);        System.out.println(kevin);    }}

输出

信息: Loading XML bean definitions from class path resource [student.xml]Student{height=100, name='maomao'}Student{height=170, name='kevin'}

通过属性赋值

Animal

package com.kevin.spring.demo3.entity;/** * 动物 */public class Animal {    /**     * 动物名称     */    private String name;    public Animal() {    }    public Animal(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Animal{" +                "name='" + name + '\'' +                '}';    }}

animal.xml

测试

package com.kevin.spring.demo3.test;import com.kevin.spring.demo3.entity.Animal;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 测试类 */public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");        Animal dog = ctx.getBean("dog",Animal.class);        Animal cat = ctx.getBean("cat",Animal.class);        System.out.println(cat);        System.out.println(dog);    }}

输出结果

信息: Loading XML bean definitions from class path resource [animal.xml]Animal{name='cat'}Animal{name='dog'}

对象引用

Tyre

package com.kevin.spring.demo4.entity;/** * 轮胎 * @author: kevin * @Date: 2018/12/8 */public class Tyre {    private String name;    public Tyre(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Tyre{" +                "name='" + name + '\'' +                '}';    }}

Car

package com.kevin.spring.demo4.entity;/** * 车 */public class Car {    private String name;    private Tyre tyre;    public Car(String name, Tyre tyre) {        this.name = name;        this.tyre = tyre;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Tyre getTyre() {        return tyre;    }    public void setTyre(Tyre tyre) {        this.tyre = tyre;    }    @Override    public String toString() {        return "Car{" +                "name='" + name + '\'' +                ", tyre=" + tyre +                '}';    }}

测试

package com.kevin.spring.demo4.test;import com.kevin.spring.demo4.entity.Car;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("car.xml");        Car bike = ctx.getBean("bike", Car.class);        System.out.println(bike);    }}

输出结果

信息: Loading XML bean definitions from class path resource [car.xml]Car{name='bike', tyre=Tyre{name='自行车轮胎'}}

对象作用域

在大多数情况下,单例bean是很理想的方案。初始化和垃圾回收对象实例所带来的的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理。在这种情况下,将class声明为单例的bean会被污染,稍后重用的时候会出现意想不到的问题。 -《spring实战》

Spring定义了多种作用域,可以基于这些作用域创建bean,包括:

| 作用域 | 描述|

| :-------- | :--------:|
| 单例(Singleton) | 在整个应用中,只创建bean的一个实例 |
| 原型(Prototype) | 每次注入或者通过spring应用上下文获取的时候,都会创建一个新的bean实例 |
| 会话(Session) | 在web应用中,为每个会话创建一个bean实例 |
| 请求(Request) | 在web应用中,为每个请求创建一个bean实例 |

1、spring中默认是单例的,我们通过之前的代码演示下

测试

package com.kevin.spring.demo3.test;import com.kevin.spring.demo3.entity.Animal;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 测试类 */public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");        Animal dog1 = ctx.getBean("dog",Animal.class);        Animal dog2 = ctx.getBean("dog",Animal.class);        System.out.println(dog1 == dog2);    }}

输出结果

true

这样验证了从容器中取回的对象默认是单例的。

2、设置成Prototype

测试

ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");        Animal dog1 = ctx.getBean("dog",Animal.class);        Animal dog2 = ctx.getBean("dog",Animal.class);        System.out.println(dog1 == dog2);

输出结果

false

延迟初始化bean

ApplicationContext实现的默认行为是在启动时将所有的singleton bean 提前进行实例化。这样配置中或者运行环境的错误就会立刻发现。如果你想延迟初始化。可以在xml中进行配置

测试

public static void main(String[] args) throws InterruptedException {        ApplicationContext ctx = new ClassPathXmlApplicationContext("student.xml");        Thread.sleep(3000);        Person kevin = ctx.getBean("kevin", Student.class);        System.out.println(kevin);    }

大家自己运行后发现,确实并不是启动后就加载的。

回调方法

Student

public void init() {        System.out.println("执行init方法");    }    public void over() {        System.out.println("执行over方法");    }

student.xml

测试方法

public static void main(String[] args) throws InterruptedException {        ApplicationContext ctx = new ClassPathXmlApplicationContext("student.xml");        Thread.sleep(3000);        Person kevin = ctx.getBean("kevin", Student.class);        System.out.println(kevin);    }

输出结果

Student 初始化执行init方法Student{height=170, name='kevin'}

本篇文章暂时先介绍到这里,天气真的很冷,没有暖气,冻死我的手了。好了,玩的开心!

完整代码:

参考:

转载地址:http://tutla.baihongyu.com/

你可能感兴趣的文章
脚本源码安装LNMP
查看>>
Percona Server安装
查看>>
函数为左边表达式
查看>>
2015.06.04 工作任务与心得
查看>>
icinga2使用587端口发邮件
查看>>
hpasmcli查看HP服务器内存状态
查看>>
极客工具
查看>>
【14】Python100例基础练习(1)
查看>>
boost bind使用指南
查看>>
使用ntpdate更新系统时间
查看>>
Android M 特性 Doze and App Standby模式详解
查看>>
IE FF(火狐) line-height兼容详解
查看>>
谷歌Pixel 3吸引三星用户, 但未动摇iPhone地位
查看>>
python获取当前工作目录
查看>>
VUE中使用vuex,cookie,全局变量(少代码示例)
查看>>
grep -w 的解析_学习笔记
查看>>
量化交易之启航
查看>>
TX Text Control文字处理教程(3)打印操作
查看>>
CENTOS 7 如何修改IP地址为静态!
查看>>
MyCat分片算法学习(纯转)
查看>>