Spring框架入门
1.1专业术语了解
组件/框架设计
侵入式设计
引入了框架,对现有的类的结构有影响;即需要实现或继承某些特定类。
例如: Struts框架 继承ActionSupport
非侵入式设计
引入了框架,对现有的类结构没有影响。
例如:Hibernate框架 / Spring框架
控制反转:
控制反转 ,IOCInversion on Control
对象的创建交给外部容器完成,这个就做控制反转.
原本在业务逻辑层里面,需要得到DAO的实现,要么在业务逻辑层直接new,要么使用工厂获取一个。这种叫做【主动获取依赖】。
在IoC的时候,由容器决定给业务逻辑层注入哪个实例,不再需要自己手动new或者调用工厂get。
依赖注入, dependency injection
处理对象的依赖关系
比如现在我们的业务逻辑层实现好了,需要用到数据库,一定有DAO接口。
这个接口,在不同的持久化实现的时候,接口的实现都不一样!
容器里面,能够找到合适实现,注入给业务逻辑层,避免自己在业务逻辑层里面去new!可以在任何的时候更换实现,目的是为【去耦合】。
区别:
控制反转:解决对象创建的问题 【对象创建交给别人】
依赖注入:在创建完对象后, 对象的关系的处理就是依赖注入 【通过set方法依赖注入】
AOP
面向切面编程。切面,简单来说来可以理解为一个类,由很多重复代码形成的类。
切面举例:事务、日志、权限;
2.2 Spring框架
a. 概述
Spring框架,可以解决对象创建以及对象之间依赖关系的一种框架。
且可以和其他框架一起使用;Spring与Struts, Spring与hibernate
(起到整合(粘合)作用的一个框架)
Spring提供了一站式解决方案:
1) Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系
2) Spring Web Spring对web模块的支持。
--> 可以与struts整合,让struts的action创建交给spring
-->spring mvc模式
3) Spring DAO Spring 对jdbc操作的支持 【JdbcTemplate模板工具类】
4) Spring ORM spring对orm的支持:
--> 既可以与hibernate整合,【session】
--> 也可以使用spring对hibernate操作的封装
5)Spring AOP 切面编程
6)SpringEE spring 对javaEE其他模块的支持
3.3 Spring开发步骤
3.1、导包
使用下载安装方式得到的Spring,最少需要的依赖包
spring-context-4.3.6.RELEASE.jar
--->Spring里面的核心jar文件之一,负责读取、解析XML配置文件
spring-aop-4.3.6.RELEASE.jar
--->面向切面编程的支持,也是核心jar文件之一
spring-beans-4.3.6.RELEASE.jar
--->负责beans元素的处理,整个xml配置的规范都在这里定义的
spring-core-4.3.6.RELEASE.jar
--->最核心的容器,负责管理一个个的bean(实例)
spring-expression-4.3.6.RELEASE.jar
--->Sp EL的支持包,在Spring里面能够直接使用表达式简化XML的配置
-------------以下包可选---------------------
commons-logging-1.2.jar
--->Spring里面需要使用的日志记录依赖包,默认情况下,直接使用System.err输出日志,默认级别是info
log4j-jcl-2.7.jar
--->把commons-logging的输出,桥接到log4j 2输出,所有的日志级别、输出目标全部受到log4j 2控制。
log4j-api-2.7.jar
--->log4j 2的api,一堆接口
log4j-core-2.7.jar
--->log4j 2的实现
3.2、核心配置文件applicationContext.xml
Spring配置文件:applicationContext.xml / bean.xml
约束参考:spring-framework-4.3.6.RELEASE\docs\spring-framework-reference\html
<?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">
<!-- IOC容器的配置: 要创建的所有的对象都配置在这里--> <bean id="u1" class="org.fkjava.spring.domain.User"></bean> </beans>
3.3、spring的Api
创建一个实体类User
package org.fkjava.spring.domain;
public class User {
private String userName;
//无参构造器
public User() {
System.out.println("User的无参构造器被调用");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
System.out.println("注入的值:" + userName);
this.userName = userName;
}
依赖注入的简单测试
package org.fkjava.test; import org.fkjava.spring.dao.UserDao; import org.fkjava.spring.domain.User; import org.fkjava.spring.service.UserService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class 依赖注入的简单测试 { public static void main(String[] args) {
// 得到IOC容器对象,读取【applicationContext.xml】文件。直接得到IOC容器对象
ClassPathXmlApplicationContext cpc = new ClassPathXmlApplicationContext("applicationContext.xml");
//User u = new User(); //之前获取对象需要创建一个对象,现用spring的Ioc容器后,先得到IOC容器,然后从容器中获取bean
//从IOC容器中获取bean,从而得到对象
User user = (User) cpc.getBean("u1");
System.out.println(user);
}
}
输出:
User的无参构造器被调用
org.fkjava.spring.domain.User@1680b5a