一、首先什么是Spring ? ?
- Spring是一个轻量级控制反转(简称"IOC")和面向切面编程(简称"AOP")的容器架构。
- Spring的作用是为了解决软件开发的复杂性而创建的。
- Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情,然而,Spring的用途不仅仅限于服务器端的开发。 从简单、可测试性和解耦合性角度而言,绝大部分的Java应用都可以从Spring中受益。
二、Spring的简介
- Spring的作者 Rod Johnson
- Spring重要在思想上!!!需要多练习
- 理念:使现有技术更加实用,其本身是大杂烩整合现有的框架技术。
- Spring的优点:
轻量级框架(不带具有侵略性API) IOC容器 ---(控制反转)!!重点 AOP ---(面向切面编程) !!重点 对事物的支持 --- !!重点 对框架的支持
如果不知道什么是侵略性API,下面有补充噢
- IOC(inversion of controller 简称"控制反转")
1.对象由原来程序本身创建,变成了程序接受对象。
2.程序员主要的精力可以集中于业务实现。
3.Service和Dao没有直接依赖关系了,不在直接依赖,降低了耦合关系,Service和Dao层实现了分离。
4.如果dao的实现发生改变,对应的应用程序本身不需要在改变。
三、演示案例
- 先要导入对应得jar包,或者是导入需依赖噢。我用的是一个maven工程在pom.xml里面配置的依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.xmt</groupId>
<artifactId>SpringLearning</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--整合junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
</project>
- 创建了一个Hello的类
/**
*创建了一个Hello的类
*/
public class Hello {
/*姓名*/
private String name;
/**
*set方法
*/
public void setName(String name) {
this.name = name;
}
/**
*定义一个show方法
*/
public void show(){
System.out.println("hello,"+name);
}
}
- 创建一个bean.xml(bean工厂)
<?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">
<!--bean 就是Java对象 由Spring来创建和管理-->
<bean name="hello" class="com.xmt.entily.Hello">
<property name="name" value="张三"/>
</bean>
</beans>
- 测试(这里我用的是junit单元测试)
public class SpringTest(){
@Test
public void test1(){
//解析bean.xml文件生成管理相应的bean对象
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
//getBean("hello");这个hello对应得是我们bean.xml文件中的name
Hello hello=(Hello) context.getBean("hello");
hello.show();
}
}
- 打印输出结果
这里可以发现我们拿到了在bean.xml文件中的value的值,并且成功的赋值给了name。
- 思考一下
1.在这个案例中Hello对象是谁创建的?
2.在这个案例中Hello对象属性是怎么设置的?
- 分析过程
其实对于刚刚的这个过程其实就是我们的控制反转
控制的内容:指谁来控制对象的创建,传统的程序对象的创建是由程序本身创建控制的,但使用Spring之后,是由Spring来创建的。
反转的内容:正转是指程序本身来创建对象,反转是指程序本身不在创建对象,而是变为被动的接受对象。
总结:以前对象是由程序本身来创建,使用Spring后,程序变为被动接受Spring创建好的对象。
- 回答思考的问题:
1.在这个案例中Hello对象是谁创建的?
2.在这个案例中Hello对象属性是怎么设置的?
答:
1.Hello对象是由Spring容器帮我们创建的。
2.Hello对象属性是由Spring容器帮我们设置的。
四、拓展知识点
1、侵入性和非侵入性
侵入性:侵入式让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。但侵入式可以使用户跟框架更好的结合,更容易更充分的利用框架提供的功能。
非侵入性:非侵入式的代码则没有过多的依赖,可以很方便的迁移到其他地方。但是与用户代码互动的方式可能就比较复杂。