spring创建项目xml文件的配置以及使用spring+c3p0连接池+jsp、servlet简单实现学生管理系统的增删改查
1- spring容器的简单介绍
Spring: 中文意思为春天 给整个软件行业带来了春天
2002年 Road Jahnson首次推出了Spring框架雏形interface21框架
2004年3月24 Srping以interface21框架为基础 经过重新设计 发布了1.0正式版
Spring理念: 使现有技术更加实用 本身就是大杂烩 整合现有的框架技术 解决企业应用开发的复杂性而创建的
Spring 是一个开源框架, Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为JavaEE 应用程序开发提供集成的框架。Spring 使用基本的JavaBean 来完成以前只可能由EJB 完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java 应用都可以从Spring 中受益。Spring 的核心是控制反转(IoC)和面向切面(AOP)。简单来
说,Spring 是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
JavaEE 开发分成三层结构:
- WEB 层:Spring MVC.
- 业务层:Bean 管理:(IOC)
- 持久层:Spring 的JDBC 模板.ORM 模板用于整合其他的持久层框架.
Spring官方网站:
https://docs.spring.io
官方下载地址:https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub下载地址:https://github.com/spring-projects
下载spring中的jar网址:https://repo.spring.io/libs-release-local/org/springframework/spring/4.3.29.RELEASE/
Spring优点:
- Spring框架是一个开源、免费的框架、容器
- Spring是一个轻量级、非侵入式的
- JavaEE更加容易使用
- 面向对象的设计比如何实现技术都重要
- 代码更加容易测试
- JavaBean提供了应用程序配置的最好方法
- 在java中,已检查异常被过度使用。框架不应该迫使捕获不能恢复的异常
- 对事务的支持,对框架的支持
- 控制反转IOC,反向切面AOp
Spring组成:
- 最完善的轻量级核心框架
- 通用的的事务管理抽象层
- JDBC抽象层
- 集成了Toplink、JDO、and iBATIS SQL Maps
- AOP功能
- 灵活的的MVC Web框架
为什么学习Spring?
- 方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring 管理 - AOP 编程的支持
Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 - 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程 - 方便程序的测试
Spring 对Junit4 支持,可以通过注解方便的测试Spring 程序 - 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、
MyBatis、Quartz 等)的直接支持 - 降低JavaEE API 的使用难度
Spring 对JavaEE 开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封
装,使这些API 应用难度大大降低
spring版本–3.x、4.x、5.x
2-简单的搭建一个spring框架项目
2.1-首先进入官网 https://spring.io/ 点击projects后点击framework
2.2 点击github这个头像
2.3 往下翻 点击图示位置
2.4 接下来创建一个简单的spring项目
2.4.1 Spring 框架核心模块
2.4.2 创建项目成功后 导入相应的jar包
2.4.3 创建包
2.4.3.1 pojo包下的Student实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int sid;
private String sname;
private String sex;
private int age;
private String addr;
private int cid;
public void init(){
System.out.println("Student实体类初始化方法被调用......");
}
public void destory(){
System.out.println("Student实体类方法调用被销毁....");
}
}
2.4.3.2 建立resources资源目录 定义spring的配置文件 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
2.4.3.3 测试
//测试spring中的bean对象常用属性
@Test
public void test01(){
//1.1得到spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
Student stu01 = context.getBean(Student.class);
Student stu02 = context.getBean(Student.class);
System.out.println("stu01 = " + stu01);
//1.2)测试spring的默认作用域为单例模式
System.out.println(stu01==stu02);
context.close();
}
Student实体类初始化方法被调用......
stu01 = Student(sid=0, sname=null, sex=null, age=0, addr=null, cid=0)
true
Student实体类方法调用被销毁....
2.4.4 spring创建对象的三种方式
2.4.4.1 使用构造器无参创建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 标签的一些常用属性说明:
① name:代表为自定义的bean 起一个名字,可以存放特殊字符。
② id:代表为自定义的bean 指定一个id,不能存放特殊字符。
③ class:代表自定义bean 的完整类名,包括包名。
④ abstract:代表自定义bean 是否是抽象类,true:是抽象类,false:不是抽象类
⑤ init-method:代表自定义bean 的初始化方法.
⑥ destroy-method:代表自定义bean 的销毁方法。
⑦ scope:代表自定义bean 的作用范围。可取值如下:
singleton:代表此对象为单例。【默认值】(常用)
prototype:代表此对象为多例。(常用)
request:代表此对象在一次请求有效。
session:代表此对象在浏览器不关闭的情况下有效。
-->
<!--bean-->
<bean id="student" class="com.zelin.pojo.Student" init-method="init" destroy-method="destory" scope="singleton"/>
</beans>
测试
//测试spring中的bean对象常用属性
@Test
public void test01(){
//1.1得到spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
Student stu01 = context.getBean(Student.class);
Student stu02 = context.getBean(Student.class);
System.out.println("stu01 = " + stu01);
//1.2)测试spring的默认作用域为单例模式
System.out.println(stu01==stu02);
context.close();
}
测试结果
Student实体类初始化方法被调用......
stu01 = Student(sid=0, sname=null, sex=null, age=0, addr=null, cid=0)
true
Student实体类方法调用被销毁....
2.4.4.2 使用静态工厂方法创建对象
BeanFactory
/**
* @author wf
* @date 2020-10-16 18:45
* 使用静态方法创建bean对象
*/
public class BeanFactory {
public static Student getStudent(){
return new Student();
}
}
配置文件
<!--bean对象:第二种方式:使用静态方法创建对象-->
<bean id="beanFactory" class="com.zelin.factory.BeanFactory" factory-method="getStudent"/>
测试
//2.使用静态方法获取bean对象
@Test
public void test02(){
//2.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stu02 = (Student) context.getBean("beanFactory");
System.out.println("stu02 = " + stu02);
}
测试结果
//2.使用静态方法获取bean对象
@Test
public void test02(){
//2.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stu02 = (Student) context.getBean("beanFactory");
System.out.println("stu02 = " + stu02);
}
2.4.4.3 使用对象工厂方式创建bean对象
BeanStudent.java
/**
* 第三种方式:使用对象工厂方式构造bean对象
*/
public class BeanStudent {
public Student getStudent(){
return new Student();
}
}
配置文件
<!--第三种方式:使用对象工厂方式构造对象-->
<bean id="factoryStu" class="com.zelin.factory.BeanStudent"/>
<bean id="studentBean" factory-bean="factoryStu" factory-method="getStudent"/>
测试
//3.使用对象工厂方法获取bean对象
@Test
public void test03(){
//3.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stu03 = (Student) context.getBean("studentBean");
System.out.println("stu03 = " + stu03);
}
测试结果
Student实体类初始化方法被调用......
stu03 = Student(sid=0, sname=null, sex=null, age=0, addr=null, cid=0)
2.4.5 IOC-控制反转(Inverse Of Control)
以前程序中的javabean 对象是由我们程序员创建完成,现在由spring 容器帮我们创建完成,并且以前javabean 的依赖关系也是我们程序员自己定义,现在也由spring 容器帮我们创建这种依赖关系,所以,这种控制权以前由我们完成现在改由spring 容器完成,这样,控制权发生了反转。
2.4.6 DI-依赖注入(Dependency-Injection)
就是我们可以在spring 的配置文件中定义javabean 时,可以为其指定依赖关系,这样,我们在程序中的这种依赖就不需要我们程序员去干预。
2.4.7属性的赋值(简单属性赋值)
2.4.7.1 方法一:setter方法实现属性的赋值【最常用的方法】
配置文件
<bean id="student" class="com.zelin.pojo.Student" init-method="init" destroy-method="destory" scope="singleton">
<!--实现属性赋值方法一:setter方法实现-->
<property name="sid" value="1001"/>
<property name="sname" value="刘亦菲"/>
<property name="sex" value="女"/>
<property name="age" value="18"/>
<property name="addr" value="上海"/>
<property name="cid" value="2005"/>
</bean>
测试代码
//4.setter方法实现属性赋值
@Test
public void test04(){
//4.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stud = (Student) context.getBean("student");
System.out.println("stud = " + stud);
}
实现结果
stud = Student(sid=1001, sname=刘亦菲, sex=女, age=18, addr=上海, cid=2005)
2.4.7.2 方法二:构造方法实现属性的赋值【较使用】
配置文件
<!--第二种实现属性注入方式:构造方法为属性进行赋值-->
<bean id="stud01" class="com.zelin.pojo.Student">
<!--使用index下标 不常用 因为Index容易出错-->
<!--<constructor-arg index="0" value="1001"/>-->
<!--<constructor-arg index="1" value="刘亦菲"/>-->
<!--<constructor-arg index="2" value="女"/>-->
<!--<constructor-arg index="3" value="18"/>-->
<!--<constructor-arg index="4" value="上海"/>-->
<!--<constructor-arg index="5" value="1987"/>-->
<!--使用name属性-->
<constructor-arg name="sid" value="1001"/>
<constructor-arg name="sname" value="刘亦菲"/>
<constructor-arg name="addr" value="上海"/>
<constructor-arg name="sex" value="1001"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="cid" value="1987"/>
</bean>
测试代码
//5.方法二:构造器方法实现属性赋值
@Test
public void test05(){
//5.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stud02 = (Student) context.getBean("stud01");
System.out.println("stud02 = " + stud02);
}
实现结果
stud02 = Student(sid=1001, sname=刘亦菲, sex=1001, age=18, addr=上海, cid=1987)
2.4.7.3 方法三:p标签或c标签实现属性的赋值【不常使用】
下面以p标签方式实现属性的赋值
配置文件:需要导入p标签的配置
xmlns:p="http://www.springframework.org/schema/p
<!--第三种方式实现属性的赋值:p标签或者c标签-->
<bean id="stud02" class="com.zelin.pojo.Student"
p:sid="1003" p:sname="刘亦菲" p:sex="女"
p:addr="上海" p:age="25" p:cid="1009"/>
测试代码
//6.方法三:p标签或c标签实现属性赋值
@Test
public void test06(){
//6.1得到spring容器
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext.xml");
Student stud02 = (Student) context.getBean("stud02");
System.out.println<