Spring框架

一、了解Spring框架 Spring框架
文章图片

Spring框架的概述:
概述:为了解决项目中各层之间的松耦合问题(起到组件之间的粘结作用)
官网:www.spring.io
Spring 框架的 7 个模块
Spring框架
文章图片

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO
    抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE
服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
Spring框架好处 :
1.不依赖于应用服务器.
2.IOC(控制反转)技术实现组件控制.
通过DI(依赖注入)技术提高了组件之间的解耦.
3.通过AOP(面向切面编程)技术实现安全、事务、日志功能的统一管理,提高复用.
4.Spring框架可以几乎与其他任何框架进行良好的整合使用.
5.Spring所有项目之间不相互依赖.
二、编写第一个Spring项目 第一个Spring程序:简单实现第一个IOC控制(对象的生命周期控制).
1.创建项目,导入jar包.
2.IOC:对象的创建,交由Spring容器完成
Spring容器创建applicationContext.xml
3.创建实体类,将类实例的创建交给Spring容器

4.测试Spring容器启动,并创建得到对象.
ApplicationContext context = new ClassPathXmlApplicationContext(“容器”);
Object o1= context .getBean(名称);
三.IOC和DI: IOC : 控制反转. 本质: 将手动创建对象的工作,交给Spring容器实现完成.
1.在Spring容器中可以配置创建实例对象.无论带参,无参构造实例都是可以实现的.
Spring.xml容器中配置:

2.如何通过注解的用法代替Spring配置文件中的写法实现IOC控制.
2.1: 首先需要在实体类中采用注解支持的组件: context组件
@Component , @Controller , @Service , @Repository
2.2: 基于spring容器配置注解的扫描和支持:

IOC 容器
Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型。
  • 单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
  • 原型模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。
【Spring框架】BeanFactory 接口
因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。
清单 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(newFileInputSteam(“mybean.xml”));
在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。
清单 2. getBean()
MyBean mybean = (MyBean) factory.getBean(“mybean”);
每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。
IOC 示例
理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。
我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:
  • 信用级别评定服务,查询用户的信用历史信息。
  • 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。
  • 电子邮件服务,向用户发送有关信用卡状态的电子邮件。
DI : 依赖注入.含义 : 指的是针对实体类中: 属性成员赋值操作.
  1. 针对实体中的属性实现注入: 采用容器配置写法实现.
    1.1:类中依赖的属性: 必须get/set封装.
    1.2:进行注入:
  2. 属性的注入: 也可采用注解的写法实现.
    //无需提供属性的get/set封装方法实现注入.
    @Resource(name=”对象名”) //根据对象名称进行spring容器查找,并注入.
    Private BanJi bj1;
    @Autowired //根据类型进行spring容器查找,找到指定类型对象,直接注入.
    Private BanJi bj1;
四、Spring整合JDBC 1.什么是JDBC模板(jdbcTemplate)
JDBC—>Java Data Base Connectivity,java数据库连接,简单点说就是可以为多种关系数据库提供统一访问,由一组用java语言编写的类和接口组成。
模板—>就是事先准备好的东西,你只需要去套用就可以,JDBCTemplate就是这样的模板,通过设置JDBCTemplate可以减少对数据库的繁琐操作,例如连接数据库,获得链接关闭,获得statement,resultset,preparedstatement这些等等。
2.传统的JDBC与Spring JDBC区别
2.1.传统的JDBC应用步骤:
1.指定数据库连接参数
2.打开数据库连接
3.声明SQL语句
4.预编译并执行SQL语句
5.遍历查询结果(如果需要的话)
6.处理每一次遍历操作
7.处理抛出的任何异常
8.处理事务
9.关闭数据库连接

JDBC的缺点就是太麻烦了,不易编码,容易出错,不利于开发者把精力投入到业务上去。简化JDBC就是新技术的目标。象Spring,hibernate等都通过对JDBC进行封装,以达到简化开发的目的。但是这些技术在自身侧重上略有不同。如Hibernate主要进行Object/Relational Mapping。
2.2.Spring JDBC
Spring的JDBC: 节省代码,不管连接(Connection),不管事务,不管异常,不管关闭(con.close() ps.close )
3.JdbcTemplate主要提供以下五类方法:
1、execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
Execute、executeQuery、executeUpdate

2、update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句 SQL SERVCER(GO SQL语句 GO) ;
3、query方法及queryForXXX方法:用于执行查询相关语句;
4、call方法:用于执行存储过程、函数相关语句。
4.使用SpringJDBC来做增删改查
引用自https://www.jb51.net/article/173422.htm
JdbcTemplate添加数据
1.使用配置实现
1.1 创建实体类
public class Account {
private Integer accountid;
private String accountname;
private Double balance;
public Integer getAccountid() {
return accountid;
}
public void setAccountid(Integer accountid) {
this.accountid = accountid;
}
public String getAccountname() {
return accountname;
}
public void setAccountname(String accountname) {
this.accountname = accountname;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
实体类
1.2 创建Dao层
//查询所有所有账户
public List getAllAccounts();
1.3 创建Dao层实现类并继承JdbcDaoSupport接口
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Override
public List getAllAccounts() {
JdbcTemplate jdbcTemplate = getJdbcTemplate();
String sql = “select * from accounts”;
//RowMapper:接口 封装了记录的行映射关系
List lists = jdbcTemplate.query(sql, new RowMapper() {
@Override
public Account mapRow(ResultSet resultSet, int i) throws SQLException {
//创建Account对象
Account account = new Account();
//从ResultSet中解数据保到Accounts对象中
account.setAccountid(resultSet.getInt(“accountid”));
account.setAccountname(resultSet.getString(“accountname”));
account.setBalance(resultSet.getDouble(“balance”));
return account;
}
});
return account;
}
实现查询方法
1.4创建Service层
//查询所有所有账户
public List getAllAccounts();
1.5创建Service层实现类
AccountDao accountDao;
@Override
public List getAllAccounts() {
List allAccounts = accountDao.getAllAccounts();
return allAccounts;
}
1.6 编写applicationContext.xml文件
Spring框架
文章图片

1.7编写测试类
@Test
public void getAllAccount(){
ApplicationContext context=new ClassPathXmlApplicationContext(“applicationContext.xml”);
//从spring容器中获取Service对象
AccountService accountService = (AccountService)context.getBean(“accountService”);
List allAccounts = accountService.getAllAccounts();
for (Account account:allAccounts) {
System.out.println(“账户名:”+account.getAccountname()+",余额为:"+account.getBalance());
}
}
查询测试类
2. 使用注解方式实现
2.1 创建实体类
同1.1
2.2 创建Dao层
同1.2
2.3 创建Dao层实现类
@Repository
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
Account account = new Account();
@Override
public List getAllAccounts() {
String sql = “select * from accounts”;
//自动映射
RowMapper rowMapper = new BeanPropertyRowMapper<>(Account.class);
List query = jdbcTemplate.query(sql, rowMapper);
for (Account account : query) {
System.out.println(account);
}
return query;
}
}
Dao实现类
2.4创建Service层
同1.4
2.5创建Service层实现类
同1.5
2.6编写applicationContext.xml文件
Spring框架
文章图片

2.7编写测试类
同1.7

    推荐阅读