目录
第三次导入的JAR包(AOP):AspectJ框架相关的JAR包
7.3 掌握基于 XML 和 Annotation 的声明式事务的使用
第一部分-JAR包的导入
第一次导入的JAR包(基础):
1.第三方依赖包:commons-logging-1.2.jar
2.Spring 的4个基础包:
① spring-core-4.3.6.RELEASE.jar
② spring-beans-4.3.6.RELEASE.jar
③ spring-context-4.3.6.RELEASE.jar
④ spring-expression-4.3.6.RELEASE.jar
第二次导入的JAR包(AOP):
① spring-aop-4.3.6.RELEASE.jar 是 Spring 为 AOP 提供的实现包,(并支持注解扫描)
② aopallince-1.0.jar 是 AOP 联盟提供的规范包,该 JAR 包可以通过地址 http://mvnrepository.com/artifact/aopalliance/aopalliance/1.0 下载。
第三次导入的JAR包(AOP):AspectJ框架相关的JAR包
① spring-aspects-4.3.6.RELEASE.jar Spring 为 AspectJ 提供的实现
② aspectjweaver-1.8.0.RELEASE.jar 是 AspectJ 框架所提供的规范,可以通过网址 https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.8.10 下载
第四次导入的JAR包(JDBC和事务):
① mysql-connector-java-5.1.0-bin.jar MySQL数据库的驱动JAR包
② spring-jdbc-4.3.6.RELEASE.jar JDBC的JAR包
③ spring-tx-4.3.6.RELEASE.jar Spring事务处理的JAR包
一共12个JAR包。
注意:Spring 框架包 Spring 4.3.6 版本的框架压缩包,名称为 spring-framework-4.3.6.RELEASE-dist. zip , 此 压 缩 包 可 以 通 过 地 址 https://repo.spring.io/release/org/springframework/spring/4.3.6.RELEASE/s pring-framework-4.3.6.RELEASE-dist.zip 下载。
第二部分-项目实战
1.Spring的核心容器:
1.1 BeanFactory在实际开发中用的少,这里略过。
1.2 ApplicationContext(使用)
1. 2.1 通过 ClassPathXmlApplicationContext 创建(使用)
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLoction);
1.2.2. 通过 FileSystemXmlApplicationContext 创建(不用,所以略过)
2. Spring的入门程序:
⑴ 创建项目,导入包:
⑵ 在 src 目录下,创建一个 com.neko.dao 包,并在包中创建接口 UserDao,然后在接 口中定义一个 say( )方法,
package com.neko.dao;
public interface UserDao {
public void say();
}
⑶ 在 com.neko.dao.impl 包下,创建 UserDao 接口的实现类 UserDaoImpl,该类需要实现 接口中的 say( )方法,并在方法中编写一条输出语句,
package com.neko.dao.impl;
public class UserDaoImpl implements UserDao{
@Override
public void say() {
System.out.println("userDao say Hello World!");
}
}
(4) 在项目目录下创建 config 文件夹专门存放配置文件,再创建 Spring 的配置文件 applicationContext. xml,并在配置 文件中创建一个 id 为 userDao 的 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">
<!-- 将指定的类配置给Spring,让Spring创建其对象的实例 -->
<bean id="userDao" class="com.sinven.ioc.UserDaoImpl" />
</beans>
(5) 在 com.neko.test 包下创建测试类 TestIoC,并在类中编写 main( )方法。在 main( )方法中,需要初始化 Spring 容器,并加载配置文件,然后通过 Spring 容器获取 UserDao 实例(即 Java 对象),最后调用实例中的 say( )方法,
package com.neko.test;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoC {
public static void main(String[] args) {
// 1、初始化spring容器加载配置文件
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("config/applicationContext.xml");
// 2、通过容器获取UserDao实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
// 3、调用示例中的say()方法
userDao.say();
}
}
执行程序后,控制台的输出如图:
3.依赖注入“DI”
3.1 依赖注入的概念
依赖注入( Dependency Injection ,简称 DI) 与控制反转(IoC) 的含义相同,只不过 这两个称呼是从两个角度描述的同一个概念。对于一个 Spring 初学者来说,这两种称呼很 难理解,下面我们将通过简单的语言来描述这两个概念。
当某个 Java 对象(调用者)需要调用另一个 Java 对象(被调用者,即被依赖对象)时,在 传统模式下,调用者通常会采用"new 被调用者"的代码方式来创建对象,如图 1-8 所示。这 种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。
图:
图 1-8 调用者创建被调用者对象 在使用 Spring 框架之后,对象的实例不再由调用者来创建,而是由 Spring 容器来创 建,Spring 容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样, 控制权由应用代码转移到了 Spring 容器,控制权发生了反转,这就是 Spring 的控制反转。
从 Spring 容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量, 这相当于为调用者注入了它依赖的实例,这就是 Spring 的依赖注入,如图 1-9 所示。
图 :
3.2 依赖注入的实现方式
① 属性 setter 方法注入:指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无 参构造器或无参静态工厂方法实例化 Bean 后,调用该 Bean 的 setter 方法,即可实现基于 setter 方法的依赖注入。(在实际开发中最常用)
② 构造方法注入:指 IoC 容器使用构造方法注入被依赖的实例。基于构造方法的依赖注 入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。
下面以属性 setter 方法注入的方式为例,实现依赖注入:
(1) 在 com.neko.service 包中,创建接口 UserService,在接口中编写一个 say( )方法,
package com.neko.service;
public interface UserService {
public void say();
}
(2) 在 com.neko.service.impl 包中,创建 UserService 接口的实现类 UserServiceImpl,在类中 声明 userDao 属性,并添加属性的 setter 方法,
package com.neko.service.impl;
public class UserServiceImpl implements UserService {
//声明UserDao属性
private UserDao userDao;
//添加UserDao属性的setter方法,用于实现依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//实现接口中方法
@Override
public void say() {
//调用userDao中的say()方法,并执行输出语句
this.userDao.say();
System.out.println("userService say Hello World");
}
}
(3) 在配置文件 applicationContext.xml 中,创建一个 id 为 userService 的 Bean, 该 Bean 用于实例化 UserServiceImpl 类的信息 ,并将 userDao 的实例注入到 userService 中,
<!-- 添加一个id为userService的实例 -->
<bean id="userService" class="com.sinven.ioc.UserServiceImpl">
<!-- 将id为userDao的Bean实例注入到UserService实例 -->
<property name="userDao" ref="userDao"/>
</bean>
在上述代码中,是元素的子元素,它用于调用 Bean 实例中的 setUserDao(