Spring企业级程序设计 • 【第1章 Spring之旅】
全部章节 >>>>
本章目录
1.4 BeanFactory与ApplicationContext的区别
1.1 Spring框架基础
1.1.1 Spring特点及体系结构
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。
Spring的核心是依赖注入、控制反转和面向切面编程。
Spring认为Java EE的开发应该更容易、更简单。
Spring的优势有以下几点:
- 方便解耦,简化开发。
- AOP编程的支持。
- 声明式事务的支持。
- 方便程序的测试。
- 方便集成各种优秀的框架。
- 降低Java EE API的使用难度。
1.1.1 Spring的体系结构
Spring的整个框架按其所属功能可以划分为七个主要组件。

1.1.2 使用Eclipse搭建Spring开发环境
打开Eclipse工具,创建Dynamic Web Project项目

在工程中,引入Spring的核心jar包

创建Spring核心配置文件applicationContext.xml

打开applicationContext.xml文件,引入beans约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!-- 此空白处输入内容 -->
</beans>
1.1.3 简单的Spring依赖注入
在没有Spring框架之前,Java应用程序都是由多个类组成,它们之间相互协作来完成特定的业务逻辑。每个对象之间相互联系,导致了高度耦合的代码,不便于维护。而Spring框架的依赖注入使代码解耦合,便于维护。
在applicationContext.xml文件中使用bean元素注入对象:
在com.mhys.bean包下,创建一个Student.java类
public class Student {
private String stuId;
private String name;
// set()方法和get()方法省略
}
在applicationContext.xml文件中,注册Student类 在com.mhys.test包下,编写测试类,在控制台输出结果。
// 获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取配置中Student实例
Student student = (Student) context.getBean("student");
// 输出结果
System.out.println(student);
运行程序,在控制台中,查看输出结果
<!-- id:代表实例化名 class:选择要实例化的类 -->
<bean id="student" class="com.mhys.bean.Student"></bean>

1.1.4 set注入
Spring框架提供了4种常用的注入方式,set注入、构造方法注入、p命名空间注入以及表达式spel方式注入,本节只讲解set注入的实现方法,其他注入方式后续会陆续讲到。
在applicationContext.xml配置文件中,不仅能完成对象的初始化。还可以动态配置属性信息,这也是Spring功能强大之所在。
该案例讲解的是通过set注入方式,使用property元素对类属性实现静态注入。
示例:在applicationContext.xml文件中使用bean元素注入对象
在Student类中注入name属性的属性值。
<bean id="student" class="com.mhys.bean.Student">
<!-- name:属性名 value:属性值 -->
<property name="name" value="Jack"></property>
</bean>
在测试类中调用getName()方法。
System.out.println(student.getName());
在控制台中,查看输出结果。

1.1.5 ref属性的作用及使用
有时在类与类之间存在依赖关系。例如,在一个类中对另一个类的引用。
Employee类引入Car类
public class Car {
private String brand;
private String carNo;
// set()方法和get()方法省略
}
public class Employee {
private String name;
private Car car;
// set()方法和get()方法省略
}
示例:在applicationContext.xml文件中使用bean元素注入对象
在com.mhys.bean包下,创建Phone类,并添加call()方法。
public class Phone {
private String message;
public void call(){
System.out.println(message);
}
// set()方法和get()方法省略
}
修改Student类,添加对Phone的依赖。
public class Student {
private String stuId;
private String name;
private Phone phone;
// set()方法和get()方法省略
}
在applicationContext.xml配置文件中,注册Phone类到容器,并在Student Bean中使用ref属性引用Phone Bean。
<bean id="phone" class="com.mhys.bean.Phone">
<property name="message" value="Good morning,Jack"></property>
</bean>
<bean id="student" class="com.mhys.bean.Student">
<property name="phone" ref="phone"></property>
</bean>
在TestMain测试类中,调用call()方法
System.out.println(student.getPhone().call());
在控制台中,查看输出结果

1.1.6 实践练习
1.2 通过工厂方式创建Bean对象
在Spring框架中,对Bean的创建方式有三种方式
- 静态工厂方法创建Bean
- 实例工厂方法创建Bean
- 构造方法创建Bean
通过简单的配置来完成Bean对象的实例化,其本质上是通过构造方法创建Bean实例,接下来学习使用静态、动态创建Bean对象的两种方法。
1.2.1 静态工厂创建Bean对象
示例:在applicationContext.xml文件中使用bean元素注入对象
在com.mhys.bean包下,创建User类,添加userName和password属性。
public class User {
private String userName;
private String password;
// set()和get()方法省略
}
在com.mhys.bean包下,创建UserFactory类,声明getInstance()方法。
public class UserFactory {
public static User getInstance(){
System.out.println("静态工厂方法创建对象!");
return new User();
}
}
在applicationContext.xml配置文件中,注册UserFactory类到容器。
<!-- 定义User Bean 由UserFactory工厂的getInstance()方法创建 -->
<bean id="user" class="com.mhys.bean.UserFactory" factory-method="getInstance"></bean>
在com.mhys.test包下,创建测试类 在控制台中,查看输出结果
public class Test {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}

