Spring环境搭建和第一个Spring程序
一、 概述
1、 Spring的发展
(1) 是2003年由Rod Jahnson提出的轻量级的开发框架,可以解决面向对象编程中的耦合性问题。
(2) 它的产品:Spring 、SpringBoot、SpringData、SrpingMVC、Spring Cloud等,我们所学的是SpringFramwork,最新的版本是5,我们学的是4.9。
(3) Spring框架可以解决我们开发中遇到的各个层,包括视图层、业务层、持久层。
2、 核心内容
IoC、DI、AOP
(1)IoC( Inversion of Control):控制反转
(2)DI(Dependency Injection):注入依赖
(3)AOP(Aspect Oriented Programming):面对方面的编码或面向切面的编程
目前我们学的是OOP:面向对象的编程
另外IoC和DI表示的内容是一致。
3、 解决的问题
(1)解耦应用程序
(2)简化开发流程
(3)AOP支持
(4)声明式事务
(5)集成junit5
二、 环境搭建
1、下载jar包
(1) http://repo.spring.io/release/org/springframework/spring/
(2) https://maven.springframework.org/release/org/springframework/spring/
(3) https://repo.spring.io/
或直接输入地址:
https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring
说明:
(1) dist是要下载的jar,里面包含很多个jar包
(2) docs是spring的API文档
(3) schema是maven的配置文件即xml里面的文件信息
(4) 第三方的日志jar包,搜索(common logging.jar mvn)
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.1.1
2、Spring框架库需要使用的jar包
spring的jar包
spring-aop-4.3.9.RELEASE.jar :AOP操作必须导入此包
spring-beans-4.3.9.RELEASE.jar:实体类
spring-context-4.3.9.RELEASE.jar:上下文
spring-core-4.3.9.RELEASE.jar:核心包
spring-expression-4.3.9.RELEASE.jar:spring的专属表达式包
每个jar包都包含3个文件:
截图中的jar包分别表示:
(1) 需要在spring项目中导入的jar包
(2) 帮助文档
(3) 数据源,通过绑定,可以在开发中通过ctrl+单击类或接口追踪该类或接口的使用。
日志的jar包
log4j-1.2.17.jar commons-logging.jar
单元测试的jar包
三、 安装Spring插件
1、 下载安装(搜索 eclipse sts)
https://spring.io/tools3/sts/all
下载springsource-tool-suite-3.9.7.RELEASE-e4.9.0-updatesite,在eclipse中help-install new software…进行安装
上述操作完后等待eclipse安装到100%后重启。
2、 在线安装
http://dist.springsource.com/release/TOOLS/update/e4.9/
3、直接下载集合sts的eclipse ide
https://spring.io/tools
四、 创建项目完成第一个测试程序
1、 创建项目
2、 导入jar包(5+2)
3、 配置日志文件
Configure logging for testing: optionally with log file
log4j.rootLogger=WARN, stdout
log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
4、 创建实体类
5、 创建配置文件即bean容器
一般命名为applicationContext.xml,保存在src下,也可以放在web-inf下。
选择XSD的约束文件命名空间:
6、 applicationContext.xml文件的代码:
<bean id="p1" class="com.spring.entity.Person">
<property name="id" value="1"></property>
<property name="name" value="张涛"></property>
<property name="age" value="23"></property>
</bean>
7、 从容器中取对象
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person p1= (Person) applicationContext.getBean("p1");
7、测试
五、 2种类型的工厂
FileSystemXmlApplicationContext:通过绝对路径的方式获取配置文件
ClassPathXmlApplicationContext:通过类路径方式获取配置文件
六、 id和name之前的区别
<bean id="p1" name="p2" class="com.ahbvc.spring.entity.Person">
<property name="id" value="1"></property>
<property name="name" value="Tom"></property>
<property name="age" value="20"></property>
</bean>
Id是唯一的,name可以有多个
七、 单例、多例
1、 默认情况下是单例的,即scope=singleton
单例时,在容器启动时创建,而且只创建一个,可以通过scope=“singleton” lazy-init=“true”,来设置延迟启动。
(1) bean容器代码
<bean id="book" class="com.ahbvc.spring.entity.Book" scope="singleton">
<property name="name" value="SSM框架开发"></property>
<property name="price" value="56.8" ></property>
</bean>
(2) 测试代码
@Test
public void test1()
{
ApplicationContext context=
new ClassPathXmlApplicationContext("applicationContext2.xml");
Book b= (Book) context.getBean("book");
System.out.println(b.toString());
Book b2= (Book) context.getBean("book");
System.out.println(b2.toString());
System.out.println(b==b2);
}
单例模式优点:
(1) 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;
(2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
(3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象耗费资源过多(即:重量级对象),但又经常用到的对象、 工具类对象、频繁访问数据库或文件的对象(比如 数据源、session 工厂等)
单例模式举例:
public class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
return instance = new Singleton();
} else {
return instance;
}
}
public static void main(String[] args) {
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1==s2);
}
}
2、 如果是多例,则设置scope=prototype
多例时,容器启动时不创建,获取对象时才创建
分析结果:
调用构造方法
调用构造方法
Book [name=SSM框架开发, price=56.8]
调用构造方法
Book [name=SSM框架开发, price=56.8]
False
(1)bean容器代码
<bean id="book2" class="com.ahbvc.spring.entity.Book" scope="prototype">
<property name="name" value="SSM框架开发"></property>
<property name="price" value="56.8" ></property>
</bean>
(2)测试代码
@Test
public void test2()
{
ApplicationContext context=
new ClassPathXmlApplicationContext("applicationContext2.xml");
Book b= (Book) context.getBean("book2");
System.out.println(b.toString());
Book b2= (Book) context.getBean("book2");
System.out.println(b2.toString());
System.out.println(b==b2);
}
3、scope=request 一个请求范围,是单例
4、scope=session 一个会话范围,是单例