Spring
文章目录
Spring是什么?
Spring是一个轻量级的控制反转(IOC/DI)和面向切面编程(AOP)的对象容器框架。
就是一个管理对象的容器。
Spring优点
- 方便解耦、简化开发。
- AOP编程的支持。
- 声明式事务的支持。
- 方便程序的测试。
- 方便集成各种优秀的框架。
IOC(Inversion of Control,控制反转)
将对象的创建和初始化过程交给第三方(spring)来完成,是一种思想。
DI(Dependency Injection,依赖注入)
具体实现IOC的一种方式。
AOP(Aspect Oriented Programing,面向切面编程)
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
创建一个Spring项目
Spring Tool Suite4 + Maven
- 创建一个maven项目,之后在pom.xml里添加依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies>
-
src/main/resources下创建xml文件为“applicationContext.xml”,添加约束
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> </beans>
使用Spring来管理对象
-
首先,需要创建一个类,例如
package springStudy01; public class Person { }
-
然后在‘’applicationContext.xml‘’里添加一个bean
<bean id="P" class="springStudy01.Person"></bean>
bean的id不可以和其他bean重复,class是类的路径。
-
现在可以获取到这个对象了
package springStudy01; public class Main { public static void main(string [] args) { ClassPathApplicationContext ctx = ClassPathApplicationContext("application.xml"); // 获取到application.xml Person p = (Person)ctx.getBean("P"); // 根据bean的id去查找,因为返回的是Object类型所以需要强制转换。 // Person p = ctx.getBean("P",Person.class); 告知对象类型避免强制转换。 System.out.println(p); } }
-
运行结果如下
[外链图片转存失败(img-FzNv64Cn-1562766839377)(http://pu5xcikhb.bkt.clouddn.com/blog/20190705/qC70T6Qi1tQe.png?imageslim)]
-
但此时我们知道就算获取到了Person对象,但是里面什么也没有。通常情况下初始化对象时需要向里面传递一些参数,那么这些参数该怎么传递呢?
-
先给Person类添加一些属性和一个构造方法
package springStudy01; public class Person { private String name; private int age; private Dog dog; public Person(String name, int age, Dog dog) { this.name = name; this.age = age; this.dog = dog; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } }
再新创建一个类
package springStudy01; public class Dog { }
-
现在只需要在”applicationContext.xml”里添加
<bean id="P" class="springStudy01.Person"> <constructor-arg name="name" value="Doge"/> <constructor-arg name="age" value="17"/> <constructor-arg name="dog" ref="D"/> </bean> <bean id="D" class="springStudy01.Dog"/>
constructor-arg 构造参数,听名字大概也能推测出来他调用了Person类对应的构造方法。
name里写的是属性名字
value里写的是具体的内容
ref里写的是引用,这里应该写对应类的bean的id
实际上constructor-arg还有两个属性名为 index和type
index按照对应构造方法传递参数的顺序来区分具体的属性
type则是传递属性的类型,通常会自动装配所以不用写。
-
把属性打印出来
完成。
bean作用域
spring为bean提供了6种作用域,其中四种只有在web-aware 的 applicationContext中才有用。
-
singleton scope 单例作用域
每一个bean只生产一个实例。
-
prototype scope 原型作用域
该bean每次被注入,或者每次调用getBean()方法时,都会产生一个新的实例。
-
websocket scope
在一个WebSocket生命周期中定义一个Bean。
-
request scope
在一个HTTP请求中创建一个Bean的实例。
-
session scope
在一个HTTP会话的生命周期中创建一个Bean的实例。
-
application scope
在一个ServletContext的生命周期中创建一个Bean的实例。
MVC
循环引用
如果有三个类,A里有B的引用,B里有C的引用,C里有A的引用。
- 如果三个类都是singleton的话会正常运行
- 如果都是prototype的话就会报错
- 其中有一个是singleton的话也会正常运行
主要原因是单例情况下会直接实例化类,而原型情况下则会检查引用,有引用需要实例化的时候会先去实例化引用。