示例:在applicationContext.xml文件中使用bean元素注入对象
在UserFactory类,增加getUser()方法。
public User getUser(){
System.out.println("动态工厂方法创建对象!");
return new User();
}
在applicationContext.xml配置文件中,注入UserFactory类。
<!-- 配置工厂Bean -->
<bean id="userFactory" class="com.mhys.bean.UserFactory"></bean>
<!-- 声明由实例工厂userFactory的getUser()方法,创建User Bean对象-->
<bean id="user1" factory-bean="userFactory" factory-method="getUser" ></bean>
编写测试类。 在控制台中,查看输出结果
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User) context.getBean("user1");
System.out.println(user1);
}
}

1.2.3 实践练习
1.3 Spring属性注入
在Spring框架中,属性的注入我们有多种方式,前面我们学过使用set方式注入,接下来我们学习构造方法注入属性、p命名空间注入属性和spel方式注入属性这三种属性注入方式。
1.3.1 构造方法注入属性
示例:使用constructor-arg元素来完成构造方法属性注入
在com.mhys.bean包下创建User类添加username和password属性并添加有参构造方法。
public class User {
private String username;
private String password;
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
// 有参构造方法
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
// set()方法和get()方法省略
}
在applicationContext.xml配置文件中,注册User类到容器。
<bean id="user" class="com.mhys.bean.User">
<!-- 构造方法注入属性 -->
<constructor-arg name="username" value="刘强"></constructor-arg>
<constructor-arg name="password" value="1q2w3e"></constructor-arg>
</bean>
在com.mhys.test包下,创建测试类 在控制台中,查看输出结果
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}

1.3.2 p命名空间注入属性
示例:在applicationContext.xml配置文件中,通过p:属性名=属性值方式注入属性
在com.mhys.bean包下,创建Car类,首先,添加brand和carNo两个属性。
public class Car {
private String brand;
private String carNo;
@Override
public String toString() {
return "Car [brand=" + brand + ", carNo=" + carNo + "]";
}
// set()方法和get()方法省略
}
在User类中,新增Car类型属性。
public class User {
private String username;
private String password;
private Car car;
@Override
public String toString() {
return "User [username=" + username + ", password=" + password+ ", car=" + car + "]";
}
// set()方法和get()方法省略
}
在applicationContext.xml配置文件中,注册User类和Car类到容器。
<!-- p命名空间注入属性值 -->
<bean id="car" class="com.mhys.bean.Car" p:brand="奔驰" p:carNo="D4562"></bean>
<bean id="user" class="com.mhys.bean.User" p:username="李瑞" p:password="asd123" p:car-ref="car">
</bean>
编写测试类。 在控制台中,查看输出结果。
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
System.out.println(user);
}
}
p命名空间注入属性之前需要引入对应约束,xmlns:p="http://www.springframework.org/schema/p",p命名空间没有对应的Schema文件。

1.3.3 表达式spel方式注入属性
示例:在applicationContext.xml配置文件中,注册User和Car类到容器
在com.mhys.bean包下,创建Car类,首先,添加brand和carNo两个属性。
<bean id="car" class="com.mhys.bean.Car">
<!-- 表达式spel方式注入属性 -->
<property name="brand" value="#{'宝马'}"></property>
<property name="carNo" value="#{'A2496'}"></property>
</bean>
<bean id="user" class="com.mhys.bean.User">
<property name="username" value="#{'杨强'}"></property>
<property name="password" value="#{'zxc456'}"></property>
<property name="car" ref="car"></property>
</bean>
在控制台中,查看输出结果。

1.3.4 实践练习
1.4 BeanFactory与ApplicationContext的区别
BeanFactory和AppliactionContext创建Spring容器的区别主要体现在Bean创建时间的不同
ApplicationContext采用的是创建上下文的方式创建Spring容器
Bean是在创建容器时即被加载。BeanFactory采用的是延时加载,即容器需要Bean的时候才加载实例。
1.4.1 BeanFactory接口
BeanFactory是IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对Bean的创建和访问等工作。

XmlBeanFactory的演示案例:
编写测试类。
public class Test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
User user = (User) beanFactory.getBean("user");
System.out.println(user);
}
}
在控制台中,查看输出结果

1.4.2 ApplicationContext接口
ApplicationContext即应用上下文,它是建立在BeanFactory基础之上的。

