1 Spring概述
1.1 什么是Spring
一个Java 应用程序开发框架,为Java EE三层(架构)开发模式的各层都提供解决方案。
Spring对三层的支持:
1.2 核心功能
1.3 优点(主要是指其核心功能特征)
1.4 Spring的体系结构(主要是基础功能和在web中的应用)
2 控制反转Ioc与依赖注入DI
Spring的核心内容之一。
2.1 控制反转Ioc
实际是创建对象的控制权发生转移(由原来的应用对象内部创建,转移到应用对象的外部来创建)。
传统创建对象的方式是使用new ;而如果使用Spring框架,那么你的业务对象将由框架创建并维护,当需要使用业务对象时,使用Spring的核心接口,从Spring容器中取出来使用。
2.1.1 示例:输出Hello Spring
【目的】
- (1)基于Spring框架的项目创建过程;
- (2)理解控制反转及其应用;
- (3)对比传统方式与spring框架思想
【描述】
- 基于spring框架的maven项目,创建一个包含输出方法的类,在控制台输出Hello Spring。
【步骤】
-
(1)创建Maven项目,添加Spring框架核心依赖.
-
(2)创建demo包下的实现类:Ioc.java,添加一个输出方法:print().
-
(3)添加Spring配置文件,注册Ioc。
-
(4)创建测试类,执行
(1)创建项目,添加依赖(5个)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.my</groupId>
<artifactId>chap6</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>chap6 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring核心包1:spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.14</version>
</dependency>
<!-- Spring核心包2:spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.14</version>
</dependency>
<!-- Spring核心包3:spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.14</version>
</dependency>
<!-- *************************************************************-->
<!--1. Spring核心包4:spring-context ****实际上 仅仅需要这一个就可以了***-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
<!-- *************************************************************-->
<!--2. Spring依赖包,用于日志输出:commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<finalName>chap6</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
(2)添加类
【文件位置】src/main/java/demo/Ioc.java
package demo;
public class Ioc {
public void print() {
System.out.println("Hello Spring!");
}
}
(3)添加配置文件
【文件位置】src/main/resources/spring.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">
<!-- 注册 -->
<bean id="print" class="demo.Ioc" />
</beans>
(4)测试
【文件位置】src/test/java/MyTest.java
package chap6;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
//传统使用方式
// @Test
// public void test0() {
// Ioc ioc=new Ioc();
// ioc.print();
// }
@Test
public void test1() {
//应用接口,容器的核心操作对象
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
//获取对象;从容器中获取对象
Ioc ioc=ctx.getBean(Ioc.class);
ioc.print();//使用
}
【运行结果】
- 在控台上输出如下内容
Hello Spring!
2.2 依赖注入DI
使用Spring创建对象,并注入对象所需要的属性(初始化)。
2.2.1 属性注入(常用)
设计类时,提供setter方法,在Spring配置文件中,通过配置属性property为对象赋值。此类具有无参构造方法。
【语法】
<bean id="对象名" class="实现类全限定名:包名.类名">
<property name="属性名1" value="值1"/>
<property name="属性名2" value="值2"/>
</bean>
2.2.2 示例:设置链接数据库的初始属性,并输出
【目的】
- 理解依赖注入
【描述】
- 创建DI1类,设置访问mybatis数据库的连接信息:数据库名、用户名和密码,并在控制台上输出。
【步骤】
- (1)创建类
package demo;
public class DI1 {
String dbName,userName,pwd;
//只写属性:赋值
public void setDbName(String dbName) {
this.dbName = dbName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//
@Override
public String toString() {
System.out.println(dbName+","+userName+","+pwd);
return dbName+","+userName+","+pwd;
}
}
- (2)配置文件
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="di1" class="demo.DI1">
<property name="dbName" value="mybatis"/>
<property name="userName" value="root"/>
<property name="pwd" value="root"/>
</bean>
</beans>
- (3)测试
@Test
public void test() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
DI1 di1= ctx.getBean(DI1.class);
di1.toString();
}
2.3 构造器注入
在Spring创建对象的同时,通过配置属性constuctor-arg,传递构造参数。此类有有参数的构造方法。
【语法】
<bean id="id" class="包名.类名">
<constructor-arg value="参数1值"/>
<constructor-arg value="参数2值"/>
</bean>
【或者】
<bean id="id" class="包名.类名">
<constructor-arg index="参数位置,如0" value="参数1值"/>
<constructor-arg index="参数位置,如1" value="参数2值"/>
</bean>
2.3.1 示例:改写上面示例,使用构造方法实现注入。
【步骤】
- (1)使用构造方法注入的类:DI2.java
package demo;
public class DI2 {
String dbName,userName,pwd;
public DI2(String a1,String a2,String a3) {
this.dbName=a1;
this.userName=a2;
this.pwd=a3;
}
@Override
public String toString() {
System.out.println(dbName+","+userName+","+pwd);
return "";
}
}
- (2)配置文件spring.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="di2" class="demo.DI2">
<constructor-arg value="mybatis"/>
<constructor-arg value="root"/>
<constructor-arg value="1234"/>
</bean>
<!-- <bean id="di2" class="demo.DI2">
<constructor-arg index="1" value="mybatis"/>
<constructor-arg index="2" value="root"/>
<constructor-arg index="0" value="1234" />
</bean> -->
</beans>
- (3)测试
@Test
public void test() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
DI2 di2= ctx.getBean(DI2.class);
di2.toString();
}
3 综合示例
【描述】
- 使用分层开发模式,实现登录验证,并输入验证结果。
【目的】
- 掌握Spring框架的基本应用,体验Ioc和DI注入对象方式以及Java EE的分层结构。
- 掌握基于Spring框架的基本应用思路。
【步骤】(在上面示例基础上)
3.1 数据访问层
【文件位置】
- dao包
【接口】
package dao;
public interface UserDao {
public boolean login(String username,String pwd);
}
【实现】
package dao;
public class UserDaoImpl implements UserDao {
@Override
public boolean login(String username, String pwd) {
if (username.equals("123") && pwd.equals("123"))
return true;
else
return false;
}
}
3.2 服务层
【文件位置】
- service包
【接口】
package service;
public interface UserService {
public boolean login(String username,String pwd);
}
【实现】
package service;
import dao.UserDao;
public class UserServiceImpl implements UserService {
private UserDao userDao;//接口类型!
@Override
public boolean login(String username, String pwd) {
return userDao.login(username, pwd);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
3.3 配置文件
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="dao.UserDaoImpl" />
<bean id="us" class="service.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
3.4 应用层(测试)
package chap6;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
import service.UserServiceImpl;
public class TestDao {
@Test
public void test0() {
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
UserService us=ctx.getBean(UserServiceImpl.class);
boolean bol=us.login("123", "1213");
System.out.println(bol+"");
}
}