本文共 9221 字,大约阅读时间需要 30 分钟。
最近经历了许许多多的事情,学习荒废了很久。自己的目标成了摆设。现在要奋起直追了。最近发现了的博客。应该是一个教师。看了他写的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是一种设计思想,DI(依赖注入)是实现IOC的一种方法。(下面的这张图画的太好了)
IOC是spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用xml配置,也可以使用注解,新版本的spring可以零配置实现IOC。
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实例 |测试
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
这样验证了从容器中取回的对象默认是单例的。
测试
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
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/