ApplicationContext有四个主要的实现类:
- ClassPathXmlApplicationContext:默认从类路径(classes目录下)加载配置文件。
- FileSystemXmlApplicationContext:默认从文件系统中加载配置文件。
- XmlWebApplicationContext
- AnnotationConfigWebApplicationContext。
XmlWebApplicationContext与AnnotationConfigWebApplicationContext是专门为Web应用提供的。
示例:通过FileSystemXmlApplicationContext获取上下文容器对象
在com.mhys.pojo包下,创建Book类,首先,添加bookName和pages两个属性。
public class Book {
private String bookName; // 书名
private int pages; // 页数
// set()方法和get()方法省略
}
在applicationContext.xml配置文件中,注入Book类。
<!-- p命名空间注入属性 -->
<bean id="book" class="com.mhys.pojo.Book" p:bookName="西游记" p:pages="360">
</bean>
在com.mhys.test包下,编写测试类。 在控制台中,查看输出结果。
public class Test {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
Book book = (Book) context.getBean("book");
System.out.println(book.getBookName() + "总共" + book.getPages() + "页");
}
}
1.4.3 实践练习
总结
- Spring是一个轻量级的IoC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。
- IoC就是控制反转,是指创建对象的控制权的转移
- BeanFactory和AppliactionContext创建Spring容器的区别主要体现在Bean创建时间的不同,ApplicationContext采用的是创建上下文的方式创建Spring容器,Bean是在创建容器时即被加载。BeanFactory采用的是延时加载,即容器需要Bean的时候才加载实例。
Spring企业级程序设计 • 【第1章 Spring之旅】的更多相关文章
- Spring企业级程序设计作业目录(作业笔记)
Spring企业级程序设计 • [目录] 第1章 Spring之旅 >>> 1.1.6 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打 ...
- Spring企业级程序设计 • 【目录】
章节 内容 实践练习 Spring企业级程序设计目录(作业笔记) 第1章 Spring企业级程序设计 • [第1章 Spring之旅] 第2章 Spring企业级程序设计 • [第2章 Spring ...
- Spring企业级程序设计 • 【第7章 Spring框架整合】
全部章节 >>>> 本章目录 7.1 模型数据解析及控制器返回值 7.1.1 SSM框架环境搭建 7.1.1 ModelAndView多种用法 7.1.2 整合MyBati ...
- Spring企业级程序设计 • 【第5章 Spring MVC快速入门】
全部章节 >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2 S ...
- Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】
全部章节 >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...
- Spring入门篇——第7章 Spring对AspectJ的支持
第7章 Spring对AspectJ的支持 介绍Spring对AspectJ的支持 7-1 AspectJ介绍及Pointcut注解应用 实例 完成了在xml文件的配置 7-2 Advice定义及实例 ...
- Spring入门篇——第6章 Spring AOP的API介绍
第6章 Spring AOP的API介绍 主要介绍Spring AOP中常用的API. 6-1 Spring AOP API的Pointcut.advice概念及应用 映射方法是sa开头的所有方法 如 ...
- Spring入门篇——第5章 Spring AOP基本概念
第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...
- Spring入门篇——第4章 Spring Bean装配(下)
第4章 Spring Bean装配(下) 介绍Bean的注解实现,Autowired注解说明,基于java的容器注解说明,以及Spring对JSR支持的说明 4-1 Spring Bean装配之Bea ...
随机推荐
- 【Linux】【Services】【SaaS】Spinnaker
1. 简介 1.1. 说明: Spinnaker 是 Netflix 的开源项目,是一个持续交付平台,它定位于将产品快速且持续的部署到多种云平台上.Spinnaker 通过将发布和各个云平台解耦,来将 ...
- Oracle decode和case的区别
case在SQL中有两种写法,先建立一个表create table salgrade(grade int, sal int);insert into salgrade values(1,1000);i ...
- RHEL 6.5安装系统
转自如下链接: http://www.jb51.net/os/128752.html
- 【Linux】【Shell】【Basic】条件测试和变量
bash脚本编程 脚本文件格式: 第一行,顶格:#!/bin/bash 注释信息:# 代码注释: 缩进,适度添加空白行: ...
- request.getRequestDispatcher()和response.sendRedirect()区别
一.request.getRequestDispatcher().forward(request,response): 1.属于转发,也是服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标 ...
- 如何利用EL表达式获取list,map,对象等值
<%@ page import="com.hopetesting.domain.User" %><%@ page import="java.util.* ...
- 【Office】【Excel】将多个工作薄合为一个工作薄
前提:工作薄首行不能有合并的单元格 准备工作:将要合并的工作簿放在一个文件夹里面,文件夹中不能有乱七八糟的东西,只能有你要合并的工作薄 操作步骤:在此文件夹下创建Excel表格并打开,按下alt+F1 ...
- Linux内核启动流程(简介)
1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...
- 攻击科普:DDos
目录 一.DDoS 攻击究竟是什么? 二.DDoS 攻击多少G是什么意思? 二.DDoS攻击种类 ICMP Flood UDP Flood NTP Flood SYN Flood CC攻击 DNS Q ...
- aha
欢迎使用 MWeb MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件,目前已支持 Mac,iPad 和 iPhone.MWeb 有以下特色: 软件本身: 使用原生的 macOS 技 ...